利用硬連結和truncate降低drop table對線上環境的影響
阿新 • • 發佈:2022-05-03
作者簡介
肖鵬
微博研發中心資料庫技術負責人,主要負責微博資料庫(MySQL/Reids/HBase/Memcached)相關的業務保障,效能優化,架構設計以及周邊的自動化系統建設。10年網際網路資料庫架構和管理經驗,專注於資料庫的高效能和高可用技術保障方向。
眾所周知drop table會嚴重的消耗伺服器IO效能,如果被drop的table容量較大,甚至會影響到線上的正常。
首先,我們看一下為什麼drop容量大的table會影響線上服務
直接執行drop table,mysql會將表定義和表資料全都刪除,包括磁碟上的物理檔案,也包括buffer pool中的記憶體資料。
這就分兩步,第一步從buffer pool中刪除
而percona的lazy drop處理起來更優雅一些,其會先加鎖,然後找到需要被刪除的page,標記,釋放鎖,後臺慢慢刪除。
之後就是第二步,這步在大容量表的時候更為消耗時間,那就是在os上刪除物理檔案
ext3:
ext4:
知道了原因,我們來說說如何解決。具體步驟如下:
1、建立硬連結。
ln table.ibd table.idb.hdlk
2、mysql執行drop table操作。
drop table if exists tablename;
3、使用truncate刪除物理檔案。
truncate -s 1024*1024*4 filename
其實硬連結和drop table就不用多說了,在建立硬連結之後,mysql會認為rm了硬連結檔案之後就算操作完畢,不會真正去刪除物理檔案從而提高了速度。但是對於伺服器來說,實際的物理檔案還在,如果手動rm,還是會產生很多的io影響,這時候就用到了truncate這個工具。這個工具會根據指定的size大小進行逐步刪除,會將對IO造成的影響降到最低。