MySQL 8.0.23+ 必须用 CHANGE REPLICATION SOURCE TO,参数前缀统一为 SOURCE_(如 SOURCE_HOST),混用 MASTER_ 前缀会报错;SOURCE_LOG_FILE 和 SOURCE_LOG_POS 需取自主库实时 SHOW MASTER STATUS;GTID 模式下应设 SOURCE_AUTO_POSITION = 1;同步异常需检查 server_id、权限、网络及 DNS。

必须用 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。
为什么执行 CHANGE REPLICATION SOURCE TO 报语法错误
最常见原因是参数前缀没改对:新语法全部用 SOURCE_ 开头(如 SOURCE_HOST),旧语法是 MASTER_(如 MASTER_HOST)。混用或漏改一个就会失败。
- 写成
SOURCE_HOST='x', MASTER_USER='y'→ 错误 - 写成
MASTER_HOST='x', MASTER_USER='y'→ MySQL 8.0.23+ 拒绝执行 - 多源复制时漏了
FOR CHANNEL 'chan_name',而之前已存在同名通道 → 触发ERROR 3077 (HY000) - 之前用
CHANGE MASTER TO配过但没清空,直接跑新命令 → 不生效,得先RESET REPLICA
SOURCE_LOG_FILE 和 SOURCE_LOG_POS 怎么取才不翻车
这两个值必须来自主库当前实时状态,不能抄配置文档、不能复用旧快照、不能靠猜。
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
- 在主库执行
SHOW MASTER STATUS;,取File和Position列的值(不是Executed_Gtid_Set) - 主库重启后
mysql-bin.0000xx尾号可能变,Position通常重置为157或154,不能沿用重启前的值 - 如果主库开了 GTID,且你打算用 GTID 复制,就别填这两个参数,改用
SOURCE_AUTO_POSITION = 1 - 从库还没启同步前,
SOURCE_LOG_POS填0是合法的,但仅限全新实例;已有数据的从库必须对齐主库当前位点
配完 START REPLICA 后状态是 Yes 却不同步?重点看这三处
Replica_IO_Running = Yes 和 Replica_SQL_Running = Yes 只是表面健康,真正卡住的地方藏在细节里:
-
Seconds_Behind_Master持续为NULL→ IO 线程连上了但没收到 event,检查主库log_bin是否开启、binlog_format是否一致(尤其 ROW/MIXED)、网络是否丢包 -
Replica_SQL_Running = Yes但Seconds_Behind_Master持续上涨 → SQL 线程在回放 relay log,但遇到 DDL 或表结构不一致(比如主库加了字段,从库没同步到),查Last_SQL_Error -
Replica_IO_Running = Connecting to master→ DNS 解析失败(SOURCE_HOST是主机名但没配好)、防火墙拦了端口、账号密码错、SSL 要求未满足(比如主库强制 SSL,从库没配证书)
最容易被忽略的是:server_id 冲突、复制用户没 REPLICATION CLIENT 权限(导致 SHOW REPLICA STATUS 查不到完整信息)、以及 Docker 环境下 SOURCE_HOST 填了 localhost 或容器内网 IP 却没打通 DNS。这些不会报明显错误,但会让同步静默失败。










