您好,登錄后才能下訂單哦!
這篇文章主要講解了“MySQL大表刪除問題的解決方法”,文中的講解內容簡單清晰,易于學習與理解,下面請大家跟著小編的思路慢慢深入,一起來研究和學習“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
緩解大表刪除帶來的IO瞬間壓力
<1>將大文件按照指定速度進行刪除,降低IO瞬間壓力
先簡要介紹下slowrm工具開發的背景。
我們曾在《linux_mysql_DROP_TABLE操作步驟》中提到,對于大表的刪除,應當先建立硬鏈,drop table后,再刪除表數據文件。
對于大表的數據文件,可能會達到10G,也可以是100G級別,甚至更大。在linux下,這樣的大文件在使用rm時,無疑會導致IO資源被強行占用,表現為硬盤的io_util基本上是100%左右,會對其它IO操作造成阻塞。更可怕的是,rm單個文件的過程是個原子過程,無法使用kill或kill -9來殺死rm進程,只能乖乖的等待它結束。
如果是在繁忙的線上服務所在的機器上做這樣的刪除操作,很可能會對線上服務產生影響。因此需要有一個平滑刪除大文件的方案。而這樣的方案最終是與數據庫無關的,而是一個通用方案。
對于刪除大文件的操作,采用每次將文件截斷一點,分多次截斷,最終直至文件大小被截斷為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的影響卻大大減小了。因此采用該思路是可行的。
slowrm [OPTIONS] FILES
對刪除文件的方式與rm類似。
該工具的使用主要涉及兩個參數:
-b #size
每次需要截斷掉的文件大小,單位為字節,參數值需要是整數,默認值4096 * 256Bytes( = 1MB);
-s #seconds
每兩次截斷操作之間的時間間隔,單位為秒,參數值可以為小數。這兩個參數用以控制刪除速度,及刪除過程對磁盤IO的壓力。默認值0.1 second
-h, --help
查看幫助信息。
直接輸入slowrm,或輸入slowrm –h或slowrm --help可以查看幫助。
實際上,可以看出,由#size * #seconds = #ioBPS Bytes/s,
即可計算得出每秒該操作消耗的IO吞吐量(字節數),也即大約每秒文件所減小的字節數。
可以看到默認刪除速度是: 4096 * 256Bytes / 0.1second= 10MB/s,被刪除的文件每秒鐘可以減少10MB。
用戶可以通過上述兩個參數來控制刪除的速度以及對磁盤IO的壓力。
使用方式 | 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是起到一個補充的作用。
目前,該工具只支持刪除具體常規文件,無法對目錄進行遞歸刪除,但可以支持對多個文件進行刪除,如slowrm *.logmysql.err.2014*
也無法對軟鏈接,文件等進行刪除。
如果slowrm要刪除的文件的硬鏈接數目大于1,那么就會直接刪除該硬鏈;
如果待刪除的文件硬鏈數目等于1,那么會按照平滑刪除的方式,逐步截斷該文件。
制造大文件
開始刪除
大小情況
壓力情況
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
1、開啟一個screen
screen -S slowrm_test
2、開始刪除文件
slowrm file
或者指定速度,正常默認即可(10MB/s)
感謝各位的閱讀,以上就是“MySQL大表刪除問題的解決方法”的內容了,經過本文的學習后,相信大家對MySQL大表刪除問題的解決方法這一問題有了更深刻的體會,具體使用情況還需要大家實踐驗證。這里是億速云,小編將為大家推送更多相關知識點的文章,歡迎關注!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。