共計 3155 個字符,預計需要花費 8 分鐘才能閱讀完成。
這篇文章主要講解了“MySQL 大表刪除問題的解決方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著丸趣 TV 小編的思路慢慢深入,一起來研究和學習“MySQL 大表刪除問題的解決方法”吧!
一、表刪除問題匯總
(1)、mysql 如何刪除表
(2)、刪除大表如何優化、解決
二、刪除表原理與優化
刪除表原理上分為 2 部分:
1 buffer pool 頁面清除過程。
在刪除表的時候,Innodb 會將文件在 buffer pool 中對應的頁面清除。對于刪除表的頁面清除,只需要將頁面從 flash 隊列中刪除即可,而不需要去做 flush 操作,減小對系統的沖擊。
問題 1:如果 buffer pool 很大,或者是在 buffer pool 中有很多需要被 flush 的頁面,那么此時遍歷掃描頁面時就會占用比較長的時間,導致其他事務在用到相應 buffer pool 實例時被阻塞,從而影響整個數據庫性能。
優化:涉及源碼,優化困難
2 刪除 ibd 磁盤文件的過程。
問題 1:表文件過大,直接刪除會瞬時占用大量 IO,造成 IO 阻塞
優化:使用硬鏈
原理:一個磁盤上的文件,可以由多個文件系統的文件引用,這多個文件的完全相同的,都指向同一個磁盤上的文件,當我們刪除任何一個文件的時候,都不會影響真實的文件,只是會將其引用數據減 1,只有當被引用數目變為 1 的時候,再次刪除文件,才會真正被刪除。刪除時,這兩種情況的區別很明顯,一個是在減少被引用數目,一個是真正做 IO 來刪除它
操作:
ln /data/mydata/my3306/testdb/table1.ibd /data/mydata/my3306/testdb/table1.ibd.hdlk
ls -lh /data/mydata/my3306/testdb 查看文件引用數 (應該為 2)
問題 2:做完硬鏈,真正的大文件刪除問題,直接 rm 刪除,會造成 IO 瞬時高峰
優化:使用工具,多次少量的刪除
原理:利用系統文件的 truncate,腳本工具為 slowrm
三、slowrm3.1、需求
緩解大表刪除帶來的 IO 瞬間壓力
3.2、slowrm 功能
1 將大文件按照指定速度進行刪除,降低 IO 瞬間壓力
3.3、slowrm 實現
3.3.1、背景描述
先簡要介紹下 slowrm 工具開發的背景。
我們曾在《linux_mysql_DROP_TABLE 操作步驟》中提到,對于大表的刪除,應當先建立硬鏈,drop table 后,再刪除表數據文件。
對于大表的數據文件,可能會達到 10G,也可以是 100G 級別,甚至更大。在 linux 下,這樣的大文件在使用 rm 時,無疑會導致 IO 資源被強行占用,表現為硬盤的 io_util 基本上是 100% 左右,會對其它 IO 操作造成阻塞。更可怕的是,rm 單個文件的過程是個原子過程,無法使用 kill 或 kill - 9 來殺死 rm 進程,只能乖乖的等待它結束。
如果是在繁忙的線上服務所在的機器上做這樣的刪除操作,很可能會對線上服務產生影響。因此需要有一個平滑刪除大文件的方案。而這樣的方案最終是與數據庫無關的,而是一個通用方案。
3.3.2、設計思路
對于刪除大文件的操作,采用每次將文件截斷一點,分多次截斷,最終直至文件大小被截斷為 0。
如下面的過程示例:
block_size = 1024576bytes;
while file_size =block_size
begin
ftruncate (file, new_size);
(其中 (old_size -new_size = block_size)
sleep 0.05 seconds;
end
ftruncate(file, 0);
因為既然 rm 一個文件是不可中斷的,那么我們就將刪除過程打散,分多次刪除一個,每次刪除一點。幸好現在的 linux 提供了支持該思路的 API,truncate/ftruncate 函數,可以對文件截斷至任意長度 ()。經過測試,發現每次截斷一點,分多次截斷,最終直至文件大小被截斷為 0,這樣刪除大文件需要更多的時間,但是對磁盤 IO 的影響卻大大減小了。因此采用該思路是可行的。
3.4、slowrm 使用
slowrm [OPTIONS] FILES
對刪除文件的方式與 rm 類似。
3.4.1、選項及參數
該工具的使用主要涉及兩個參數:
-b #size
每次需要截斷掉的文件大小,單位為字節,參數值需要是整數,默認值 4096 * 256Bytes( = 1MB);
-s #seconds
每兩次截斷操作之間的時間間隔,單位為秒,參數值可以為小數。這兩個參數用以控制刪除速度,及刪除過程對磁盤 IO 的壓力。默認值 0.1 second
-h, –help
查看幫助信息。
直接輸入 slowrm,或輸入 slowrm –h 或 slowrm –help 可以查看幫助。
3.4.2、刪除速度
實際上,可以看出,由 #size * #seconds = #ioBPS Bytes/s,
即可計算得出每秒該操作消耗的 IO 吞吐量 (字節數),也即大約每秒文件所減小的字節數。
可以看到默認刪除速度是: 4096 * 256Bytes / 0.1second= 10MB/s,被刪除的文件每秒鐘可以減少 10MB。
用戶可以通過上述兩個參數來控制刪除的速度以及對磁盤 IO 的壓力。
3.5、slowrm 與 rm 對比
使用方式
slowrm rm 備注
提示是否刪除
默認支持
rm -i
默認 slowrm 會詢問用戶是否刪除每一個指定文件 刪除單個文件
slowrm file
rm file
相同 刪除多個文件
顯示指定文件
slowrm file1 file2 file3
rm file1 file2 file3
使用通配符
slowrm file*
rm file*
刪除硬鏈
硬鏈數大于 1
刪除硬鏈同 rm
刪除硬鏈
實際執行的就是 unlink
硬鏈數等于 1
低速刪除文件
全速刪除文件
實質上在判斷硬鏈數上邏輯是一樣的,只是最后一個硬鏈的刪除方式不同 強制刪除文件
slowrm -f
slowrm –force
rm -f
rm –force
相同 控制刪除速度
控制速度
slowrm -s 0.1 -b 262144 file (2MB/s)
不支持
默認速度
slowrm file
對應參數 -s 0.1 -b 1048576(10MB/s)
一般使用默認參數即可 刪除其他類型文件
目錄,軟鏈
不支持
遞歸刪除目錄
rm -rf 目錄
可見,一般情況下,還是使用 rm 刪除即可。
在需要低 IO 負載刪除大文件時,可以使用 slowrm。
slowrm 對于 rm 是起到一個補充的作用。
3.6、注意
3.6.1、刪除文件類型
目前,該工具只支持刪除具體常規文件,無法對目錄進行遞歸刪除,但可以支持對多個文件進行刪除,如 slowrm *.logmysql.err.2014*
也無法對軟鏈接,文件等進行刪除。
3.6.2、硬鏈的刪除
如果 slowrm 要刪除的文件的硬鏈接數目大于 1,那么就會直接刪除該硬鏈;
如果待刪除的文件硬鏈數目等于 1,那么會按照平滑刪除的方式,逐步截斷該文件。
3.7、測試使用
制造大文件
開始刪除
大小情況
壓力情況
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
3.8、日常使用
1、開啟一個 screen
screen -S slowrm_test
2、開始刪除文件
slowrm file
或者指定速度,正常默認即可 (10MB/s)
感謝各位的閱讀,以上就是“MySQL 大表刪除問題的解決方法”的內容了,經過本文的學習后,相信大家對 MySQL 大表刪除問題的解決方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是丸趣 TV,丸趣 TV 小編將為大家推送更多相關知識點的文章,歡迎關注!