這期內(nèi)容當中小編將會給大家?guī)碛嘘P(guān)Mysql中怎么實現(xiàn)在線回收undo表空間,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
1 Mysql5.6
1.1 相關(guān)參數(shù)
MySQL 5.6增加了參數(shù)innodb_undo_directory、innodb_undo_logs和innodb_undo_tablespaces這3個參數(shù),可以把undo log從ibdata1移出來單獨存放。
innodb_undo_directory:指定單獨存放undo表空間的目錄,默認為.(即datadir),可以設(shè)置相對路徑或者絕對路徑。該參數(shù)實例初始化之后雖然不可直接改動,但是可以通過先停庫,修改配置文件,然后移動undo表空間文件的方式去修改該參數(shù)。
默認參數(shù):
mysql> show variables like '%undo%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | innodb_undo_directory | . | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 0 | +-------------------------+-------+
innodb_undo_tablespaces:指定單獨存放的undo表空間個數(shù),例如如果設(shè)置為3,則undo表空間為undo001、undo002、undo003,每個文件初始大小默認為10M。該參數(shù)我們推薦設(shè)置為大于等于3,原因下文將解釋。該參數(shù)實例初始化之后不可改動
實例初始化是修改innodb_undo_tablespaces:
mysql_install_db ...... --innodb_undo_tablespaces $ ls ... undo001 undo002 undo003
innodb_rollback_segments:默認128個。每個回滾段可同時支持1024個在線事務(wù)。這些回滾段會平均分布到各個undo表空間中。該變量可以動態(tài)調(diào)整,但是物理上的回滾段不會減少,只是會控制用到的回滾段的個數(shù)。
1.2 使用
初始化實例之前,我們只需要設(shè)置innodb_undo_tablespaces參數(shù)(建議大于等于3)即可將undo log設(shè)置到單獨的undo表空間中。如果需要將undo log放到更快的設(shè)備上時,可以設(shè)置innodb_undo_directory參數(shù),但是一般我們不這么做,因為現(xiàn)在SSD非常普及。innodb_undo_logs可以默認為128不變。
undo log可以存儲于ibdata之外。但這個特性依然雞肋:
首先你必須在install實例的時候就指定好獨立Undo tablespace, 在install完成后不可更改。
Undo tablepsace的space id必須從1開始,無法增加或者刪除undo tablespace。
1.3 大事務(wù)測試
mysql> create table test.tbl( id int primary key auto_increment, name varchar(200)); Query OK, 0 rows affected (0.03 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into test.tbl(name) values(repeat('1',00)); Query OK, 1 row affected (0.00 sec) mysql> insert into test.tbl(name) select name from test.tbl; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 ... mysql> insert into test.tbl(name) select name from test.tbl; Query OK, 2097152 rows affected (24.84 sec) Records: 2097152 Duplicates: 0 Warnings: 0 mysql> commit; Query OK, 0 rows affected (7.90 sec)
觀察undolog已經(jīng)開始膨脹了!事務(wù)commit后空間也沒有回收。
$ du -sh undo* 10M undo001 69M undo002 10M undo003
2 Mysql5.7
5.7引入了在線truncate undo tablespace
2.1 相關(guān)參數(shù)
必要條件:
innodb_undo_tablespaces:最少有兩個,這樣一個在清理的時候可以使用另一個,該參數(shù)實例初始化之后不可改動
innodb_rollback_segments:回滾段的個數(shù),總會有一個回滾段分配給系統(tǒng)表空間,32個保留給臨時表空間。所以如果想使用undo表空間的話,這個值要至少為33。例如使用兩個undo表空間,這個值就配35。如果設(shè)置多個undo表空間,系統(tǒng)表空間中的回滾段會變成非活躍狀態(tài)。
啟動參數(shù):
innodb_undo_log_truncate=on
innodb_max_undo_log_size:超過這個值的表空間會標記為truncate,動態(tài)參數(shù)默認是1G
innodb_purge_rseg_truncate_frequency:指定purge操作被喚起多少次之后才釋放rollback segments。當undo表空間里面的rollback segments被釋放時,undo表空間才會被truncate。由此可見,該參數(shù)越小,undo表空間被嘗試truncate的頻率越高。
2.2 清理過程
undo表空間大小超過innodb_max_undo_log_size后,標記該表空間需要清理。標記會循環(huán)進行,避免一個表空間被反復(fù)清理。
標記表空間內(nèi)的回滾段變?yōu)榉腔钴S狀態(tài),正在運行的事務(wù)等待執(zhí)行完。
開始purge
釋放undo表空間中的所有回滾段后,運行truncate并將undo表空間截斷為其初始大小,初始大小由innodb_page_size決定,默認16KB的大小對應(yīng)表空間為10MB
重新激活回滾段,以便將它們分配給新事務(wù)
2.3 性能建議
truncate表空間時避免影響性能的最簡單方法是增加撤消表空間的數(shù)量
2.4 大事務(wù)測試
配置8個undo表空間,innodb_purge_rseg_truncate_frequency=10
mysqld --initialize ... --innodb_undo_tablespaces=8
開始測試
mysql> show global variables like '%undo%'; +--------------------------+------------+ | Variable_name | Value | +--------------------------+------------+ | innodb_max_undo_log_size | 1073741824 | | innodb_undo_directory | ./ | | innodb_undo_log_truncate | ON | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 8 | +--------------------------+------------+ mysql> select @@innodb_purge_rseg_truncate_frequency; +----------------------------------------+ | @@innodb_purge_rseg_truncate_frequency | +----------------------------------------+ | 10 | +----------------------------------------+ select @@innodb_max_undo_log_size; +----------------------------+ | @@innodb_max_undo_log_size | +----------------------------+ | 10485760 | +----------------------------+ mysql> create table test.tbl( id int primary key auto_increment, name varchar(200)); Query OK, 0 rows affected (0.03 sec) mysql> start transaction; Query OK, 0 rows affected (0.00 sec) mysql> insert into test.tbl(name) values(repeat('1',00)); Query OK, 1 row affected (0.00 sec) mysql> insert into test.tbl(name) select name from test.tbl; Query OK, 1 row affected (0.00 sec) Records: 1 Duplicates: 0 Warnings: 0 ... mysql> insert into test.tbl(name) select name from test.tbl; Query OK, 2097152 rows affected (24.84 sec) Records: 2097152 Duplicates: 0 Warnings: 0 mysql> commit; Query OK, 0 rows affected (7.90 sec)
undo表空間情況,膨脹到100MB+后成功回收
$ du -sh undo*
10M undo001
10M undo002
10M undo003
10M undo004
10M undo005
10M undo006
125M undo007
10M undo008$ du -sh undo*
10M undo001
10M undo002
10M undo003
10M undo004
10M undo005
10M undo006
10M undo007
10M undo008
上述就是小編為大家分享的Mysql中怎么實現(xiàn)在線回收undo表空間了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關(guān)知識,歡迎關(guān)注創(chuàng)新互聯(lián)成都網(wǎng)站設(shè)計公司行業(yè)資訊頻道。
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無理由+7*72小時售后在線,公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國服務(wù)器、虛擬主機、免備案服務(wù)器”等云主機租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡單易用、服務(wù)可用性高、性價比高”等特點與優(yōu)勢,專為企業(yè)上云打造定制,能夠滿足用戶豐富、多元化的應(yīng)用場景需求。
文章名稱:Mysql中怎么實現(xiàn)在線回收undo表空間-創(chuàng)新互聯(lián)
文章路徑:http://www.chinadenli.net/article42/disehc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供建站公司、品牌網(wǎng)站制作、小程序開發(fā)、定制開發(fā)、ChatGPT、網(wǎng)站內(nèi)鏈
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容