mysql 8.0必须显式启用writeset才能真正实现并行复制,否则即使设置slave_parallel_workers=16,实际也仅1–2个线程工作;需主库配置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。

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_preserve_commit_order = ON 是开还是关?
MySQL 8.0.27+ 默认开启该参数,但它会把 WRITESET 逻辑强行拉回 COMMIT_ORDER 行为——除非你关掉它。但直接关有风险:
• 关闭后,若主库发生多事务并发更新同一行,从库可能因乱序执行导致数据不一致
• 正确做法是:保持 ON,但确保主库满足 WRITESET 三要素(ROW + GTID + 主键/唯一键),这样它就能在保证一致性前提下真正并行
• 验证是否生效:查 performance_schema.replication_applier_status_by_worker,看各 worker 的 LAST_APPLIED_TRANSACTION 是否交错推进,而非全部卡在同一个 GTID 上
从库配置里最容易漏掉的关键项
很多人只改 slave_parallel_type 和 slave_parallel_workers,却忘了:
• slave_parallel_type 必须设为 LOGICAL_CLOCK(MySQL 8.0 默认已是,但别信默认值,手动 SET GLOBAL 确认)
• log_slave_updates = ON 必须显式开启(它不直接启动并行,但它是 WRITESET 冲突识别链的起点)
• slave_preserve_commit_order = 1 要配合主库 WRITESET 才有意义,单独开没用
• 不需要在从库设 binlog_transaction_dependency_tracking,那是主库专属参数
• 永久生效务必写进 my.cnf,仅 SET GLOBAL 在重启后丢失
information_schema.TABLES 逐个确认。











