mysql中超大表的刪除方法

2021-10-19 05:25:42 字數 1242 閱讀 2077

參考:

在mysql中遇到乙個大表,大概有17g左右,刪除這張表。通常的刪除操作可以通過delete、drop、truncate操作,但是有可能導致mysql hang住,必須使用些特殊的方法。

找到mysql的資料檔案,找到這張表在硬碟上的名稱,我的是tmplst.frm和tmplst.ibd,通過檢視tmplst.ibd的大小到了17g左右,這就是無法刪除的原因。其中tmplst是表名。

在這個資料夾下,為tmplst,frm和tmplst.ibd分別建立硬鏈結

ln tmplst.frm tmplst.frm.h

ln tmplst.ibd tmplst.ibd.h

這樣的話就成功的建立了兩個硬鏈結。

硬鏈結就是增加了對檔案的引用,只有對磁碟上檔案的引用完全沒有了的話,這個檔案才能是刪除的。當我們執行drop table 的時候,實際上只是刪除了對tmplst.ibd的乙個檔案引用,我們 tmplst.ibd.h對物理檔案的引用還是存在的,就不會執行os級別的刪除操作,就不會大量的io操作。這種對線上mysql的影響降到很低。

在mysql中使用drop命令刪除表

drop table tmplst;
這時發現刪除非常快,不到一分鐘刪除完成。

在硬碟上刪除新建的硬鏈結。分別刪除tmplst.frm.h和tmplst.ibd.h

rm -rf tmplst.frm.h

rm -rf tmplst.idb.h

最後,成功了刪除一張大表(17g左右)。

這樣第三步還是會執行大量的io操作,我們可以用下面的辦法繼續優化

wget 

tar xf coreutils-8.0.tar.xz

cdcoreutils-8.0

./configure

make  && make install

清理指令碼如下:

#!/bin/bash

truncate=/usr/local/bin/truncate

#從2835mb(2.7gb差不多在2768mb)開始每次刪除100mb,最後如果指令碼truncate後還剩下部分檔案,可以使用rm刪除

fori in `seq 2768 -100 10 `; do

$truncate -s $m  /bdata/data/nowdb2/test/t2.ibd_hdlk

sleep 1

done

執行完上面的指令碼後,還剩下35mb的空間,如下圖。這個小檔案我們直接使用rm刪除即可。

MySQL刪除表中的資料

mysql刪除表中的資料有三種方法,分別是delete drop,truncate。一 delete刪除表中的資料 delete好from結合使用,格式一般為 delete from 表名 where 條件,delete刪除資料是將mysql表中的資料一行一行的刪除,不刪除表的結構,也不釋放表的空間...

MySQL中多表刪除方法

如果您是才接觸mysql資料庫的新人,那麼mysql中多表刪除是您一定需要掌握的,下面就將為詳細介紹mysql中多表刪除的方法,供您參考,希望對你學習掌握mysql中多表刪除能有所幫助。1 從mysql資料表t1中把那些id值在資料表t2裡有匹配的記錄全刪除掉 delete t1 from t1,t...

MySQL 刪除表中的資料記錄

刪除資料記錄是資料操作中常見的操作,可以刪除表中已經存在的資料記錄。在mysql中可以通過delete語句來刪除資料記錄,該sql語句可以通過以下幾種方式使用 刪除特定資料記錄 刪除所有資料記錄。在mysql中刪除特定資料記錄可通過 sql 語句delete來實現,其語法形式如下 deletefro...