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手冊上的截圖如下: