drop table 大表
###################
一、背景:
在DROP TABLE的时候,所有进程不管是DDL还是DML都被HANG起;直到DROP结束才继续执行;这是因为INNODB会维护一个全局独占锁(在table cache上面),直到DROP TABLE完成才释放。
比如线上数据库里有一张200G的表需要删除,那么在删除过程中,不影响数据库的响应,业务正常使用最佳。假如直接登录数据库使用drop table会是什么情况?在drop table的时候,innodb会维护一个全局锁(库级别锁),drop完毕锁才能释放。
这就意味着,在白天,访问量非常大的时候,执行删除大表的命令,整个库就会挂起,读写都不可用,直到删除成功后才恢复。
二、方案:
假设现在我的mydb库下有一个500GB的apple表需要删除
1、先在该集群的所有机器上创建对应的硬链接
ln /home/work/mysql_3306/mydb/apple.ibd /home/work/mysql_3306/mydb/apple.ibd.hdlk
2、再在该集群的主库上执行drop table
# 进入mysql,执行删除表
mysql>use mydb;
mysql>drop table apple;
只在主库上操作,drop目标库后只剩下目标库的硬链接。
3、最后去该集群的所有机器上循环批次删除创建的硬链接文件
# 若文件大小为filesize GB
# for i in $(seq $filesize -1 1) ;do sleep 2;truncate -s ${i}G /home/work/mysql_3306/data/mydb/apple.ibd.hdlk;done
# rm -rf /home/work/mysql_3306/data/mydb/apple.ibd.hdlk
最后循环删除
在执行该操作时,如果时间很长,中途杀掉该线程需要承受数据库挂掉的风险,回滚会将undo 空间打满而挂掉
for i in `seq $filesize -1 1`;do truncate -s ${i}G $filename.bbk;ll -h $filename.bbk;done
创建链接方法都很简单:
软链接(符号链接) ln -s source target
硬链接 (实体链接)ln source target
#################################################################
igoodful@qq.com