Ubuntu下MySQL锁表定位与处理
一、快速判断与止损
二、定位根因
三、常见场景与处理对照表
| 场景 | 典型特征 | 处理要点 |
|---|---|---|
| Lock wait timeout exceeded | 报错 1205,事务等待锁超时 | 1) 临时调大 innodb_lock_wait_timeout(如 SET GLOBAL innodb_lock_wait_timeout=120;)2) 优化慢SQL与索引,缩短事务 3) 分解大事务,减少持锁时间 |
| 长时间未提交事务 | INNODB_TRX 中 trx_started 很早且长时间未提交 | 提交或回滚事务;必要时 KILL 对应线程 |
| 死锁 Deadlock | SHOW ENGINE INNODB STATUS 出现 LATEST DETECTED DEADLOCK | 按输出中建议的SQL顺序调整应用逻辑;尽量按固定顺序访问表与行;重试失败事务 |
| DDL 阻塞 DML | 执行 ALTER TABLE 等DDL时大量会话阻塞 | 避免高峰执行DDL;使用 pt-online-schema-change 或 gh-ost 进行在线变更 |
| 索引缺失导致锁扩大 | 无索引或索引不当,扫描范围大,出现 gap lock/next-key lock | 为过滤条件添加合适索引,减少锁范围与等待 |
| 备份导致全局只读 | 执行 FLUSH TABLES WITH READ LOCK (FTWRL) 后业务写入被阻塞 | InnoDB库优先使用 mysqldump --single-transaction 获取一致性备份,避免FTWRL |
四、优化与预防
五、Ubuntu下的常用命令与注意