MySQL innodb_undo_tablespaces相關參數
- 2019 年 10 月 5 日
- 筆記
摘錄自:http://gfsunny.blog.51cto.com/990565/1566683
undo log(回滾): 服務器異常關機或斷電重啟後,MySQL會對修改過,但尚未提交的事務進行回滾。
在MySQL5.6中開始支持把undo log分離到獨立的表空間,並放到單獨的文件目錄下。這給部署不同IO類型的文件位置帶來便利,對於並發寫入型負載,可以把undo文件部署到單獨的高速SSD存儲設備上。
undo tablespaces相關參數
參數 |
含義 |
---|---|
innodb_undo_directory[=/opt/mysql/undo] |
Innodb為還原日誌創建的獨立表空間的相對或絕對路徑。通常用於日誌被放置在哪些不同的存儲設備上。配合參數innodb_undo_logs和innodb_undo_tablespaces,這決定了系統表空間外還原日誌的磁盤分佈。默認目錄為innodb默認創建它的其他日誌文件的目錄。如果想轉移undo文件的位置,只需要修改下該配置,並將undo文件拷貝過去就可以了。【支持後期修改】 |
innodb_undo_logs[=128] |
定義在一個事務中innodb使用的系統表空間中回滾段的個數。如果觀察到同回滾日誌有關的互斥爭用,可以調整這個參數以優化性能。早期版本的命名為innodb_rollback_segments,該變量可以動態調整,但是物理上的回滾段不會減少,只是會控制用到的回滾段的個數;默認為128個回滾段【手冊上最大就是128】【支持後期修改】 |
innodb_undo_tablespaces[=4] |
用於設定創建的undo表空間的個數,在mysql_install_db時初始化後,就再也不能被改動了,修改該值會導致MySQL無法啟動。默認值為0,表示不獨立設置undo的tablespace,默認記錄到ibdata中;否則,則在undo目錄下創建這麼多個undo文件(每個文件的默認大小為10M)。最多可以設置到126。例如假定設置該值為4,那麼就會在mysql的data目錄下創建命名為undo001~undo004的undo tablespace文件。【不支持後期修改】 |
undo 回滾段初始化
如果是正常shutdown重啟,並且設置的回滾段個數大於目前已經使用的回滾段個數(trx_sysf_rseg_find_free),就會去新建回滾段(trx_rseg_create)
這裡總是從第一個undologtablespace開始初始化回滾段,看起來似乎有些問題,極端情況下,如果我每次重啟遞增innodb_undo_logs,是不是意味着所有的undo回滾段都會寫入到第一個undo tablespace中?
完成初始化後,將當前可用的undo回滾段的個數複製給srv_available_undo_logs,可以通過show status查看:
mysql> show status like'innodb_available_undo_logs';
+—————————-+——-+
| Variable_name | Value |
+—————————-+——-+
| Innodb_available_undo_logs | 128 |
+—————————-+——-+
1 row in set (0.02 sec)
啟動後,innodb_undo_logs是可以動態調整的,但最大不可以超過Innodb_available_undo_logs
在一個非只讀的事務開啟時,會為其分配回滾段(trx_assign_rseg_low),動態的調整innodb_undo_logs可以限定分配的回滾段範圍;
當有長時間運行的事務時,可能導致purge操作來不及回收undo空間,進而導致undo空間急劇膨脹;理論上講,如果做一次乾淨的shutdown,應該可以安全的將將這些undo文件刪除並重新做一次初始化;也許未來的某個MySQL版本可能實現這個功能,這對於某些服務(比如按磁盤空間收費的雲計算提供商)是非常有必要的功能。
參數設置演示:
# rm -rf /data/3306/data/*
# cd /usr/local/mysql/scripts/
# ./mysql_install_db–basedir=/usr/local/mysql –datadir=/data/3306/data –user=mysql –innodb_undo_tablespaces=4
# /etc/init.d/mysqld_3306start
注意:加了–innodb_undo_tablespaces=4參數初始化後,修改my.cnf,加入innodb_undo的參數,如下3行:
innodb_undo_logs=100
innodb_undo_tablespaces = 4
innodb_undo_directory = /tmp/ # 這裡我是演示起見,隨便設置的一個目錄
啟動mysql,在/tmp/目錄下會生成獨立的undo表空間文件,如下圖:

> show variables like 'innodb_undo%'; 也可以看到修改生效了

MySQL5.6手冊上的截圖如下:


