Docker-compose启动MySQL 8.0主从必须显式通过command传参--server-id和--log-bin,因容器默认不开启binlog且MYSQL_SERVER_ID环境变量无效;需配置--bind-address=0.0.0.0、使用mysql_native_password认证插件,并手动设置准确的Source_Log_File与Source_Log_Pos才能成功启动复制。

docker-compose 启动 MySQL 8.0 主从必须显式传参 --server-id 和 --log-bin
MySQL 8.0 容器默认不开启 binlog,MYSQL_SERVER_ID 环境变量只影响初始化阶段,完全不修改运行时 mysqld 的配置。光靠 environment 设置会直接导致主从同步失败——这是最常踩的坑。
正确做法是用 command 字段强制传参:
- 主库:
command: --server-id=1 --log-bin=mysql-bin --binlog-format=ROW --bind-address=0.0.0.0 - 从库:
command: --server-id=2 --relay-log=mysql-relay-bin --relay-log-info-repository=TABLE --bind-address=0.0.0.0 - 绝对不要在
environment里写MYSQL_SERVER_ID,它对复制无作用 - 若挂载
my.cnf,确保权限为644,路径为/etc/mysql/conf.d/replica.cnf(推荐放 conf.d 下,避免覆盖默认配置)
主从容器必须共用自定义 Docker 网络且禁用 bind-address=127.0.0.1
默认 MySQL 容器只监听 127.0.0.1:3306,从库用服务名(如 mysql-master)根本连不上,报错 Can't connect to MySQL server on 'mysql-master' (115) 就是这个原因。
必须让 mysqld 监听所有接口,并走 Docker 内部网络通信:
- 先创建网络:
docker network create mysql-net - 在
docker-compose.yml中所有服务都加入该网络:networks: [- mysql-net] -
command中必须包含--bind-address=0.0.0.0,不能留空或写成127.0.0.1 - 从库连接主库时,host 填服务名(如
mysql-master),不是localhost或宿主机 IP
MySQL 8.0 复制用户必须指定 mysql_native_password 插件
从库执行 CHANGE REPLICATION SOURCE TO 后,SHOW REPLICA STATUS\G 显示 IO_Running: No,错误日志里出现 Plugin caching_sha2_password could not be loaded —— 这是 MySQL 8.0 默认认证插件导致的典型问题。
主库创建复制账号时,必须显式指定旧插件:
- 登录主库:
mysql -u root -p - 执行:
CREATE USER 'repl'@'%' IDENTIFIED WITH mysql_native_password BY 'repl123'; - 再授权:
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%'; - 刷新权限:
FLUSH PRIVILEGES; - 切勿用
caching_sha2_password,哪怕只是临时测试也不行
启动复制前必须手动获取并设置 Source_Log_File 和 Source_Log_Pos
MySQL 8.0 不支持 GTID 自动定位(除非显式启用并配置),CHANGE REPLICATION SOURCE TO 必须填准确的 binlog 文件名和 position,否则 IO 线程无法启动。
操作顺序不能错:
- 在主库执行:
FLUSH TABLES WITH READ LOCK;(暂停写入) - 记录输出:
SHOW MASTER STATUS;→ 得到File(如mysql-bin.000001)和Position(如156) - 在从库执行:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='mysql-master', SOURCE_USER='repl', SOURCE_PASSWORD='repl123', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=156; - 解锁主库:
UNLOCK TABLES; - 最后启动:
START REPLICA;
漏掉 FLUSH + UNLOCK 组合,或 position 值抄错一位,都会卡在 IO_Running: Connecting 状态。这个步骤没有捷径,必须人工核对。


















