一 簡介:undo管理
二 各版本說明
1 5.5
undo位置:默認ibdata1中,不支持獨立表空間
缺點:大事務可能造成ibdata1暴漲,只能dump導出導入或者從新搭建
參數:rollback_segment(默認128個回滾段)
2 5.6
undo位置:默認ibdata1中,支持獨立表空間
參數
innodb_undo_logs(代替5.5的名字,默認128個回滾段)
innodb_undo_directory 設置undo位置,默認當前文件夾
innodb_undo_tablespaces 默認關閉,開啟需要設置為1
缺點:mysql5.6只支持初始化設置獨立表空間,不可中途開啟.而且也不能解決回收undo表空間問題.但是可以支持分布在不同磁盤,用來提高IO能力
建議:不建議5.6開啟獨立undo空間,沒什么意義
3 5.7
undo位置:默認ibdata1中,支持獨立表空間
參數
innodb_max_undo_log_size=1073741824
innodb_undo_directory=./ 獨立undo表空間路徑
innodb_undo_log_truncate=OFF 支持truncate回收表空間,默認關閉
innodb_undo_logs=128 128個回滾段
innodb_undo_tablespaces=0 獨立表空間,默認為0,需要設置>=2
innodb_purge_rseg_truncate_frequency=128 purge undo輪詢128次后,進行一次undo的truncate
4 注意點:
1 mysql5.7同樣是只支持初始化設置,不可中途開啟
2 truncate會進行清理undo文件的條件: 1 觸發 max_undo_log閾值(undo tablespace超過1GB(參數innodb_max_undo_log_size來控制))
2 存在至少一個可用的undo文件
3 被清理對象皆為free,也即為事務不需要
以上三點都達到時候才會觸發truncate進行undo表空間收縮,由purge線程執行
5 注意點
1 mysql為什么不支持中途開啟獨立undo
據我分析和看淘寶周報分析,這與space_id有關,默認ibdata中的space_id=0,一旦中途開啟,獨立undo空間的space_id為1,系統需要為0,
觀察錯誤: Expected to open 1 undo tablespaces but was able to find only 0 undo tablespaces. Set the innodb_undo_tablespaces parameter to the correct value and retry. Suggested value is 0
可以得知 為0
2 盡量避免大事務,將大事務進行拆分
6 8.0的持續改進:
1 默認開啟獨立undo表空間,更改undo表空間命名方式,默認大小為10M
2 在8.0之前只能創建128個回滾段,而在8.0版本開始,每個Undo tablespace可以創建128個回滾段,也就是說,總共有innodb_rollback_segments * innodb_undo_tablespaces個回滾段。這個改變的好處是在高並發下可以顯著的減少因為分配到同一個回滾段內的事務間產生的鎖沖突
3 Innodb_undo_truncate參數默認打開,會自動進行刪除
4 支持undo tablespace加密
5 在8.0中直接在內存中為其創建單獨的內存結構,這32個slot可以用於持久化的undo回滾段
6 允許動態的增加undo tablespace的個數,也就是說可以動態調整innodb_undo_tablespaces。當調大該參數時,會去創建新的undo tablespace。但如果設小該值,則僅僅是不實用多出來的Undo tablespace,目前不會去主動刪除它們