首页/数据/数据库速查/从库延迟的处置手段
主从复制与高可用53 条

从库延迟的处置手段

处置先止血后治本:临时提高重放并行度、错峰暂停从库大查询、必要时限流主库写;治理则从表结构、事务粒度与硬件下手。

数据库速查数据更新于 2026-10-13

延迟的处置顺序

从库延迟要先判断瓶颈在哪一段:IO 线程跟不上主库写入、SQL 线程重放慢、还是从库自身被大查询占满资源。处置遵循先止血后治本:先让从库追上来(提高并行度、暂停从库上的重查询、必要时限流主库写入),再回到根因层面治结构问题,例如补主键、拆大事务、调整索引。

基本信息

适用平台MySQL 5.7 / 8.0、MariaDB
观察命令SHOW REPLICA STATUS\G 的 Seconds_Behind_Source
并行参数replica_parallel_workers、replica_parallel_type
顺序保证replica_preserve_commit_order=ON
区分线程Replica_IO_Running 与 Replica_SQL_Running

典型使用场景

  • 批量导入或大事务后从库落后数分钟,需要快速追赶
  • 延迟持续增长而非一次性抖动,怀疑结构或硬件瓶颈
  • 读流量路由到从库前先判断延迟是否在可接受范围
  • 切换演练前确认延迟已归零,避免切到落后数据
  • 新增从库后首次追赶阶段观察复制吞吐是否正常

定位与处置命令

定位与处置命令
-- 先看延迟数值与两个线程状态
SHOW REPLICA STATUS\G
-- 关注:Seconds_Behind_Source、Replica_IO_Running、Replica_SQL_Running
-- 查看并行相关参数
SHOW VARIABLES LIKE 'replica_parallel%';
SHOW VARIABLES LIKE 'replica_preserve_commit_order';
-- 需要暂停重放(例如先让读流量降下来)
STOP REPLICA SQL_THREAD;
START REPLICA SQL_THREAD;
-- 从库上正在跑的重查询
SELECT id, user, time, state, info FROM information_schema.processlist
WHERE command <> 'Sleep' ORDER BY time DESC LIMIT 10;

延迟成因与处置

现象原因处置
IO 线程落后主库写入量大、网络带宽不足提升链路带宽,检查是否频繁重连
SQL 线程慢并行度低、大事务串行重放提高并行度并启用 WRITESET 依赖跟踪
从库被查询压满报表或备份任务占用 IO/CPU错峰执行,重查询走专用副本
结构缺主键按行重放退化为全表扫描补主键,避免无主键表的大批量更新
单次延迟不再下降大事务或长回滚在执行等待回滚结束,必要时评估重建副本
replica_preserve_commit_order=ON 保证并行重放时提交顺序与源端一致,这是并行复制下能够安全切换的前提,改参数时不要为了吞吐随意关掉。
不要用清空 relay log 或跳过事务的方式「重置延迟」:跳过事务会让从库与主库数据永久不一致,之后的所有读数都不可信。

易错点

  • 为了降延迟关掉 commit order:并行重放提交乱序,故障切换后可能读到不一致状态
  • 临场清空从库 relay log 想重置延迟:直接丢数据,且丢失难以量化
  • 只调并行度不看冲突:表级冲突或单表热点会让并行度无法生效,需要先拆大事务
  • 把延迟当成网络问题:多数持续增长的延迟来自从库结构缺主键或单表写入过密,光加带宽解决不了

数据来源与参考

  • MySQL 8.0 Reference Manual: Improving Replication Performance
  • MySQL 8.0 Reference Manual: replica_parallel_workers

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌