必须用 CHANGE REPLICATION SOURCE TO,因 MySQL 8.0.23+ 已弃用 CHANGE MASTER TO 并报错;新语法参数前缀为 SOURCE_(如 SOURCE_HOST),旧语法为 MASTER_,混用或漏改将导致语法错误。

直接用 CHANGE REPLICATION SOURCE TO 就能配好,但参数写错、权限没开、server_id 冲突这三类问题占了 90% 的失败原因。
为什么必须用 CHANGE REPLICATION SOURCE TO 而不是 CHANGE MASTER TO
MySQL 8.0.23+ 已正式弃用 CHANGE MASTER TO,继续用会报错:ERROR 1238 (HY000): Variable 'master_host' is a read only variable。官方文档明确要求使用新语法,旧语句在后续版本可能完全不可用。
关键区别在于参数前缀:旧的是 MASTER_*(如 MASTER_HOST),新的是 SOURCE_*(如 SOURCE_HOST)。漏改前缀或混用会导致语法错误。
- 必须用
SOURCE_HOST、SOURCE_USER、SOURCE_PASSWORD、SOURCE_LOG_FILE、SOURCE_LOG_POS -
FOR CHANNEL是可选的,但多源复制时必须显式指定,否则默认走''(空字符串)通道 - 如果之前用过
CHANGE MASTER TO配置过,得先执行RESET REPLICA清掉旧元数据,否则新命令不生效
CHANGE REPLICATION SOURCE TO 必填参数和常见填错点
最简可用命令长这样:
CHANGE REPLICATION SOURCE TO SOURCE_HOST='192.168.1.100', SOURCE_USER='repl', SOURCE_PASSWORD='ReplPass123!', SOURCE_LOG_FILE='mysql-bin.000001', SOURCE_LOG_POS=157;
容易出错的地方:
-
SOURCE_LOG_FILE和SOURCE_LOG_POS必须来自主库执行SHOW MASTER STATUS的实时输出,不能抄旧快照或重启前的值;主库重启后mysql-bin.*尾号会变,位置也会重置 -
SOURCE_USER必须是主库上已创建、且被授权REPLICATION SLAVE权限的用户;仅SELECT或ALL PRIVILEGES不够 -
SOURCE_PASSWORD如果含特殊字符(如!、@),必须用单引号包裹,shell 中执行时还要注意是否被提前解析 - IP 地址写成主机名但 DNS 解析失败,会导致 IO 线程卡在
Connecting to master状态
配完启动复制前必须检查的三项状态
执行 START REPLICA 后,别只看 Replica_IO_Running 和 Replica_SQL_Running 是不是 Yes,真正决定同步是否健康的是:
-
Replica_IO_Running = Yes:说明从库能连上主库、读取 binlog 流 —— 这步失败多数是网络、账号、SSL 或防火墙问题 -
Replica_SQL_Running = Yes:说明 relay log 能正常回放 —— 这步失败常因表结构不一致、SQL mode 差异或 GTID 冲突 -
Seconds_Behind_Master:初始同步时可能为几十甚至几百,但应持续下降;若长期 > 0 且缓慢增长,大概率是大事务阻塞或磁盘 I/O 瓶颈
查状态统一用:SHOW REPLICA STATUS\G(注意不是 SHOW SLAVE STATUS,后者在 8.0.23+ 已不推荐)
容易被忽略的 server_id 和 binary log 前置条件
CHANGE REPLICATION SOURCE TO 只负责“告诉从库怎么连”,但底层依赖两个硬性前提:
- 主库必须设了非零
server_id(如server-id = 1),且不能和其他节点重复;若之前是0,改完必须重启 mysqld 才生效 - 主库必须开启 binlog(
log_bin = ON),且推荐显式指定log_bin = mysql-bin,避免主机名变更导致日志路径失效 - 从库也必须设唯一
server_id(如server-id = 2),否则启动复制时报错:ERROR 3009 (HY000): The server is not configured as a replica - 如果主库用了
caching_sha2_password认证插件,而从库连接时没配 SSL,建议创建用户时强制指定IDENTIFIED WITH mysql_native_password,否则握手失败
这些配置都在 my.cnf 里,Linux 下通常是 /etc/my.cnf 或 /etc/mysql/mysql.conf.d/mysqld.cnf,改完记得 sudo systemctl restart mysql。











