快速定位从库锁等待需查performance_schema.data_lock_waits用BLOCKING_ENGINE_LOCK_ID关联data_locks查阻塞方锁类型和范围从库执行计划差异源于单线程回放READ-COMMITTED隔离级导致优化器选错索引“Lock wait timeout exceeded”不报错因MySQL自动重试10次才写日志大事务未分批、DDL操作、显式加锁查询会加剧从库锁问题。怎么快速定位从库正在等哪个锁从库出现大量锁等待第一反应不是杀进程而是看它卡在哪儿。MySQL 5.7 的 performance_schema.data_locks 和 data_lock_waits 是唯一直接反映当前行级锁阻塞关系的来源information_schema.INNODB_TRX 只能告诉你“有事务在跑”但不知道它被谁拦着。实操建议先查 SELECT * FROM performance_schema.data_lock_waits重点关注 BLOCKING_ENGINE_LOCK_ID 和 BLOCKED_ENGINE_LOCK_ID它们是锁的唯一标识能反查到具体表、索引、甚至记录主键值用 BLOCKING_ENGINE_LOCK_ID 去 data_locks 表里 JOIN就能看到阻塞方持有的锁类型LOCK_MODE、锁范围LOCK_DATA比如主键值或间隙值注意默认 performance_schema 可能没开全确认 setup_instruments 中 wait/lock/innoDB 和 transaction 类已启用否则查出来是空的别依赖 SHOW PROCESSLIST 里的 State 字段像 Waiting for table metadata lock 或 Updating 这类描述太模糊无法区分是 DDL 锁还是行锁冲突为什么从库执行计划经常和主库不一致从库 SQL 线程回放时用的是单线程除非开了 MTS且默认以 READ-COMMITTED 隔离级别运行即使主库是 REPEATABLE-READ这会导致优化器对同一语句选择不同索引尤其是当 WHERE 条件涉及非主键字段、又存在多个可选索引时。常见错误现象主库走 idx_status_created从库却走 PRIMARY 扫全表导致延迟飙升 锁等待加剧。实操建议在从库上对慢查询执行 EXPLAIN FOR CONNECTION sql_thread_id需先从 INNODB_TRX 查到 SQL 线程的 TRX_MYSQL_THREAD_ID对比主库同语句的 EXPLAIN重点看 key、rows、Extra特别是 Using index condition 是否一致如果发现从库走了全表或错误索引优先检查该表在从库上是否缺失统计信息——执行 ANALYZE TABLE table_name不要等自动更新避免在从库上手动加 FORCE INDEXSQL 线程不认这个 hint真要干预只能改主库原 SQL 或调整索引设计从库锁日志里看到 “Lock wait timeout exceeded” 但没报错这是最误导人的现象从库 SQL 线程卡住监控看到 Seconds_Behind_Master 持续上涨但错误日志里没有 Lock wait timeout exceeded 报错。原因在于MySQL 默认把这种超时当成“重试场景”而非“失败事件”——它会自动回滚当前事务然后重试最多 10 次由 innodb_lock_wait_timeout 控制只有全部失败才写日志。 Fotor AI Image Generator Fotor 平台的 AI 图片生成器