从库同步慢首要排查磁盘i/o瓶颈,检查iostat指标、relay_log与datadir分盘、云盘突发性能、内存不足触发swap、ssd磨损及innodb_flush_log_at_trx_commit配置。

从库同步慢,先看磁盘 I/O 是不是瓶颈
MySQL 从库同步延迟高,硬件层面最常见就是磁盘写入跟不上主库的 binlog 应用节奏。尤其当 relay_log 和 innodb_data_home_dir 共享同一块机械盘(SATA HDD),或 SSD 被其他进程持续刷脏页占满带宽时,Seconds_Behind_Master 就会稳定在几十秒甚至几分钟。
- 用
iostat -x 1观察%util是否长期 >80%,await是否持续 >20ms —— 这说明磁盘响应已排队 -
relay_log建议和datadir分盘存放,避免主从日志写入争抢同一物理队列 - 如果用的是云盘(如 AWS gp3、阿里云 ESSD),注意是否启用了突发性能模式(Burst Balance 接近 0)导致 IOPS 被限速
内存不足导致 relay log 刷盘频繁
从库靠 SQL 线程读取 relay_log 并执行,但若 relay_log_space_limit 设得太小,或系统内存吃紧触发内核 swap,就会迫使 MySQL 频繁将 relay 日志刷到磁盘,打断连续读取流程。
-
relay_log_space_limit默认为 0(无限制),但若手动设成1G又没配足够内存,容易触发强制轮转和 fsync - 检查
free -h中available是否低于innodb_buffer_pool_size的 1.2 倍 —— 否则 InnoDB 缓冲池抖动会拖慢 SQL 线程解析速度 - 确认
vm.swappiness是否 >1;生产环境建议设为1或0,避免因 swap 引发 IO 放大
SSD 耐久性下降影响随机写性能
用了一年以上的消费级 NVMe 盘(如 Samsung 970 EVO)或老旧 SATA SSD,在大量 relay log 小文件写入 + InnoDB redo log 持续刷盘场景下,可能因磨损均衡策略失效,导致随机写延迟飙升,表现为 SHOW PROCESSLIST 中 SQL 线程常处于 Writing to net 或 Updating 状态但进展缓慢。
- 用
sudo smartctl -a /dev/nvme0n1 | grep -i wear查看Percentage Used,>80% 就该警惕 - 对比
fio --name=randwrite --ioengine=libaio --rw=randwrite --bs=4k --direct=1 --runtime=60 --time_based在空闲盘 vs 从库运行时的iops下降幅度 - 企业级 SSD(如 Intel D3-S4510)的 DWPD(每日全盘写入次数)更高,对 relay log 场景更友好
从库没开 innodb_flush_log_at_trx_commit=2 却硬扛高并发写入
从库不需要强持久性保证(主库已落盘),但默认 innodb_flush_log_at_trx_commit=1 会让每个事务都触发一次 fsync,极大拖慢 SQL 线程执行速度。尤其在批量导入或主库有大量短事务时,这个配置就是隐形减速带。
- 仅当从库不承担读流量、且能接受极短时间(秒级)数据丢失风险时,才可设为
2 - 切勿设为
0:MySQL 5.7+ 下该值会使 log buffer 每秒刷一次,但崩溃后可能丢一整秒事务,对同步链路不可控 - 修改后必须重启 SQL 线程:
STOP SLAVE; START SLAVE;,否则新参数不生效
磁盘寿命、内存水位、SSD 磨损状态、InnoDB 日志刷盘策略——这四个点任何一个没对齐实际负载,同步延迟就不是调参能解决的。真遇到卡在 30s 上下反复横跳,别急着改 slave_parallel_workers,先扒 iostat 和 smartctl 输出。











