MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间
背景
Innodb使用undo log來實現(xiàn)MVCC,這意味著如果一個很老的事務(wù)長時間不提交,那么新產(chǎn)生的undo log都無法被及時清理掉。在MySQL 5.5及之前版本中,undo log是存儲在ibdata中。從5.6開始可以使用獨(dú)立的undo log表空間來存儲undo。但是直到5.6,一旦undo log膨脹,依然沒有任何辦法為其 “減肥”。因此我們經(jīng)常看到ibdata被膨脹到幾十上百G。
改進(jìn)
在MySQL5.7.5版本中終于增加了這個眾望所歸的功能,實現(xiàn)了在線truncate undo log的功能。對應(yīng)的changeling entry如下:
在能夠使用該特性之前,需要先打開獨(dú)立undo表空間,注意現(xiàn)在只能在install db的時候才能開啟,因為在初始化階段是寫死占用了最小的幾個space id的。這種實現(xiàn)方式。。。只能無限吐槽了。
有幾個參數(shù)控制undo tablespace:
這里有個比較有意思的問題,由于undo 回滾段總是從第一個undospace分配,如果每次從1開始,每次重啟遞增innodb_undo_logs,所有的回滾段都會被分配到第一個undo space,在truncate第一個undo space時,將無可用的undo回滾分配給正常的用戶事務(wù)。
undo log 的truncate操作由purge 協(xié)調(diào)線程發(fā)起,在truncate 某個undo log 表空間的過程中,保證有一個可用的undo log tablespace能提供給用戶使用,從而實現(xiàn)所謂的在線truncate。
當(dāng)選定一個需要truncate的undo log space時,需要檢查其是否是可釋放的,也就是說是否還有活躍的事務(wù)可能訪問其中的回滾段。如果沒有,就將該tablespace中的回滾段設(shè)置為不可分配,然后對undo log space文件進(jìn)行truncate,并重新初始化到10M,初始化文件頭等一系列操作。
這里引入了比較有意思的方法來保證truncate的原子性,即在開始truncate時,創(chuàng)建一個獨(dú)立的文件,命名為undo_<space_id>_trunc.log,在做完truncate操作后,刪除文件。如果在中間發(fā)生crash,崩潰恢復(fù)時發(fā)現(xiàn)該文件,會繼續(xù)完成truncate操作。
更具體的參考WL#6965?及對應(yīng)補(bǔ)丁Rev:8615
總結(jié)
以上是生活随笔為你收集整理的MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java多维数组使用注意事项
- 下一篇: MySQL · 引擎特性 · InnoD