這篇文章主要講解了“MySQL大表刪除問題的解決方法”,文中的講解內(nèi)容簡單清晰,易于學(xué)習(xí)與理解,下面請(qǐng)大家跟著小編的思路慢慢深入,一起來研究和學(xué)習(xí)“MySQL大表刪除問題的解決方法”吧!
專注于為中小企業(yè)提供網(wǎng)站設(shè)計(jì)制作、成都網(wǎng)站制作服務(wù),電腦端+手機(jī)端+微信端的三站合一,更高效的管理,為中小企業(yè)尉犁免費(fèi)做網(wǎng)站提供優(yōu)質(zhì)的服務(wù)。我們立足成都,凝聚了一批互聯(lián)網(wǎng)行業(yè)人才,有力地推動(dòng)了上1000家企業(yè)的穩(wěn)健成長,幫助中小企業(yè)通過網(wǎng)站建設(shè)實(shí)現(xiàn)規(guī)模擴(kuò)充和轉(zhuǎn)變。
(1)、mysql如何刪除表
(2)、刪除大表如何優(yōu)化、解決
刪除表原理上分為2部分:
<1>buffer pool頁面清除過程。
在刪除表的時(shí)候,Innodb 會(huì)將文件在buffer pool中對(duì)應(yīng)的頁面清除。對(duì)于刪除表的頁面清除,只需要將頁面從flash隊(duì)列中刪除即可,而不需要去做flush操作,減小對(duì)系統(tǒng)的沖擊。
問題1:如果buffer pool很大,或者是在buffer pool中有很多需要被flush的頁面,那么此時(shí)遍歷掃描頁面時(shí)就會(huì)占用比較長的時(shí)間,導(dǎo)致其他事務(wù)在用到相應(yīng)buffer pool實(shí)例時(shí)被阻塞,從而影響整個(gè)數(shù)據(jù)庫性能。
優(yōu)化:涉及源碼,優(yōu)化困難
<2>刪除ibd磁盤文件的過程。
問題1:表文件過大,直接刪除會(huì)瞬時(shí)占用大量IO,造成IO阻塞
優(yōu)化:使用硬鏈
原理:一個(gè)磁盤上的文件,可以由多個(gè)文件系統(tǒng)的文件引用,這多個(gè)文件的完全相同的,都指向同一個(gè)磁盤上的文件,當(dāng)我們刪除任何一個(gè)文件的時(shí)候,都不會(huì)影響真實(shí)的文件,只是會(huì)將其引用數(shù)據(jù)減1,只有當(dāng)被引用數(shù)目變?yōu)?的時(shí)候,再次刪除文件,才會(huì)真正被刪除。刪除時(shí),這兩種情況的區(qū)別很明顯,一個(gè)是在減少被引用數(shù)目,一個(gè)是真正做IO來刪除它
操作:
ln /data/mydata/my3306/testdb/table1.ibd /data/mydata/my3306/testdb/table1.ibd.hdlk
ls -lh /data/mydata/my3306/testdb 查看文件引用數(shù)(應(yīng)該為2)
問題2:做完硬鏈,真正的大文件刪除問題,直接rm 刪除,會(huì)造成IO瞬時(shí)高峰
優(yōu)化:使用工具,多次少量的刪除
原理:利用系統(tǒng)文件的truncate,腳本工具為slowrm
緩解大表刪除帶來的IO瞬間壓力
<1>將大文件按照指定速度進(jìn)行刪除,降低IO瞬間壓力
先簡要介紹下slowrm工具開發(fā)的背景。
我們?cè)凇秎inux_mysql_DROP_TABLE操作步驟》中提到,對(duì)于大表的刪除,應(yīng)當(dāng)先建立硬鏈,drop table后,再刪除表數(shù)據(jù)文件。
對(duì)于大表的數(shù)據(jù)文件,可能會(huì)達(dá)到10G,也可以是100G級(jí)別,甚至更大。在linux下,這樣的大文件在使用rm時(shí),無疑會(huì)導(dǎo)致IO資源被強(qiáng)行占用,表現(xiàn)為硬盤的io_util基本上是100%左右,會(huì)對(duì)其它IO操作造成阻塞。更可怕的是,rm單個(gè)文件的過程是個(gè)原子過程,無法使用kill或kill -9來殺死rm進(jìn)程,只能乖乖的等待它結(jié)束。
如果是在繁忙的線上服務(wù)所在的機(jī)器上做這樣的刪除操作,很可能會(huì)對(duì)線上服務(wù)產(chǎn)生影響。因此需要有一個(gè)平滑刪除大文件的方案。而這樣的方案最終是與數(shù)據(jù)庫無關(guān)的,而是一個(gè)通用方案。
對(duì)于刪除大文件的操作,采用每次將文件截?cái)嘁稽c(diǎn),分多次截?cái)?,最終直至文件大小被截?cái)酁?。
如下面的過程示例:
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);
因?yàn)榧热籸m一個(gè)文件是不可中斷的,那么我們就將刪除過程打散,分多次刪除一個(gè),每次刪除一點(diǎn)。幸好現(xiàn)在的linux提供了支持該思路的API,truncate/ftruncate函數(shù),可以對(duì)文件截?cái)嘀寥我忾L度()。經(jīng)過測試,發(fā)現(xiàn)每次截?cái)嘁稽c(diǎn),分多次截?cái)?,最終直至文件大小被截?cái)酁?,這樣刪除大文件需要更多的時(shí)間,但是對(duì)磁盤IO的影響卻大大減小了。因此采用該思路是可行的。
slowrm [OPTIONS] FILES
對(duì)刪除文件的方式與rm類似。
該工具的使用主要涉及兩個(gè)參數(shù):
-b #size
每次需要截?cái)嗟舻奈募笮。瑔挝粸樽止?jié),參數(shù)值需要是整數(shù),默認(rèn)值4096 * 256Bytes( = 1MB);
-s #seconds
每兩次截?cái)嗖僮髦g的時(shí)間間隔,單位為秒,參數(shù)值可以為小數(shù)。這兩個(gè)參數(shù)用以控制刪除速度,及刪除過程對(duì)磁盤IO的壓力。默認(rèn)值0.1 second
-h, --help
查看幫助信息。
直接輸入slowrm,或輸入slowrm –h或slowrm --help可以查看幫助。
實(shí)際上,可以看出,由#size * #seconds = #ioBPS Bytes/s,
即可計(jì)算得出每秒該操作消耗的IO吞吐量(字節(jié)數(shù)),也即大約每秒文件所減小的字節(jié)數(shù)。
可以看到默認(rèn)刪除速度是: 4096 * 256Bytes / 0.1second= 10MB/s,被刪除的文件每秒鐘可以減少10MB。
用戶可以通過上述兩個(gè)參數(shù)來控制刪除的速度以及對(duì)磁盤IO的壓力。
使用方式 | slowrm | rm | 備注 | |
提示是否刪除 | 默認(rèn)支持 | rm -i | 默認(rèn)slowrm會(huì)詢問用戶是否刪除每一個(gè)指定文件 | |
刪除單個(gè)文件 | slowrm file | rm file | 相同 | |
刪除多個(gè)文件 | 顯示指定文件 | slowrm file1 file2 file3 | rm file1 file2 file3 | |
使用通配符 | slowrm file* | rm file* | ||
刪除硬鏈 | 硬鏈數(shù)大于1 | 刪除硬鏈同rm | 刪除硬鏈 | 實(shí)際執(zhí)行的就是unlink |
硬鏈數(shù)等于1 | 低速刪除文件 | 全速刪除文件 | 實(shí)質(zhì)上在判斷硬鏈數(shù)上邏輯是一樣的,只是最后一個(gè)硬鏈的刪除方式不同 | |
強(qiáng)制刪除文件 | slowrm -f slowrm --force | rm -f rm --force | 相同 | |
控制刪除速度 | 控制速度 | slowrm -s 0.1 -b 262144 file (2MB/s) | 不支持 | |
默認(rèn)速度 |
slowrm file 對(duì)應(yīng)參數(shù)-s 0.1 -b 1048576(10MB/s) | 一般使用默認(rèn)參數(shù)即可 | ||
刪除其他類型文件 | 目錄,軟鏈 | 不支持 | ||
遞歸刪除目錄 | rm -rf 目錄 |
可見,一般情況下,還是使用rm刪除即可。
在需要低IO負(fù)載刪除大文件時(shí),可以使用slowrm。
slowrm對(duì)于rm是起到一個(gè)補(bǔ)充的作用。
目前,該工具只支持刪除具體常規(guī)文件,無法對(duì)目錄進(jìn)行遞歸刪除,但可以支持對(duì)多個(gè)文件進(jìn)行刪除,如slowrm *.logmysql.err.2014*
也無法對(duì)軟鏈接,文件等進(jìn)行刪除。
如果slowrm要?jiǎng)h除的文件的硬鏈接數(shù)目大于1,那么就會(huì)直接刪除該硬鏈;
如果待刪除的文件硬鏈數(shù)目等于1,那么會(huì)按照平滑刪除的方式,逐步截?cái)嘣撐募?
制造大文件
開始刪除
大小情況
壓力情況
Device: rrqm/s wrqm/s r/s w/s rMB/s wMB/s avgrq-sz avgqu-sz await svctm %util
1、開啟一個(gè)screen
screen -S slowrm_test
2、開始刪除文件
slowrm file
或者指定速度,正常默認(rèn)即可(10MB/s)
感謝各位的閱讀,以上就是“MySQL大表刪除問題的解決方法”的內(nèi)容了,經(jīng)過本文的學(xué)習(xí)后,相信大家對(duì)MySQL大表刪除問題的解決方法這一問題有了更深刻的體會(huì),具體使用情況還需要大家實(shí)踐驗(yàn)證。這里是創(chuàng)新互聯(lián),小編將為大家推送更多相關(guān)知識(shí)點(diǎn)的文章,歡迎關(guān)注!
當(dāng)前名稱:MySQL大表刪除問題的解決方法
分享鏈接:http://jinyejixie.com/article12/pdcjgc.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、電子商務(wù)、動(dòng)態(tài)網(wǎng)站、定制開發(fā)、網(wǎng)站收錄、網(wǎng)站導(dǎo)航
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)