MySQL 8.4异步复制需确保server-id全局唯一、binlog_format一致(推荐ROW)、CHANGE MASTER TO参数精准(GTID下用MASTER_AUTO_POSITION=1),否则易报错或同步停滞。

server-id重复、binlog_format不一致、或CHANGE MASTER TO里用错了日志位置。
为什么server-id必须全局唯一?
MySQL靠server-id识别每个节点身份。如果两个节点配置相同(比如都写server-id = 1),从库启动START SLAVE时会直接报错:ERROR 1236 (HY000): Could not open log file,或者同步卡在Waiting for master to send event状态不动。
-
server-id必须是1–4294967295之间的整数,主从不能相同 - 建议用IP末段或机器编号,比如
192.168.228.109→server-id = 109 - 改完
my.cnf后必须重启mysqld,SELECT @@server_id;确认生效
binlog_format = ROW是必须的吗?
不是强制,但强烈建议设为ROW。MySQL 8.4默认仍是STATEMENT,而它在某些场景下会导致主从数据不一致——比如带NOW()、UUID()、自增列插入等非确定性函数。
-
ROW记录每一行变更,精确、安全,但日志体积大 -
STATEMENT记录SQL语句本身,节省空间,但重放时可能结果不同 - 修改后需重启,且主从必须一致;混用会触发
Slave_SQL_Running_State: Reading event from the relay log但迟迟不更新
如何正确执行CHANGE MASTER TO?
最容易错的是master_log_file和master_log_pos这两个参数。它们不是“随便填个值”,而是必须严格对应主库当前SHOW MASTER STATUS输出的File和Position。
- 主库执行
FLUSH BINARY LOGS;后再查SHOW MASTER STATUS;,避免日志轮换导致位置失效 - 如果用了GTID(推荐),就不用填
master_log_file/master_log_pos,改用MASTER_AUTO_POSITION = 1 - 务必加
GET_MASTER_PUBLIC_KEY = 1(MySQL 8.0+默认开启RSA密钥交换) - 示例:
CHANGE MASTER TO MASTER_HOST='192.168.228.109', MASTER_USER='repl', MASTER_PASSWORD='repl123', MASTER_PORT=3306, MASTER_AUTO_POSITION = 1, GET_MASTER_PUBLIC_KEY = 1;
启动后怎么确认真的在同步?
别只看SHOW SLAVE STATUS\G里Slave_IO_Running和Slave_SQL_Running都是Yes——这只能说明线程活着,不代表数据在动。
- 重点看
Seconds_Behind_Master:为NULL说明IO线程没连上;为0才表示实时同步中 - 检查
Relay_Log_Pos是否持续增长,Exec_Master_Log_Pos是否跟主库Position接近 - 主库写一行,立刻在从库
SELECT查,延迟超过1秒就要查SHOW PROCESSLIST里SQL线程是否被锁表或大事务阻塞
START SLAVE之后看似成功,其实早埋了坑。


















