Mysql在線回收undo表空間實(shí)戰(zhàn)記錄
1 Mysql5.6
1.1 相關(guān)參數(shù)
MySQL 5.6增加了參數(shù)innodb_undo_directory、innodb_undo_logs和innodb_undo_tablespaces這3個(gè)參數(shù),可以把undo log從ibdata1移出來單獨(dú)存放。
- innodb_undo_directory:指定單獨(dú)存放undo表空間的目錄,默認(rèn)為.(即datadir),可以設(shè)置相對(duì)路徑或者絕對(duì)路徑。該參數(shù)實(shí)例初始化之后雖然不可直接改動(dòng),但是可以通過先停庫,修改配置文件,然后移動(dòng)undo表空間文件的方式去修改該參數(shù)。
默認(rèn)參數(shù):
mysql> show variables like '%undo%'; +-------------------------+-------+ | Variable_name | Value | +-------------------------+-------+ | innodb_undo_directory | . | | innodb_undo_logs | 128 | | innodb_undo_tablespaces | 0 | +-------------------------+-------+
- innodb_undo_tablespaces:指定單獨(dú)存放的undo表空間個(gè)數(shù),例如如果設(shè)置為3,則undo表空間為undo001、undo002、undo003,每個(gè)文件初始大小默認(rèn)為10M。該參數(shù)我們推薦設(shè)置為大于等于3,原因下文將解釋。該參數(shù)實(shí)例初始化之后不可改動(dòng)
實(shí)例初始化是修改innodb_undo_tablespaces:
mysql_install_db ...... --innodb_undo_tablespaces $ ls ... undo001 undo002 undo003
- innodb_rollback_segments:默認(rèn)128個(gè)。每個(gè)回滾段可同時(shí)支持1024個(gè)在線事務(wù)。這些回滾段會(huì)平均分布到各個(gè)undo表空間中。該變量可以動(dòng)態(tài)調(diào)整,但是物理上的回滾段不會(huì)減少,只是會(huì)控制用到的回滾段的個(gè)數(shù)。
1.2 使用
初始化實(shí)例之前,我們只需要設(shè)置innodb_undo_tablespaces參數(shù)(建議大于等于3)即可將undo log設(shè)置到單獨(dú)的undo表空間中。如果需要將undo log放到更快的設(shè)備上時(shí),可以設(shè)置innodb_undo_directory參數(shù),但是一般我們不這么做,因?yàn)楝F(xiàn)在SSD非常普及。innodb_undo_logs可以默認(rèn)為128不變。
undo log可以存儲(chǔ)于ibdata之外。但這個(gè)特性依然雞肋:
- 首先你必須在install實(shí)例的時(shí)候就指定好獨(dú)立Undo tablespace, 在install完成后不可更改。
- Undo tablepsace的space id必須從1開始,無法增加或者刪除undo tablespace。
1.3 大事務(wù)測(cè)試
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:最少有兩個(gè),這樣一個(gè)在清理的時(shí)候可以使用另一個(gè),該參數(shù)實(shí)例初始化之后不可改動(dòng)
- innodb_rollback_segments:回滾段的個(gè)數(shù),總會(huì)有一個(gè)回滾段分配給系統(tǒng)表空間,32個(gè)保留給臨時(shí)表空間。所以如果想使用undo表空間的話,這個(gè)值要至少為33。例如使用兩個(gè)undo表空間,這個(gè)值就配35。如果設(shè)置多個(gè)undo表空間,系統(tǒng)表空間中的回滾段會(huì)變成非活躍狀態(tài)。
啟動(dòng)參數(shù):
- innodb_undo_log_truncate=on
- innodb_max_undo_log_size:超過這個(gè)值的表空間會(huì)標(biāo)記為truncate,動(dòng)態(tài)參數(shù)默認(rèn)是1G
- innodb_purge_rseg_truncate_frequency:指定purge操作被喚起多少次之后才釋放rollback segments。當(dāng)undo表空間里面的rollback segments被釋放時(shí),undo表空間才會(huì)被truncate。由此可見,該參數(shù)越小,undo表空間被嘗試truncate的頻率越高。
2.2 清理過程
- undo表空間大小超過innodb_max_undo_log_size后,標(biāo)記該表空間需要清理。標(biāo)記會(huì)循環(huán)進(jìn)行,避免一個(gè)表空間被反復(fù)清理。
- 標(biāo)記表空間內(nèi)的回滾段變?yōu)榉腔钴S狀態(tài),正在運(yùn)行的事務(wù)等待執(zhí)行完。
- 開始purge
- 釋放undo表空間中的所有回滾段后,運(yùn)行truncate并將undo表空間截?cái)酁槠涑跏即笮?,初始大小由innodb_page_size決定,默認(rèn)16KB的大小對(duì)應(yīng)表空間為10MB
- 重新激活回滾段,以便將它們分配給新事務(wù)
2.3 性能建議
truncate表空間時(shí)避免影響性能的最簡(jiǎn)單方法是增加撤消表空間的數(shù)量
2.4 大事務(wù)測(cè)試
配置8個(gè)undo表空間,innodb_purge_rseg_truncate_frequency=10
mysqld --initialize ... --innodb_undo_tablespaces=8
開始測(cè)試
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
3 Reference
https://dev.mysql.com/doc/ref...
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
CentOS 7 下使用yum安裝MySQL5.7.20 最簡(jiǎn)單方法
這篇文章主要介紹了CentOS 7 下使用yum安裝MySQL5.7.20 最簡(jiǎn)單 方法,需要的朋友可以參考下2018-11-11
解決MySQL數(shù)據(jù)庫鏈接超時(shí)報(bào)1129錯(cuò)誤問題
MySQL?為了數(shù)據(jù)庫的安全性默認(rèn)在鏈接中斷或者錯(cuò)誤時(shí)記錄錯(cuò)誤鏈接的ip?等信息(host_cache),有點(diǎn)像系統(tǒng)的錯(cuò)誤日志的一種機(jī)制,這篇文章主要介紹了MySQL數(shù)據(jù)庫鏈接超時(shí)報(bào)1129錯(cuò)誤解決辦法,需要的朋友可以參考下2022-10-10
Mysql主鍵和唯一鍵的區(qū)別點(diǎn)總結(jié)
在本篇文章中小編給大家分享了關(guān)于Mysql主鍵和唯一鍵的區(qū)別,有興趣的朋友們學(xué)習(xí)下吧。2019-02-02
MySQL數(shù)據(jù)庫優(yōu)化之分表分庫操作實(shí)例詳解
這篇文章主要介紹了MySQL數(shù)據(jù)庫優(yōu)化之分表分庫操作,結(jié)合實(shí)例形式詳細(xì)分析了mysql數(shù)據(jù)庫分表分庫垂直拆分、水平拆分相關(guān)原理以及應(yīng)用案例,需要的朋友可以參考下2020-01-01
Linux服務(wù)器中MySQL遠(yuǎn)程連接的開啟方法
今天在Linux服務(wù)器上安裝了msyql數(shù)據(jù)庫,在本地訪問的時(shí)候可以訪問,但是我想通過遠(yuǎn)程的方式訪問的時(shí)候就不能訪問了,查詢資料后發(fā)現(xiàn),Linux下MySQL默認(rèn)安裝完成后只有本地訪問的權(quán)限,沒有遠(yuǎn)程訪問的權(quán)限,需要你給指定用戶設(shè)置訪問權(quán)限才能遠(yuǎn)程訪問該數(shù)據(jù)庫2017-06-06

