mysql删除大表的危险操作如何化解

作者:51ak

mysql作为一个很脆弱的数据库,在删除大表(2G以上)会有严重的性能问题,长时间的堵塞甚至会HANG住整个实例

整个删除表的流程如下:

  1. 数据库接收到一个DROP TABLE 操作
  2. INODB会在tablecache维护一个全局独占锁(此时这张表的操作全部HANG住)
  3. 准备元信息变更
  4. 向操作系统发起删除文件通知
  5. 等操作系统返回( 这一步如果文件大了,会要花掉很长)
  6. 元信息变更完成
  7. 释放全局独占锁

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站点上下载

以上流程不可偷懒,否则删大表容易把库和实例整崩了

发布日期:2019/03/12

Categories: mysql 故障处理 Tags: 原创 精品