
在高可用、高性能的数据库架构中,MySQL 主从复制(Replication) 是最核心的技术之一。无论是读写分离、数据备份、容灾恢复,还是构建分布式数据库体系,都离不开主从复制的支撑。但你真的用对了吗?还在手写 MASTER_LOG_FILE 和 MASTER_LOG_POS?是否因主库误删表而彻夜难眠?是否在跨机房部署时被级联延迟折磨?
本文将带你系统性梳理 MySQL 主从复制的核心机制与高级特性,涵盖:
1. 主从复制基本原理
MySQL主从复制集群的架构如下

其数据库同步的基本原理如图所示

如上图所示,主库及从库中涉及的组件主要做如下动作:
1.1 主库的记录与发送:Binlog 与 Dump 线程
1.2 从库的接收与重放:I/O 线程和 SQL 线程
2. 主从复制模式
2.1 按照从库确认策略分
根据主库事务提交后等待从库确认的策略可分为异步复制、半同步(增强半同步)复制、全复制,后面新增了组复制(MGR)。
2.1.1 异步复制(Asynchronous Replication)
异步复制是最常见也是默认的复制模式。主库不需要等待任何从库确认就完成事务提交,这使得性能最高,但牺牲了一定程度的数据一致性,当主库宕机后从库可能丢失未同步的数据。

2.1.2 半同步(增强半同步)复制(Semi-Synchronous Replication)
半同步或增强半同步需要安装插件,模式根据参数rpl_semi_sync_master_wait_point = AFTER_SYNC、AFTER_COMMIT控制

2.1.3 全同步复制
全同步指的是所有节点必须全部确认才能提交(类似 Galera Cluster)。这个模式性能极低,一般不用于生产。MySQL原生不支持全同步模式,所以后续出现了组复制。
2.1.4 组复制(MGR)
MySQL 5.7引入的组复制是一种基于Paxos协议的多主复制解决方案,支持单主或多主模式,自动处理故障转移和冲突检测,提供更强的一致性和高可用性

2.2 按照层级及延迟情况分类
按照层级、延迟情况,又可以分为级联复制、延迟复制及多源复制
2.2.1 级联复制
主库同步到从库(次级主库),这些从库再同步给其他从库,形成树状结构。
在配置时,关键在于中间层的从库(次级主库)必须开启 log_slave_updates参数,这样它才能将自己从主库接收到的更新记录到自己的二进制日志中,再传递给下一级的从库。
缺点是复制层次增加会累积延迟,对延迟敏感的业务需谨慎选择层级。
级联复制适用场景如下:

2.2.2 延迟复制
从库故意延迟一段时间再应用主库的二进制日志,提供一个人为的数据恢复窗口,防止误操作。
延迟复制就像一个“时间胶囊”。当主库发生误操作(如误删重要数据),在延迟时间内,从库上的数据还未被更新。这时可以立即停止从库的复制,将其作为正确数据的来源,快速恢复主库数据。其本质是SQL线程在执行中继日志前会等待设定的延迟时间。
延迟复制适用场景如下:
关于延迟复制有经典的案例,咱们下次再详细说明。

2.2.3 多源复制
一台从库可以同时从多个主库(数据源)进行复制, 将多个实例的数据合并到一个实例,便于统计分析或集中备份。
多源复制 从MySQL 5.7.6版本开始支持,一台从库最多可连接64个主库。配置时,每个主库的连接使用独立的通道(Channel),例如 FOR CHANNEL 'channel_name'。这要求各主库同步到从库的数据库名最好不同,以避免冲突。例如:
-- 配置主库 A
CHANGE MASTER TO
MASTER_HOST='master_a',
MASTER_USER='repl',
MASTER_PASSWORD='xxx',
MASTER_AUTO_POSITION=1
FOR CHANNEL 'master_a';
-- 配置主库 B
CHANGE MASTER TO
MASTER_HOST='master_b',
MASTER_USER='repl',
MASTER_PASSWORD='xxx',
MASTER_AUTO_POSITION=1
FOR CHANNEL 'master_b';
-- 启动两个通道
START SLAVE FOR CHANNEL 'master_a';
START SLAVE FOR CHANNEL 'master_b';多源复制适用场景如下:

2.3 点位复制>ID复制
在MySQL 5.6引入的GTID(全局事务标识符) 为每个事务分配唯一ID。这在主从切换时非常方便,无需再依赖复杂的Binlog文件名和位置点,复制会自动根据GTID找点同步,简化了运维。
特性 | 点位复制(Position) | GTID 复制 |
|---|---|---|
启用版本 | MySQL 所有版本 | ≥ 5.6(推荐 ≥ 5.7) |
配置方式 | 手动指定 file + pos | MASTER_AUTO_POSITION=1 |
故障切换 | 需人工计算位置 | 自动同步缺失事务 |
数据一致性 | 容易出错 | 强一致性保障 |
运维复杂度 | 高 | 低 |
是否支持并行复制 | 支持(但需额外配置) | 原生友好支持 |
是否支持组复制 | ❌ | ✅(必需) |
是否允许非事务 DDL | ✅ | ❌受 enforce_gtid_consistency 限制 |
关于点位复制和GTID复制,有历史文章可以参考
3. 常见问题与排查技巧
3.1 复制中断(Error 1062 / 1032)
1062:主键冲突(从库已有数据) 1032:找不到要更新/删除的行
原因:主从数据不一致、跳过事务、手动改从库数据。
解决:
根本解决:
3.2 主从延迟过大
原因:
优化:
slave_parallel_workers = 8;
slave_parallel_type = LOGICAL_CLOCK;3.3 GTID 模式下无法切换主库
3.4 主库 binlog 被自动清理
从库还没拉取完,主库就 purge 了 binlog。
解决:设置合理的 expire_logs_days,或使用 PURGE BINARY LOGS TO 'xxx'; 手动清理。