SQL_THREAD卡在“Updating”或“Committing”状态且Time持续增长,表明正回放大事务或被锁阻塞;Seconds_Behind_Master失真,需结合INNODB_TRX和pt-heartbeat定位真实延迟。

看SQL_THREAD是不是卡在“Updating”或“Committing”状态
大事务回放时,SQL_THREAD的State常停在Updating或Committing,且Time列持续增长(比如 >60),这不是“正在努力”,而是被锁住或正执行一个无法中断的操作。此时Seconds_Behind_Master可能还显示为 0 或旧值,完全失真。
- 执行
SHOW PROCESSLIST;,过滤system user开头的行,重点关注State和Time - 若
State是Waiting for table metadata lock,大概率是主库刚执行了ALTER TABLE,从库在等MDL释放 - 若
State是Updating且Time不断跳变,配合INFORMATION_SCHEMA.INNODB_TRX查对应事务
查INNODB_TRX里trx_rows_modified超10万的RUNNING事务
真正拖垮复制的大事务,往往在INNODB_TRX里暴露得很直白:状态为RUNNING、trx_rows_modified远高于常规(>100000)、trx_started时间戳比当前早几十分钟——说明它已在从库上跑了很久,还没提交。
- 运行
SELECT trx_id, trx_state, trx_rows_modified, trx_started FROM INFORMATION_SCHEMA.INNODB_TRX WHERE trx_state = 'RUNNING' AND trx_rows_modified > 100000\G - 把结果里的
trx_started时间和SHOW SLAVE STATUS\G中Exec_Master_Log_Pos对应的binlog位置做交叉比对,确认是否就是当前阻塞点 - 别急着
KILL——大事务回滚可能更慢,优先STOP SLAVE等待其自然结束
对比Relay_Master_Log_File和主库SHOW MASTER STATUS的文件差
如果从库Relay_Master_Log_File还卡在mysql-bin.003731,而主库SHOW MASTER STATUS已到mysql-bin.003735,说明落后至少 4 个 binlog 文件。这基本排除网络或IO线程问题,根因就在SQL线程本身——极可能是某个大事务占着线程不放,后续日志全在relay log里排队。
- 从库执行:
SHOW SLAVE STATUS\G,记下Relay_Master_Log_File和Exec_Master_Log_Pos - 主库执行:
SHOW MASTER STATUS;,拿到File和Position - 若文件名不同,直接数差几个文件;若相同,只比
Position差值——差值 > 100MB 基本可判定积压严重 - 同时看
Relay_Log_Space,超过 5GB 就要怀疑磁盘IO是否成为瓶颈(尤其HDD)
用pt-heartbeat验证端到端真实延迟
Seconds_Behind_Master在大事务场景下完全不可信,它只反映“最后一个已提交事务的时间戳差”,不是数据同步进度。真正能反映业务读取是否安全的,是pt-heartbeat写入的打点时间差。
- 部署
pt-heartbeat后,它会在主库每秒插入一条带时间戳的记录,从库实时读取并计算延迟 - 当
pt-heartbeat显示延迟 120s,而Seconds_Behind_Master显示 0,说明SQL线程正卡在一个未提交的大事务里 - 这个差值才是你该告警、该介入的信号,而不是盯着那个失真的数字反复刷新
INNODB_TRX里的RUNNING状态和pt-heartbeat的毫秒级打点,比刷SHOW SLAVE STATUS有效得多。


















