在mysql 上如何在不影响生产的情况下删除一个大表

时间:2021-11-05 08:09:55

mysql 中常用的删除的方法基本上有下面三种方式:

1、delete  

  一般用于删除少量表中的数据

  优化建议,一定要加上where 条件,并且where条件的列上 一定要有主键或者索引。否则会出现全表扫描的情况

2、drop

  直接将表删除,包括表的数据和表的定义。

  这种操作,MySQL 会加上一个全局锁,删除期间会阻塞操作,所以对大表来说这样操作一定会对生产造成很大的影响

  优化建议,大表不要使用drop  table 这种方式,可以考虑 truncate  table的方式

3、truncate

  这种方式要优于 drop table,风险较之 drop 要小一点,不需要加锁,所以删除表的速度很快

  注意事项:这种方式虽然很快,但是需要考虑删除大文件对IO产生的影响

使用下面的骚操作更安全吆!

以上三种方式的各有适用的场景,下面介绍一种删除大表又同时能够规避删除大文件带来 IO 过载风险的方式。

1、对表的 idb 文件创建硬链接,这样实际存储的文件上有两个inode指向这个文件。当文件有两个及以上硬连接时,对文件删除,操作系统只会删除这个硬链接,而不是实际上的文件

2、drop   table   table_name;这样实际上删除的是ibd 文件的硬链接,速度会非常快,不用考虑锁操作

3、这样 drop 掉表之后,数据文件实际上还是存在的,所以我们还要删除文件系统中的文件

4、使用操作系统的 truncate 工具可以指定将文件削减到指定大小,所以我们可以使用这个工具控制删除文件的速度,也就是说可以控制 IO 的占用

  truncate 工具使用实例:

  

for i in  `seq     - `;
do
sleep
truncate -s ${i}G /data/test.ibd.hardlk
done
rm -rf /data/mysql/mytest/erp.ibd.hardlk
上面代码就是讲一个 300G的文件每次减小 10G,间隔 2秒,最后剩余 10G 用rm -rf 删除即可。