docker compose 搭建 mysql 主从同步需主库启用唯一 server-id 和 binlog,从库配置不同 server-id、relay-log 与 read_only;通过自定义网络、服务名通信及容器启动后执行 change replication source + start replica 完成自动化同步。

用 Docker Compose 搭建 MySQL 主从同步环境,核心是配置好主库(master)和从库(slave)的启动参数、网络互通性、复制用户权限及同步链路。整个过程不依赖外部脚本或手动干预容器内操作,关键靠 统一配置 + 容器自启即生效 实现自动化部署。
主库必须开启 binlog 并设唯一 server-id
MySQL 主从复制依赖二进制日志(binlog),所以主库必须启用并合理配置:
-
server-id 必须为非零整数,且在整个集群中唯一(如设为
1) -
log-bin 开启 binlog,建议指定前缀(如
mysql-bin),避免默认名引发兼容问题 -
binlog-format 推荐使用
ROW或MIXED,避免STATEMENT在函数/临时表场景下同步失败 -
binlog-ignore-db 可选,跳过系统库(
mysql、information_schema等)减少冗余日志 - 若使用 MySQL 8.0+,需确保
default_authentication_plugin=mysql_native_password,否则从库可能连不上
从库需配置 relay-log 和只读模式
从库角色是接收并重放主库日志,因此配置重点在中继日志与安全控制:
-
server-id 必须与主库不同,且多个从库之间也不能重复(如
2、3) -
relay-log 显式指定中继日志路径(如
mysql-relay-bin),便于排查同步卡点 - read_only=1 强制从库只读,防止误写导致主从数据不一致
- log-slave-updates=1 若需级联复制(比如 A→B→C),则从库 B 需开启该选项,否则不会生成自己的 binlog
- MySQL 5.7 中
skip_slave_start默认关闭,可省略;8.0+ 更推荐用START REPLICA替代旧命令
docker-compose.yml 中要保证服务依赖与网络可达
主从不是简单启动两个容器,而是需要从库能稳定解析主库服务名并建立 TCP 连接:
- 用
depends_on声明启动顺序(如mysql-slave: depends_on: [mysql-master]),但注意它只控制启动先后,不等待主库 MySQL 服务就绪 - 务必使用 自定义 bridge 网络(默认
bridge不支持服务名解析),在docker-compose.yml顶层加networks定义,并让所有服务加入同一网络 - 主库
command中不要写死--bind-address=127.0.0.1,应允许0.0.0.0或留空,默认监听所有接口 - 从库连接主库时,
MASTER_HOST填服务名(如mysql-master),而非localhost或 IP —— 容器内localhost指自己
初始化复制关系需在容器启动后执行 SQL 命令
Docker Compose 启动容器后,MySQL 进程已运行,但复制尚未建立。需通过 docker exec 执行初始化步骤:
- 在主库创建复制用户:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';<br>GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';<br>FLUSH PRIVILEGES;
- 查主库位点:
SHOW MASTER STATUS;记下File和Position - 在从库执行:
CHANGE REPLICATION SOURCE TO<br> SOURCE_HOST='mysql-master',<br> SOURCE_USER='repl',<br> SOURCE_PASSWORD='repl123',<br> SOURCE_LOG_FILE='mysql-bin.000001',<br> SOURCE_LOG_POS=156;<br>START REPLICA;
- 验证:
SHOW REPLICA STATUS\G,重点关注Replica_IO_Running和Replica_SQL_Running是否均为Yes
不复杂但容易忽略











