MySQL5.7 可以回收(收縮)undo log回滾日志物理文件空間
undo log回滾日志是保存在共享表空間ibdata1文件里,隨着業務的不停運轉,ibdata1文件會越來越大,想要回收(收縮空間大小)極其困難和復雜, 必須先mysqldump -A全庫的導出,然后刪掉data目錄,然后重新初始化安裝,最后再把全庫的SQL文件導入,采用這種方法進行ibdata1文件的回收。
在MySQL5.6里,可以把undo log回滾日志分離出去,到一個單獨的表空間里,具體請參考: http://hcymysql.blog.51cto.com/5223301/973450 ,但缺點就是不能進行回收(收縮)空間大小。直到MySQL5.7 ,才支持在線收縮。
innodb_undo_log_truncate參數設置為1,即開啟在線回收(收縮)undo log日志文件,支持動態設置。 innodb_undo_tablespaces參數必須大於或等於2,即回收(收縮)一個undo log日志文件時,要保證另一個undo log是可用的。 innodb_undo_logs: undo回滾段的數量, 至少大於等於35,默認128。 innodb_max_undo_log_size:當超過這個閥值(默認是1G),會觸發truncate回收(收縮)動作,truncate后空間縮小到10M。 innodb_purge_rseg_truncate_frequency:控制回收(收縮)undo log的頻率。undo log空間在它的回滾段沒有得到釋放之前不會收縮, 想要增加釋放回滾區間的頻率,就得降低innodb_purge_rseg_truncate_frequency設定值。
驗證過程:
對一張100萬的sbtest表,進行全表更新4次,如:
然后你會發現undo log空間急速增長,如:
然后用sysbench做壓力測試,讓數據庫運行起來,觀察錯誤日志,就會自動把undo log空間給回收(收縮),如:
再通過觀察物理文件,已經被回收了,默認10M大小。
總結:
這個功能出來以后,降低了磁盤空間使用率(當然,土豪隨意),並且加快了xtrabackup熱備份的速度。