MySQL删除大表drop table
2018-04-27 本文已影响193人
Better朔
背景:在删除过大的表时,除了会导致DML和DDL阻塞之外,还会产生大量的IO,造成资源占用严重,影响正常的业务
前提:linux操作系统,MySQL数据库为独立表空间
思路:在独立表空间环境中,删除一个表体现在OS上则为删除一个表空间文件。所以在OS上使用硬链接,在删除表时,实际是删除硬链接,该操作能迅速完成,然后再在系统上进行文件的逐步删除
一、建立硬链接
在OS上建立硬链接,例如表testbigfile,则在datadir下对应位置:
ln testbigfile.ibd testbigfile.ibd.rm
通过ll 显示的第二列可以看到有两个文件使用了这个链接,所以删除其中一个时,删除的只是链接(会使得MySQL删表时速度更快),只有在只有一个文件使用链接时,才是真正的删除
linux命令行ll -a 显示的内容二、在MySQL中进行表的删除
drop table bigtbdrop;
三、在操作系统删除硬链接文件
由于突然删除上百GB的文件,同样会导致IO的占用,所以可以使用truncate工具进行递进删除,一次删除1GB;更好的做法是统计当前的IO使用资源,在空闲IO资源较多时,触发truncate的操作:
truncate -s -1GB regtime.ibd
至此,则可删除大表,妈妈再也不用担心我的drop table啦