mysql作为一个很脆弱的数据库,在删除大表(2G以上)会有严重的性能问题,长时间的堵塞甚至会HANG住整个实例
整个删除表的流程如下:
- 数据库接收到一个DROP TABLE 操作
- INODB会在tablecache维护一个全局独占锁(此时这张表的操作全部HANG住)
- 准备元信息变更
- 向操作系统发起删除文件通知
- 等操作系统返回( 这一步如果文件大了,会要花掉很长)
- 元信息变更完成
- 释放全局独占锁
DBA在处理这些问题时,不可以直接删除 ,建议走以下流程
##1.找到具体表对应文件
ll /data/mysql3306/data/数据库名/表名*
找到表的文件
##2.对ibd文件创建硬链接
#ln source target
ln /data/mysql3306/data/数据库名/表名.ibd /data/mysql3306/data/数据库名/表名.ibddbaback
(如果有从库,先从所有从库上建这个硬链,再到主库上建这个硬链)
##3.进入mysql ,DROP 表
drop table 表名
##4.去操作系统中删除真正的大物理文件 有两种方式: 这是网上找到一种SHELL脚本(未测试)
for i in `seq 50 -1 1 ` ;do sleep 2;truncate -s ${i}G /data/mysql3306/data/数据库名/表名.ibddbaback;done
rm -rf /data/mysql/mysql_3306/data/db222/t_user.ibd.hdlk
还有一种是前DBA同事写了一个小程序slowrm 可以在DBA站点上下载
以上流程不可偷懒,否则删大表容易把库和实例整崩了