当Slave_SQL_Running为No且Last_SQL_Error含lock_wait_timeout_exceeded等锁相关错误时,说明从库SQL线程因本地锁冲突卡住,需通过SHOW ENGINE INNODB STATUS、INFORMATION_SCHEMA.INNODB_LOCK_WAITS和INNODB_TRX定位阻塞事务,并检查非system用户长事务或监控脚本干扰。

直接看 SHOW SLAVE STATUS\G 里的 Slave_SQL_Running 是否为 No,再结合 Last_SQL_Error。如果错误信息里含 lock_wait_timeout_exceeded 或类似表述,基本可以锁定是 SQL 线程在重放语句时被锁卡住,不是网络或权限问题,也不是 GTID 集合不一致——这是典型的从库本地锁冲突,得从从库自身事务和锁状态入手。
查清当前卡在哪条语句、等哪个锁
先确认 SQL 线程确实停了:SHOW SLAVE STATUS\G 中 Slave_SQL_Running: No 且 Seconds_Behind_Master: NULL。重点看 Last_SQL_Error 字段,常见错误如:
Lock wait timeout exceeded; try restarting transactionDeadlock found when trying to get lockWaiting for table metadata lock
这些都不是主库的问题,而是从库在执行那条语句时,本地已有其他事务(可能是人为操作、监控脚本、备份任务)持有了冲突锁。别急着跳过,先定位:
- 用
SHOW ENGINE INNODB STATUS\G查TRANSACTIONS小节,找状态为waiting for lock的事务,记下它的trx_id和等待的lock_trx_id - 查
information_schema.INNODB_LOCK_WAITS表,它直接关联等待方和持有方的事务 ID:SELECT * FROM information_schema.INNODB_LOCK_WAITS; - 再通过
INNODB_TRX关联查出两个事务正在执行的 SQL:SELECT trx_id, trx_mysql_thread_id, trx_query FROM information_schema.INNODB_TRX WHERE trx_id IN ('xxx', 'yyy');
区分是复制线程被卡,还是应用连接在捣乱
很多情况下,lock_wait_timeout_exceeded 并非复制本身有问题,而是运维或 DBA 在从库上手动执行了长事务(比如 ALTER TABLE、大表 UPDATE),或者监控工具反复查 INFORMATION_SCHEMA 表触发了元数据锁。关键判断点:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 检查
trx_mysql_thread_id对应的线程是否属于system user(这是复制 SQL 线程的标识),如果不是,说明是外部连接占了资源 - 用
SHOW FULL PROCESSLIST;看有没有长时间运行(Time值很大)、状态为Sleep或Locked的非 system 用户连接 - 特别注意那些没加
WHERE条件的UPDATE/DELETE、未提交的事务、以及对大表加索引的操作——它们极易阻塞复制线程
修复前必须确认:这不是主库写入导致的连锁反应
有时候主库上一个慢事务或锁竞争,会“传导”到从库:主库那条语句执行时间长,从库 SQL 线程回放时也得等同样长的锁,但从库的 innodb_lock_wait_timeout 默认只有 50 秒,比主库短,更容易超时。此时不能只杀从库的阻塞者,得同步看主库:
- 去主库查
SHOW PROCESSLIST;和INNODB_TRX,确认是否有同名表、同业务逻辑的长事务正在跑 - 对比主从的
innodb_lock_wait_timeout值:SHOW VARIABLES LIKE 'innodb_lock_wait_timeout';。从库可适当调高(比如设为 120),避免因阈值低而误报 - 如果主库确有慢事务,优先优化它(加索引、拆分、改隔离级别),而不是在从库强行跳过——跳过只是掩盖问题,下次还会卡
真正容易被忽略的是:从库上的锁等待,90% 源头不在复制链路里,而在你没关掉的那个监控脚本、那个忘了 COMMIT 的临时会话、或者那个正在跑的 mysqldump --single-transaction。排查时眼睛要离开 Relay_Log_File,多盯几眼 PROCESSLIST 和 INNODB_TRX。










