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
也可以先处理物理文件
参考运维内参