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

 

#################################################################

posted @ 2019-12-13 15:27  igoodful  阅读(386)  评论(1编辑  收藏  举报