MySQL删除30万行表时DROP语句卡顿无响应如何解决
DROP TABLE执行长时间无响应解决方案
针对employees库下300153行的emp_manager表删表卡顿问题,按以下优先级操作即可解决:
- 优先排查元数据锁(MDL)阻塞
执行SHOW PROCESSLIST;查看所有运行会话,找到State字段显示Waiting for table metadata lock的删表会话对应的阻塞源:重点找长时间运行、操作过emp_manager表且未提交的事务、慢查询,记录对应会话ID后执行KILL <会话ID>;释放锁即可。
可以通过查询SELECT * FROM information_schema.innodb_trx \G快速定位运行时间超过10秒的未提交事务,这类事务是MDL锁最常见的阻塞源。 - 外键检查导致的卡顿处理
确认emp_manager表没有被其他业务表强依赖的前提下,可以临时关闭外键约束检查后再删表,操作完成后务必恢复配置:SET FOREIGN_KEY_CHECKS = 0; DROP TABLE IF EXISTS emp_manager; SET FOREIGN_KEY_CHECKS = 1; - 不阻塞业务的异步删表方案
如果暂时找不到阻塞源,又不想影响线上业务,可以先做快速表改名,把待删表移走,原表名立刻释放不阻塞业务,后续低峰期再删临时表:
RENAME是原子元数据操作,毫秒级完成,改名后即使后续执行RENAME TABLE emp_manager TO tmp_emp_manager_del_2024xxxx;DROP TABLE tmp_emp_manager_del_2024xxxx;耗时较长,也不会影响正常业务读写。 - 大表空间IO压力过大的处理
如果是独立表空间模式下(innodb_file_per_table=ON),表实际占用空间远大于30万行对应的体量(比如存在大量碎片、长文本字段),可以先执行TRUNCATE TABLE emp_manager;快速回收表空间,再执行DROP,能大幅缩短删表耗时。
操作前务必备份表内需要留存的数据,所有KILL会话、修改参数操作前确认对应的业务影响,避免误操作影响核心业务。
内容的提问来源于stack exchange,提问作者Mayur Surani
相关产品推荐
相关产品推荐

