首页 > mysql > mysql中超大表的删除方法
2017
06-02

mysql中超大表的删除方法

在mysql中遇到一个大表,大概有17G左右,删除这张表。通常的删除操作可以通过delete、drop、truncate操作,但是有可能导致mysql hang住,必须使用些特殊的方法。

1、建立硬链接

找到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的影响降到很低。

2、删除表

在mysql中使用drop命令删除表

drop table tmplst;

这时发现删除非常快,不到一分钟删除完成。

3、删除硬链接文件

在硬盘上删除新建的硬链接。分别删除tmplst.frm.h和tmplst.ibd.h

rm -rf tmplst.frm.h
rm -rf tmplst.idb.h

最后,成功了删除一张大表(17G左右)。


这样第三步还是会执行大量的io操作,我们可以用下面的办法继续优化


4.使用coreutils工具集执行OS级别的文件删除

wget ftp://alpha.gnu.org/gnu/coreutils/
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 ${i}M  /bdata/data/nowdb2/test/t2.ibd_hdlk
 sleep 1
done

执行完上面的脚本后,还剩下35MB的空间,如下图。这个小文件我们直接使用rm删除即可。


本文》有 0 条评论

留下一个回复