MySQL主从复制需为Master和Slave分别配置my.cnf:Master启用log-bin并设server-id=1;Slave设不同server-id=2、read_only=1。通过Docker部署,启动后创建复制用户、配置CHANGE REPLICATION SOURCE并START REPLICA,最后验证SHOW REPLICA STATUS及数据一致性。

准备两个MySQL配置文件
主从复制依赖不同的配置参数,需为Master和Slave分别准备my.cnf。关键区别在于:
- Master启用二进制日志:log-bin=mysql-bin,并设置唯一server-id=1
- Slave关闭binlog(可选),但必须设不同server-id=2,并指定read_only=1
- 两者都建议加skip-host-cache和skip-name-resolve避免DNS解析问题
启动Master容器
使用自定义配置挂载,并暴露端口(如3306):
docker run -d \ --name mysql-master \ -p 3306:3306 \ -v /path/to/master/my.cnf:/etc/mysql/my.cnf \ -v /path/to/master/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ -e MYSQL_DATABASE=testdb \ --restart=always \ mysql:8.0
启动后进入容器执行:
CREATE USER 'repl'@'%' IDENTIFIED BY 'repl123'; GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; FLUSH PRIVILEGES;
再查主库状态:SHOW MASTER STATUS;,记下File和Position值。
启动Slave容器并配置复制
同样挂载专属配置和数据目录,注意server-id不能与Master重复:
docker run -d \ --name mysql-slave \ -p 3307:3306 \ -v /path/to/slave/my.cnf:/etc/mysql/my.cnf \ -v /path/to/slave/data:/var/lib/mysql \ -e MYSQL_ROOT_PASSWORD=123456 \ --restart=always \ mysql:8.0
进入Slave容器执行:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='host.docker.internal', SOURCE_USER='repl', SOURCE_PASSWORD='repl123', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=156; START REPLICA;
注意:SOURCE_HOST填宿主机IP或host.docker.internal(Docker Desktop可用,Linux需手动添加host);LOG_FILE和LOG_POS来自上一步SHOW MASTER STATUS结果。
验证主从同步是否生效
在Master建表插入数据:
CREATE TABLE test_replica (id INT); INSERT INTO test_replica VALUES (1);
立刻在Slave查:
SELECT * FROM test_replica;
若返回相同结果,说明同步成功。还可运行:
SHOW REPLICA STATUS\G
重点检查Replica_IO_Running和Replica_SQL_Running是否均为Yes,且Seconds_Behind_Master为0或稳定增长后归零。










