mysql 8.0+ 默认支持多线程复制,需设置 slave_parallel_workers > 0 且 slave_parallel_type = logical_clock(默认已满足),主库开启 binlog_format = row 并建议启用 gtid;设值后需关注逻辑依赖导致的自动降级、slave_preserve_commit_order 默认开启带来的性能影响及合理线程数配置。

mysql 8.0+ 怎么开启多线程复制(slave_parallel_workers)
MySQL 5.6 引入了基于库的并行复制,但真正实用的多线程复制是从 5.7 的 slave_parallel_type = LOGICAL_CLOCK 开始,到 8.0 已成默认。关键不是“能不能开”,而是“开了之后要不要调、怎么调才不翻车”。
实操上,直接改配置文件或运行时设参数即可,但必须满足前提:主库已开启 binlog_format = ROW,且从库使用的是 GTID 模式(强烈建议)或至少是 RELAY_LOG_INFO_REPOSITORY = TABLE。
-
SET GLOBAL slave_parallel_workers = 4;—— 立即生效,但重启后丢失 - 在
my.cnf的[mysqld]下加:slave_parallel_workers = 4,再重启 MySQL - 必须同时设置
slave_parallel_type = LOGICAL_CLOCK(8.0 默认已是该值,5.7 需显式指定) - 如果从库启用了
read_only = ON,不影响并行复制启动,但不能手动写 relay log
为什么设了 slave_parallel_workers > 0 却还是单线程回放?
最常见原因是事务之间存在逻辑依赖,MySQL 自动降级为单线程——这不是 bug,是保障一致性的主动退让。
典型触发场景:UPDATE 同一张表的多行但无主键/唯一键,或大量 INSERT ... SELECT、CREATE TABLE ... AS SELECT;这类语句在 binlog 中被标记为不可并行(last_committed 和 sequence_number 相同),导致 worker 线程排队等。
- 查当前并行状态:
SHOW PROCESSLIST看是否有多个Slave_worker线程在运行 - 看实际并行度:
SELECT * FROM performance_schema.replication_applier_status_by_worker; - 检查是否被强制串行:
SHOW SLAVE STATUS\G中Retrieved_Gtid_Set和Executed_Gtid_Set差距大,但Seconds_Behind_Master不降,大概率是逻辑阻塞
slave_parallel_workers 设多大才合适?
不是越多越好。线程数超过 CPU 核心数太多,反而因上下文切换和锁争用拖慢整体速度。
真实建议值取决于硬件和负载特征:纯 OLTP 场景(大量小事务)、主库并发高、从库 I/O 能力强,可设为 CPU 逻辑核数的 1–2 倍;若有大事务(如批量导入、DDL),建议保守设为 4–8,避免 worker 空转或频繁等待。
- 不要设为 0:等于关掉并行复制,回退到传统单线程模式
- 不建议设为 1:此时仍启用 coordinator + worker 架构,但只有一个 worker,徒增调度开销
- 监控指标重点看:
performance_schema.replication_applier_status_by_worker中的LAST_SEEN_TRANSACTION更新频率和WORKER_THREAD_ID分布是否均衡
MySQL 5.7 升级到 8.0 后多线程复制突然变慢?
8.0 默认开启 slave_preserve_commit_order = ON,这是为了保证从库提交顺序与主库一致(尤其对 READ-COMMITTED 隔离级别下的一致性读很重要),但它会强制 coordinator 等待所有 worker 提交完成后再推进全局位点——相当于加了一道同步栅栏。
如果你的业务不依赖严格提交顺序(比如只做灾备、不提供一致性读服务),可以关掉它来换取吞吐:
SET GLOBAL slave_preserve_commit_order = OFF;- 注意:必须在
STOP SLAVE后设置,否则报错ERROR 3091 (HY000) - 该参数关闭后,
Seconds_Behind_Master可能显示滞后更少,但gtid_executed的推进节奏和主库不再严格对齐
真正容易被忽略的是:这个参数在 5.7 是默认 OFF,8.0 是默认 ON,升级后不做适配,就会发现明明开了 8 个 worker,性能却不如 5.7 开 4 个的时候。










