MySQL 8.0主从同步需显式配置server-id和log-bin:master必须带--server-id=1 --log-bin --binlog-format=ROW,slave必须带--server-id=2 --relay-log --relay-log-info-repository=TABLE;禁用bind-address,共用Docker自定义网络;复制用户须指定mysql_native_password插件;启动复制前须手动获取并设置主库binlog文件与position。

docker-compose.yml 必须显式声明 server-id 和 log-bin
MySQL 8.0 容器默认不开启 binlog,也不会自动分配 server-id,光靠环境变量(如 MYSQL_SERVER_ID)无法生效——这是主从同步失败最常见原因。
正确做法是通过 command 字段传参,或挂载自定义配置文件。推荐前者,避免因挂载路径错误导致配置被忽略。
-
master服务必须带--server-id=1 --log-bin --binlog-format=ROW -
slave服务必须带--server-id=2 --relay-log --relay-log-info-repository=TABLE - 不要在
environment中写MYSQL_SERVER_ID,它只影响初始化逻辑,不修改运行时 mysqld 配置 - 若用挂载
my.cnf,确保文件权限为644,且容器内路径为/etc/mysql/my.cnf或/etc/mysql/conf.d/xxx.cnf
主从容器必须共用同一 Docker 网络,且禁用 bind-address 绑定
默认 MySQL 容器只监听 127.0.0.1,从库连不上主库的 3306 端口,报错 Can't connect to MySQL server on 'mysql-master' (115) 就是这个原因。
Docker 内部通信走的是自定义 bridge 网络 IP,不是 localhost;强行绑定宿主机 IP(如 192.168.x.x)反而会阻断容器间访问。
- 先执行
docker network create mysql-net创建专用网络 -
docker-compose.yml中所有服务都加入该网络:networks: [- mysql-net] - 主库配置里**不要写
bind-address**,让 mysqld 监听0.0.0.0:3306 - 从库连接主库时,host 填服务名(如
mysql-master),不是localhost或宿主机 IP
MySQL 8.0 默认认证插件导致从库 IO 线程启动失败
从库执行 CHANGE REPLICATION SOURCE TO ... 后,SHOW REPLICA STATUS\G 显示 IO_Running: No,错误日志里出现 Plugin caching_sha2_password could not be loaded ——这是 MySQL 8.0 的坑。
主库创建复制用户时,必须显式指定旧版插件,否则从库 mysqld(尤其是老版本镜像)无法完成握手。
- 主库登录后执行:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123'; - 再授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 或者在
docker-compose.yml的 mastercommand中加:--default-authentication-plugin=mysql_native_password - 注意:该参数必须加在
command里,environment无效
从库启动前必须获取主库 binlog 位置,不能直接 START REPLICA
很多人跑通 docker-compose up -d 就以为完事了,结果 SHOW REPLICA STATUS 里 Seconds_Behind_Master 一直是 NULL,Source_IO_State 是空的——说明复制关系根本没建立。
这是因为从库不知道从哪条 binlog 文件、哪个 position 开始拉取。必须手动触发一次主库 SHOW MASTER STATUS,把结果填进 CHANGE REPLICATION SOURCE TO。
- 主库执行:
docker exec -it mysql-master mysql -uroot -p123456 -e "SHOW MASTER STATUS\G" - 记下
File(如mysql-bin.000003)和Position(如156) - 从库执行:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql-master', SOURCE_USER='repl', SOURCE_PASSWORD='repl123', SOURCE_LOG_FILE='mysql-bin.000003', SOURCE_LOG_POS=156; - 最后才运行:
START REPLICA;
真正容易卡住的地方,是主库 log-bin 没生效、从库连不上主库地址、认证插件不兼容这三点。只要这三个环节对了,后续步骤基本不会出意外。


















