Seconds_Behind_Master不可信,因其本质是“当前执行事件时间戳与从库系统时间之差”,非真实端到端延迟;大事务、时钟偏差>1s、并行复制或IO中断时严重失真;真实延迟须依赖pt-heartbeat心跳差值、relay log积压量及主从binlog位点差综合判断。

Seconds_Behind_Master 为什么不能信
它不是“从库落后主库多少秒”,而是“当前正在执行的事务时间戳和系统时间的差”。大事务卡在 SQL 线程里时,Seconds_Behind_Master 可能长期显示 0,直到事务提交瞬间跳到几万秒;主从服务器时钟偏差 >1s、并行复制开启、IO线程中断时,这个值就完全失真。
真正反映延迟的是 relay log 积压量 + 主从 binlog 位点差。线上必须弃用 Seconds_Behind_Master 做告警依据。
- 用
SHOW SLAVE STATUS\G查Relay_Log_File和Relay_Log_Pos,对比主库SHOW MASTER STATUS的File和Position - 积压超过 1GB relay log 文件,基本说明 SQL 线程已严重跟不上
- 监控脚本应同时采集
Seconds_Behind_Master、Read_Master_Log_Pos、Exec_Master_Log_Pos三者差值
pt-heartbeat 是怎么测出真实延迟的
pt-heartbeat 在主库每秒更新一张心跳表(如 heartbeat.heartbeat),从库读取该行时间戳,再与本地系统时间做差 —— 这个差值才是真实的复制延迟,单位毫秒。
它绕开了 Seconds_Behind_Master 的所有缺陷:不依赖事务时间戳、不受时钟偏差影响、不被大事务阻塞。
- 心跳表必须建在普通数据库下(不能是
information_schema或临时库),且带PRIMARY KEY - 必须用同一数据库用户、走相同网络链路(否则测出来的是网络抖动)
- 字段尽量精简(只保留
tsdatetime NOT NULL,加ON UPDATE CURRENT_TIMESTAMP) - 告警阈值建议设为
500ms 而非 1s:短延迟累积快,等 1s 才触发往往已错过干预窗口
write_set 并行复制为什么没生效
MySQL 8.0 启用 slave_parallel_type = LOGICAL_CLOCK 和 slave_parallel_workers = 8 只是基础,write_set 真正起效需要主库同时满足:binlog_transaction_dependency_tracking = WRITESET(默认值),且事务之间无跨表更新、无 NOW()/UUID() 等函数调用、无 DDL 混合写入。
否则从库会退化为单线程回放,SHOW PROCESSLIST 里只看到 1 个 Worker thread 处于 Executing 状态。
- 禁止在同一个事务里先
SELECT ... FOR UPDATE表 A,再UPDATE表 B —— 这会让 write_set 哈希值污染,强制串行 - 批量插入优先用
INSERT INTO t VALUES (),(),()单语句,而不是多条独立INSERT - 升级到 MySQL 8.0.23+,修复了分区表 write_set 计算错误导致的串行回放 bug
DDL 和无主键表怎么偷偷拖垮复制
ALTER TABLE 在从库不是“原样执行”,而是先加 MDL 锁,再等所有活跃查询释放锁才开始变更。如果从库正跑着 SELECT COUNT(*) FROM orders GROUP BY created_date 这类长查询,SQL 线程就会无限期阻塞,relay log 持续堆积。
无主键表更隐蔽:ROW 格式 binlog 里没有主键定位信息,从库只能全表扫描匹配更新行,I/O 和 CPU 成倍上涨,延迟肉眼可见。
- 主库执行 DDL 前,先用
pt-online-schema-change替代直接ALTER - 从库紧急卡死时,可临时
STOP SLAVE+KILL长查询线程释放 MDL 锁(注意业务影响) - 用
SELECT table_schema, table_name FROM information_schema.tables WHERE table_schema NOT IN ('mysql','information_schema','performance_schema') AND table_name NOT IN (SELECT table_name FROM information_schema.key_column_usage WHERE constraint_name='PRIMARY')快速扫出无主键表


















