久久精品人人爽,华人av在线,亚洲性视频网站,欧美专区一二三

MySQL大表刪除問題的解決方法

141次閱讀
沒有評論

共計 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 小編將為大家推送更多相關知識點的文章,歡迎關注!

正文完
 
丸趣
版權聲明:本站原創文章,由 丸趣 2023-08-01發表,共計3155字。
轉載說明:除特殊說明外本站除技術相關以外文章皆由網絡搜集發布,轉載請注明出處。
評論(沒有評論)
主站蜘蛛池模板: 大余县| 临夏县| 乌兰察布市| 聂拉木县| 怀远县| 永吉县| 香河县| 吴忠市| 阳山县| 乐安县| 明光市| 台北县| 温宿县| 靖江市| 清水县| 灵璧县| 雅江县| 环江| 昌吉市| 锡林浩特市| 崇左市| 新津县| 高碑店市| 鹤峰县| 峨眉山市| 辽宁省| 黑山县| 兴城市| 盘锦市| 拜城县| 萨嘎县| 东方市| 鹿邑县| 原阳县| 博爱县| 遵化市| 苍梧县| 卢龙县| 蕉岭县| 铁岭市| 新龙县|