server-id重复会导致mysql主从复制拒绝连接,表现为io_running和sql_running均为no,并出现错误1236等;必须确保各节点server-id为非零整数且全局唯一,配置须在[mysqld]段下,修改后需重启并重新执行change master to。

server-id 重复会导致主从直接拒绝连接
MySQL 主从复制启动失败,SHOW SLAVE STATUS\G 里 IO_Running 和 SQL_Running 都是 NO,日志里反复出现 Got fatal error 1236 from master when reading data from binary log 或 Client requested master to start replication from position > file size —— 这类错误八成不是日志位置问题,而是 server-id 冲突了。
MySQL 要求每个实例的 server-id 必须是**非零整数**,且在整个复制拓扑中**全局唯一**。主库和从库设成一样(比如都是 1),从库在连接主库时会被拒绝,但错误提示不直白,容易误判为网络或权限问题。
- 检查方式:登录各节点执行
SELECT @@server_id;,别只看配置文件,运行时值可能被动态改过 - 配置文件里写的是
server-id = 1,注意等号前后不能有空格,否则 MySQL 会静默忽略该行 - 如果用 Docker 或云数据库,确认是否被启动脚本或模板覆盖了
server-id,比如阿里云 RDS 默认自动生成,不能手动改 - 重启 mysqld 后必须重新执行
CHANGE MASTER TO(哪怕只是改了server-id),因为旧的复制上下文缓存了初始连接时的 server-id 信息
my.cnf 里 server-id 写错位置会失效
server-id 必须放在 [mysqld] 段下,写在 [client]、[mysql] 或没加方括号的全局区,MySQL 完全不认。
常见手误:
- 把
server-id = 101放在[mysqld_safe]下面 —— mysqld_safe 不读这个参数,启动后@@server_id仍是默认的1 - 配置文件有多个
[mysqld]块(比如拆分了 include),后面块里的server-id会覆盖前面的,但你不一定注意到 - 使用
!include或!includedir时,某个被包含的文件里也定义了server-id,优先级可能出乎意料
验证方法:启动后执行 mysql --help --verbose | grep "Default options" 看实际加载了哪些配置文件,再逐个检查。
从库 change master to 时 MASTER_HOST 指向了本机
配置完 server-id 还连不上?检查 CHANGE MASTER TO 语句里的 MASTER_HOST。常见错误是写成 127.0.0.1 或 localhost,导致从库试图连自己。
尤其在测试环境用单机多实例时,容易混淆端口和 IP:
-
MASTER_HOST = '127.0.0.1'+MASTER_PORT = 3307是对的(假设主库监听 3307) - 但若主库绑定的是
0.0.0.0或具体内网 IP(如192.168.1.10),而MASTER_HOST写成localhost,MySQL 会走 socket 连接,绕过网络栈,连到默认端口 3306 的实例上 - 用
telnet 192.168.1.10 3306手动测通不通,比光看配置更可靠
GTID 模式下 server-id 冲突表现更隐蔽
开启 gtid_mode = ON 后,server-id 不仅用于识别节点,还参与 GTID 生成(格式为 source_id:transaction_id)。一旦重复,主库可能接受从库的 binlog event,造成循环写入,错误日志里会出现 Slave SQL for channel '': Could not execute Write_rows_v1 event on table ... Duplicate entry 之类看似数据冲突的报错。
这种情况下:
-
SHOW SLAVE STATUS\G中Retrieved_Gtid_Set和Executed_Gtid_Set可能看起来正常,掩盖了根本问题 - 必须确保所有节点(包括中间主库、MGR 成员)的
server-id全局唯一,且不能为0—— GTID 模式下server-id = 0是非法的 - 修改
server-id后,GTID 复制必须重置:STOP SLAVE; RESET SLAVE ALL;,再重新CHANGE MASTER TO,不能只START SLAVE
server-id 看似简单,但它在复制链路里是身份凭证。改完不重启、不重连、不重置 GTID,等于换身份证却不更新户口本。











