MySQL 8.0默认不并行,必须主从协同启用WRITESET:主库需binlog_format=ROW、gtid_mode=ON、binlog_transaction_dependency_tracking=WRITESET且表有主键/唯一键;从库需slave_parallel_type=LOGICAL_CLOCK、log_slave_updates=ON、slave_preserve_commit_order=ON,并执行STOP/START SLAVE生效。

MySQL 8.0 默认不并行——哪怕你设了 slave_parallel_workers=16,实际 SQL 线程也大概率只跑 1–2 个。真要压榨并发能力,必须显式启用 WRITESET,且主从两端缺一不可。
为什么 slave_parallel_workers 设了却没效果?
常见现象:执行 SHOW PROCESSLIST 只看到一个 SQL Thread,Seconds_Behind_Master 持续上涨,performance_schema.replication_applier_status_by_coordinator 中 WORKERS_WAITING 远高于 WORKERS_PROCESSED。
- 根本不是参数没生效,而是并行复制的硬性前提被悄悄绕过了
-
binlog_format必须是ROW(STATEMENT或MIXED下WRITESET直接失效) - 主库必须开启 GTID:
gtid_mode = ON且enforce_gtid_consistency = ON - 从库必须开启
log_slave_updates = ON(否则slave_preserve_commit_order失效,WRITESET退化为单线程) - 所有被修改的表必须有
PRIMARY KEY或UNIQUE KEY(无主键/唯一键的表,事务自动降级为COMMIT_ORDER,且不报错)
binlog_transaction_dependency_tracking=WRITESET 怎么配才生效?
这个参数只在主库起作用,且必须配合其他两项才能让 WRITESET 生效:
- 先确认主库已启用
binlog_format = ROW和 GTID - 执行:
SET PERSIST binlog_transaction_dependency_tracking = 'WRITESET';SET PERSIST transaction_write_set_extraction = 'XXHASH64';SET PERSIST binlog_transaction_dependency_history_size = 25000; - 修改
my.cnf的[mysqld]段并重启,否则PERSIST在某些版本下可能不持久 -
COMMIT_ORDER模式只看提交时间窗口,完全不检查行冲突;而WRITESET才真正基于写集(writeset)做冲突检测,这才是 OLTP 场景下能跑满slave_parallel_workers的唯一路径
slave_parallel_type = LOGICAL_CLOCK 还是 WRITESET?
MySQL 8.0.19+ 支持 slave_parallel_type = WRITESET,但注意:WRITESET 不是光改从库参数就能开的“开关”——它依赖主库生成写集。若主库未配,从库设了也无效。
- 主库未启用
WRITESET时,slave_parallel_type = WRITESET会静默回退到LOGICAL_CLOCK -
LOGICAL_CLOCK依赖主库组提交信息,需主库配binlog_group_commit_sync_delay > 0+binlog_group_commit_sync_no_delay_count >= 10 - 验证是否生效:
SHOW PROCESSLIST查看是否有多个system user线程状态为Waiting for an event from Coordinator - 不要盲目设
slave_parallel_workers为 CPU 核数;从 4 或 8 起步,配合slave_preserve_commit_order = ON避免提交乱序
log_slave_updates = ON 是必须的吗?
是必须的,但它不直接触发并行,而是让 slave_preserve_commit_order = ON 能真正起效的关键前提。
- 该参数控制“从库是否把主库发来的变更写进自己的 binlog”
- MySQL 8.0 的
WRITESET并行机制,需要在 relay log 解析阶段就识别事务间写集(writeset)冲突,这依赖于完整的 GTID + binlog 事件链 - 如果
log_slave_updates = OFF,从库 SQL 线程执行完 relay log 后不生成对应 binlog 事件,slave_preserve_commit_order就无法校验跨事务的 writeset 依赖关系 - 结果就是:即使设了
slave_parallel_type = WRITESET,MySQL 也会静默回退到LOGICAL_CLOCK,甚至单线程
最易被忽略的一点:所有表必须有主键或唯一键。没有索引约束的表,事务会自动降级为 COMMIT_ORDER,且 MySQL 不报错、不警告——你得自己查 information_schema.tables 和 SHOW CREATE TABLE 确认。


















