mysql主从复制核心是主库开启binlog并授权复制用户,从库配置唯一server-id和relay-log,通过change master to指向主库并start slave启动io/sql线程实现同步。

用 Docker 搭建 MySQL 主从复制,核心是两个独立容器(主 + 从),各自有唯一 server_id、开启 binlog,并通过授权用户 + CHANGE MASTER TO 建立复制链路。整个过程不依赖宿主机 MySQL,全部在容器内完成。
准备主从两个 MySQL 容器
先拉取镜像(推荐 5.7 或 8.0.25,兼容性好):
docker pull mysql:5.7
创建主库容器(映射到宿主机 3307 端口,挂载配置、数据、日志目录):
docker run -d --name mysql-master -p 3307:3306 \-v /mydata/mysql-master/conf:/etc/mysql/conf.d \-v /mydata/mysql-master/data:/var/lib/mysql \-v /mydata/mysql-master/log:/var/log/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
同理创建从库容器(端口 3308,目录路径区分):
docker run -d --name mysql-slave -p 3308:3306 \-v /mydata/mysql-slave/conf:/etc/mysql/conf.d \-v /mydata/mysql-slave/data:/var/lib/mysql \-e MYSQL_ROOT_PASSWORD=root \-d mysql:5.7
配置主库 my.cnf(关键参数不能少)
在 /mydata/mysql-master/conf/ 下新建 my.cnf,内容必须包含:
[mysqld]-
server-id = 101(整数,全集群唯一) -
log-bin = mysql-bin(开启 binlog) -
binlog-format = ROW(推荐,避免语句级不一致) -
binlog-ignore-db = mysql(跳过系统库,可选但建议) -
skip-host-cache和skip-name-resolve(避免 DNS 解析延迟)
保存后执行 docker restart mysql-master 生效。启动失败时用 docker logs mysql-master 查错。
配置从库 my.cnf 并授权同步用户
主库配置生效后,进入容器创建复制账号:
docker exec -it mysql-master mysql -uroot -prootCREATE USER 'repl'@'%' IDENTIFIED BY 'repl123';GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';FLUSH PRIVILEGES;
再查主库当前 binlog 位置:
-
SHOW MASTER STATUS;(记下File和Position,如mysql-bin.000003,154)
接着配从库 /mydata/mysql-slave/conf/my.cnf:
[mysqld]-
server-id = 102(必须 ≠ 主库) -
relay-log = mysql-relay-bin(启用中继日志) -
read_only = 1(防止误写,从库只读)
重启从库:docker restart mysql-slave
建立并启动主从复制关系
进入从库容器执行复制配置:
docker exec -it mysql-slave mysql -uroot -prootCHANGE MASTER TO-
MASTER_HOST='宿主机IP',(不是localhost,容器内无法解析) MASTER_PORT=3307,MASTER_USER='repl',MASTER_PASSWORD='repl123',MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=154;
最后启动复制:
START SLAVE;-
SHOW SLAVE STATUS\G(重点看Slave_IO_Running和Slave_SQL_Running是否都为Yes)
若出错,常见原因是网络不通、账号权限不足、binlog 文件名或位置错误,逐项核对即可。











