ALTER TABLE卡住主因是元数据锁(MDL)阻塞或tmpdir磁盘满:前者由未提交事务持有MDL读锁导致,需查INNODB_TRX定位并谨慎终止;后者因ALTER重建表大量用临时文件,需检查并扩容tmpdir。ALTER TABLE 卡住不动,SHOW PROCESSLIST 显示 Waiting for table metadata lock这是典型的元数据锁(MDL)阻塞,不是磁盘满导致的,但两者常被同时排查。MySQL 在执行 ALTER TABLE 时会申请 MDL 写锁,而只要有一个长事务(哪怕只是 SELECT)没提交,就卡住后续 DDL。立刻查 SHOW PROCESSLIST,找 State 为 Waiting for table metadata lock 的线程,记下它的 ID再查 SELECT * FROM information_schema.INNODB_TRX ORDER BY TRX_STARTED LIMIT 5;,比对 TRX_MYSQL_THREAD_ID 找出未提交事务的源头重点看 TRX_QUERY 是否为空(空表示事务已开始但还没执行语句),以及 TRX_STARTED 时间是否异常久不要直接 kill 大事务,先确认业务影响;若必须终止,用 KILL [thread_id],不是 KILL QUERYERROR 1034 (HY000): Incorrect key file for table,磁盘空间其实够但报错这个错误表面像索引文件损坏,实际常因临时目录(tmpdir)所在分区爆满触发------ALTER TABLE 重建表时大量使用临时文件,而 tmpdir 默认可能在 /tmp,和 MySQL 数据目录不在同一磁盘。查当前设置:SELECT @@tmpdir;,再用 df -h 看对应路径剩余空间临时解决:改 tmpdir 到空间充足的挂载点,比如 SET GLOBAL tmpdir = '/data/tmp';(需确保目录存在且 MySQL 进程有读写权限)永久生效:在 my.cnf 的 [mysqld] 段加 tmpdir = /data/tmp,重启前确认该路径不被 SELinux 或 AppArmor 拦截注意:修改后新连接才生效,已有连接仍用旧 tmpdirALTER TABLE 修改列类型失败,提示 Lost connection to server during query这不是网络问题,而是大表 DDL 过程中内存或超时被强制中断。尤其当涉及字符集转换(如 utf8mb4)、全文索引重建、或在线 DDL 不支持的操作时,MySQL 可能回退到拷表模式,期间资源消耗陡增。 稿定AI 拥有线稿上色优化、图片重绘、人物姿势检测、涂鸦完善等功能
相关推荐
Lee川4 小时前
Milvus 实战:当 RAG 遇上向量数据库,从"玩具 Demo"到"生产可用的"那一步晚烛4 小时前
CANN 调试工具与性能剖析:从日志分析到 NPU 行为追踪的完整调试体系网管NO.16 小时前
SQL 排序分页精讲!ORDER BY+LIMIT 全套用法,报表分页MRSM_016 小时前
InfluxDB vs TimescaleDB,谁更适合你的场景隔壁大炮7 小时前
MNE-Python 第9天学习笔记:源定位基础CAE虚拟与现实7 小时前
Redis如何保证存和读的过程中数据的一致性?Daydream.V8 小时前
Python Flask超全入门实战教程|从零基础到项目部署databook8 小时前
Manim物理模拟:别自己写欧拉了!