mysql drop_MySQL如何drop一个上百GB的大表

备注:来自知数堂老师的总结,这里搬到本博客主要是为了备忘。

一个无业务的大表,在系统不繁忙的情况下,如何尽可能的占用较少的磁盘IO,并快速的drop掉?

建议方案:

0. 一定要提前做好备份啊

1. rename table xx to xx_1;

2. create table xx like xx_1;

3. os 层建立硬链接

4. drop table xx;

5. os 层循环truncate数据文件

具体例子参考牛人博客:

这里再稍作解释:

1.有个InnoDB表prod_table,先把表重新命名,防止还有应用在使用表

rename table prod_table to example_table;

2.只创建表结构,不含数据

create table prod_table like example_table;

3.对100G的ibd数据文件做个硬链接

#sudo ls  -lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm

-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd

#sudo ln /data/mysql/testdb/example_table.ibd /data/mysql/testdb/example_table.ibd.hdlk

#sudo ls  -lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 8.4K Oct 28 13:26 example_table.frm

-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd

-rw-rw---- 2 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk

4.干掉大表,这个过程会比较快,因为有硬链接文件

DROP TABLE example_table;

#sudo ls  -lh /data/mysql/testdb

-rw-rw---- 1 mysql mysql 100G Oct 28 13:26 example_table.ibd.hdlk

5.使用truncate命令收缩文件,从100G开始,每次缩减1G,停2秒,继续,直到文件只剩1G,最后使用rm命令删除剩余的部分

#for i in `seq 100 -1 1 `; do sleep 2; sudo truncate -s ${i}G /data/mysql/testdb/example_table.ibd.hdlk; done

#sudo rm -rf /data/mysql/testdb/example_table.ibd.hdlk;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值