日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间

發(fā)布時間:2025/5/22 数据库 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 MySQL内核月报 2014.11-MySQL· 5.7特性·在线Truncate undo log 表空间 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

背景

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如下:

InnoDB: You can now truncate undo logs that reside in undo tablespaces. This feature is enabled using the innodb_undo_log_truncate configuration option. For more information, see Truncating Undo Logs That Reside in Undo Tablespaces.

在能夠使用該特性之前,需要先打開獨(dú)立undo表空間,注意現(xiàn)在只能在install db的時候才能開啟,因為在初始化階段是寫死占用了最小的幾個space id的。這種實現(xiàn)方式。。。只能無限吐槽了。

有幾個參數(shù)控制undo tablespace:

innodb_undo_directory:undo文件的存儲目錄。
innodb_undo_tablespaces:undo tablespace的個數(shù),實現(xiàn)在線truncate undo,需要大于等于2,因為在truncate一個undo log文件時,要保證另外一個是可用的,這樣就無需停止業(yè)務(wù)了。
innodb_undo_logs:undo回滾段的數(shù)量需要大于34。原因是1~32個回滾段會被臨時表占用(5.7針對臨時表做了大量優(yōu)化),第33、34分配給undospace1 和undospace2。

這里有個比較有意思的問題,由于undo 回滾段總是從第一個undospace分配,如果每次從1開始,每次重啟遞增innodb_undo_logs,所有的回滾段都會被分配到第一個undo space,在truncate第一個undo space時,將無可用的undo回滾分配給正常的用戶事務(wù)。

innodb_purge_rseg_truncate_frequency:用于控制purge回滾段的頻度。 Innodb Purge操作的協(xié)調(diào)線程每隔這么多次purge事務(wù)分發(fā)后,就會觸發(fā)一次History purge,并檢查當(dāng)前的undo log 表空間狀態(tài)是否會觸發(fā)truncate。
innodb_max_undo_log_size:控制最大undo tablespace文件的大小,超過這個閥值時才會去嘗試truncate。truncate后的大小默認(rèn)為10M。
innodb_undo_log_truncate:用于打開/關(guān)閉undo log 在線truncate特性,可動態(tài)調(diào)整。


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)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。