MySQL主从复制核心是配置分离、网络互通与Binlog同步:主库需唯一server-id、开启ROW格式binlog并创建repl用户;从库设不同server-id、配置CHANGE REPLICATION SOURCE TO指向主库,启动REPLICA后验证IO和SQL线程均为Yes。

用 Docker 搭建 MySQL 主从复制,核心是“配置分离 + 网络互通 + Binlog 同步”,不是靠命令堆砌,而是理清主从角色分工和容器间通信逻辑。下面直接说关键步骤,不绕弯。
准备两个独立容器并挂载配置与数据
主从必须使用不同容器名、不同 server-id、不同挂载路径,避免配置冲突或数据覆盖。
- 启动主库(Source):映射宿主机 3307 → 容器 3306,挂载自定义 my.cnf 和数据卷
- 启动从库(Replica):映射宿主机 3308 → 容器 3306,同样挂载独立的配置与数据目录
- 务必使用 -v 显式挂载
/etc/mysql(配置)、/var/lib/mysql(数据)、/var/log/mysql(日志),否则重启后配置丢失、数据不持久 - MySQL 8.0 容器需额外挂载
/var/lib/mysql-files,否则导入导出类操作会报错
主库配置要点:开启 Binlog 并创建同步用户
主库的 my.cnf 必须包含以下最小有效配置:
-
server-id = 101(整数,全集群唯一) -
log-bin = mysql-bin(启用二进制日志,文件名可自定义) -
binlog-format = ROW(推荐,避免语句级复制的不确定性) -
binlog-ignore-db = mysql,information_schema,performance_schema(跳过系统库,减少无效日志)
配置生效后,进入容器执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';- MySQL 8.0 还要执行:
ALTER USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123';(否则从库连不上) - 运行
SHOW MASTER STATUS;记下 File 和 Position 值,后续从库要用
从库配置要点:指向主库并启动复制链路
从库的 my.cnf 至少需设置:
-
server-id = 102(不能和主库相同) -
relay-log = mysql-relay-bin(中继日志名称) - 不需要开
log-bin(除非它还要做级联从库)
容器启动后,登录从库执行:
-
CHANGE REPLICATION SOURCE TO(MySQL 8.0.23+ 语法)或CHANGE MASTER TO(旧版) - 指定主库 IP(用宿主机 IP 或 Docker 网络别名)、端口、同步用户、刚才记下的 File 和 Position
-
START REPLICA;(新版)或START SLAVE;(旧版) - 用
SHOW REPLICA STATUS\G查看 IO_Running 和 SQL_Running 是否都为 Yes
验证与常见问题处理
主库建表插入数据,立刻查从库是否同步。若不同步,优先检查:
- 从库能否
ping通主库容器?Docker 默认 bridge 网络下,用容器名或host.docker.internal(Mac/Win)或宿主机 IP(Linux) -
SHOW REPLICA STATUS\G中的 Last_IO_Error 或 Last_SQL_Error 字段内容 - 主库防火墙或安全组是否放行 3306 端口(对从库容器所在网络)
- MySQL 8.0 用户认证插件是否已统一为
mysql_native_password


















