MySQL快速删除大表 内参第一部分第17章

MySQL drop table分为两个过程

1.buffer pool中flush list清除

  根据space_id来查找buffer pool中的每一个实例,flush list中包含该表的页面直接清除(实际上是设置标志位),并不会直接的flush disk

  两个锁:buffer pool mutex和flush list mutex,如果buffer pool很大,或者buffer pool中需要被flush的页面很多,则持有这两个锁的时间就会很长,阻塞了该buffer pool实例中的其他事务,所以大表的drop操作很可能会影响业务

2.删除ibd文件

  如果文件过大,会带来大量的IO,并且耗时

 

解决方案

针对ibd文件过大,可以创建硬链接,drop table时,并不会真正的删除物理文件,只是完成一个逻辑上的操作,待drop操作结束后,再在os层面删除物理文件

os层分块truncate删除物理文件

 

gelara处理

每个节点执行

(1)set @@session.wsrep_on=OFF;

(2)ln /data/mysql/testdb/exptab.ibd /data/mysql/testdb/exptab.ibd.hl

(3)drop table;

(4)rm -f /data/mysql/testdb/exptab.ibd.hl

也可以先处理物理文件

参考运维内参

posted @ 2018-07-25 16:34  geek_ace  阅读(140)  评论(0编辑  收藏  举报