MySQL大表刪除解決方案
作者:劉春雷
歡迎轉載,請註明作者出處,謝謝
如有問題,歡迎留言~
MySQL大表刪除解決方案
歡迎轉載,請註明作者出處,謝謝
如有問題,歡迎留言~
MySQL大表刪除解決方案
--20170619 劉春雷
一、表刪除問題彙總
(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
三、slowrm
注:此工具作者為 “賈春生”,此處只分享~
3.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類似。
對刪除檔案的方式與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對比
可見,一般情況下,還是使用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)
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29734436/viewspace-2141210/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- MYSQL資料庫表記錄刪除解決方案MySql資料庫
- MySQL Drop 大表的解決方案MySql
- MySQL如何優雅的刪除大表MySql
- 刪除事件(解綁事件)/ 刪除事件相容性解決方案事件
- MYSQL下如何安全的快速刪除大表MySql
- 200G大表刪除資料方案
- Oracle大表刪除部分資料的最佳方案Oracle
- MySQL刪除資料表MySql
- 海量資料表刪除方案
- 誤刪除dual表的解決辦法
- 刪除大表資料
- 在MySQL中如何有效的刪除一個大表?MySql
- [MYSQL][1]建立,修改,刪除表MySql
- MySQL定期自動刪除表MySql
- MySQL批量刪除指定字首表MySql
- dual系統表被刪除的解決方法
- 刪除mysql relay-log 的解決辦法MySql
- OS 刪除temp表空間 而磁碟空間未釋放的解決方案
- mySql刪除多個表 刪除多個欄位的SQLMySql
- python 刪除大表資料Python
- 【Oracle】刪除大表操作一則Oracle
- MySQL大表優化方案MySql優化
- 【MySQL】批量刪除mysql中資料庫中的表MySql資料庫
- mysql 跨表查詢、更新、刪除示例MySql
- mysql表刪除重複記錄方法MySql
- MySQL超大表刪除資料過程MySql
- 如何刪除大表中的資料
- 還原表空間過大的解決方案
- mysql 大表mysqldump遷移方案MySql
- MySQL大表最佳化方案MySql
- mysql支援跨表delete刪除多表記錄MySqldelete
- mysql 動態新建以及刪除分割槽表MySql
- mysql 刪除表中重複的資料MySql
- 刪除APPLY出錯解決APP
- 【C/C++】資料庫刪除大表C++資料庫
- Oracle億級大表高效刪除案例分析Oracle
- 解決無法刪除表,提示被外來鍵約束引用
- 簡單介紹mysql如何刪除資料表和關聯的資料表刪除詳情MySql