天天看點

MySQL 超大表的删除方法

MySQL裡面直接對大表執行drop table删除有可能導緻mysql hang住。必須使用些特殊的方法。

先搞一個大表出來,如下圖:

<a href="https://s1.51cto.com/wyfs02/M00/96/78/wKiom1kiWYiAPS5GAAAY07rTZxU748.png" target="_blank"></a>

可以看到t2表的ibd大小為2.7GB了

<a href="https://s1.51cto.com/wyfs02/M00/96/78/wKiom1kiWYjSVI_VAAAa3_u2H8Q409.png" target="_blank"></a>

1、建立個硬連結:

cd/bdata/data/nowdb2/test

ln t2.ibdt2.ibd_hdlk

<a href="https://s1.51cto.com/wyfs02/M00/96/79/wKioL1kiWYmwcx12AAAkuAVHpO0396.png" target="_blank"></a>

建立一個硬連結的好處就是:

    硬連結就是增加了對檔案的引用,隻有對磁盤上檔案的引用完全沒有了的話,這個檔案才能是删除的。

我們對t2.ibd 建立硬連結後,當我們執行drop table t2; 的時候,實際上隻是删除了對t2.ibd的一個檔案引用,我們t2.ibd_hdlk對實體檔案的引用還是存在的,就不會執行OS級别的删除操作,就不會大量的IO操作。這種對線上mysql的影響降到很低。

2、執行實際的删除

droptable test.t2;

3、使用coreutils工具集執行OS級别的檔案删除

下載下傳位址: ftp://alpha.gnu.org/gnu/coreutils/

tar xf coreutils-8.0.tar.xz

cdcoreutils-8.0

./configure

make  &amp;&amp; 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 ${i}M  /bdata/data/nowdb2/test/t2.ibd_hdlk

  sleep 1

done

執行完上面的腳本後,還剩下35MB的空間,如下圖。這個小檔案我們直接使用rm删除即可。

<a href="https://s1.51cto.com/wyfs02/M01/96/79/wKioL1kiWazDVx4bAAAdj-SVGQo484.png" target="_blank"></a>

這樣就徹底删除掉這個t2大表了。

本文轉自 lirulei90 51CTO部落格,原文連結:http://blog.51cto.com/lee90/1928108,如需轉載請自行聯系原作者