关于mysql:MySQL运维实战72-MySQL复制serverid相关问题

135次阅读

共计 2139 个字符,预计需要花费 6 分钟才能阅读完成。

作者:俊达

主库 server_id 没有设置

主库没有设置 server_id

Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - server_id was not set'

主库查看 server_id

mysql> show variables like 'server_id';
+----------------+-------+
| Variable_name  | Value |
+----------------+-------+
| server_id      | 1     |

即便没有设置 server_id,show variables 命令查看 server_id 为 1,

解决办法:
1、主库设置 server_id
倡议不要将 server_id 设置为 1

mysql> set global server_id=234;

同时在配置文件中设置 server_id,防止数据库重启后参数设置生效。
2、备库上重新启动复制

stop slave;
start slave;
show slave status\G

备库 server_id 没有设置

如果备库没有设置 server_id,也无奈启动复制

mysql> set global server_id=default;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
ERROR 1200 (HY000): The server is not configured as slave; fix in config file or with CHANGE MASTER TO

从谬误日志中能够看到无奈启动备库的起因:

2023-06-12 16:36:15 18518 [ERROR] Server id not set, will not start slave

解决办法:设置 server_id,同时在配置文件中退出 server_id 配置。

mysql> set global server_id=236;
Query OK, 0 rows affected (0.00 sec)

mysql> start slave;
Query OK, 0 rows affected (0.00 sec)

主备库 server_id 雷同

主备库 server_id 雷同

Fatal error: The slave I/O thread stops because master and slave have equal MySQL server ids; these ids must be different for replication to work (or the --replicate-same-server-id option must be used on slave but this does not always make sense; please check the manual before using it).

解决办法:
设施库将 server_id 设置成不一样。

server_id 反复导致的问题

mysql 复制关系中,主库和备库的 server_id 如果雷同,IO 线程会间接报错中断。然而在级联复制的架构下,肯能会呈现 server_id 雷同的问题。

如上图的例子中,主和备 1 的 server_id 不同,备 2 和备 1 的 server_id 也不同,然而备 2 和备 1 的 server_id 雷同,这会导致一个问题:备 2 的 IO 线程从备 1 获取 binlog 事件时,发现事件的 server_id 和本人的 server_id 一样,就会疏忽这些事件,从而备 2 短少数据。这种状况下,备 2 不会产生任何异样日志。show slave status 查看 seconds_behind_master 可能也没有问题。

级联复制批改复制架构导致的问题

级联复制架构下,批改复制架构时操作不当,可能会引起 binlog 事件有限循环复制的问题。上面是一个例子:
原先的复制构造如下:

以后主库为主,因为某个起因,须要下线主,备 1 和备 2 组成新的双向复制架构:

执行的操作如下:
1、备 1 上执行 stop slave;
2、备 2 上执行 show master status,查看以后 binlog 位点
3、备 1 上执行 change master to 备 2,指向步骤 2 获取到的 binlog 位点。

如果执行上述的第 2 步的时候,备 2 上有提早,那么获取到的位点之后,可能还会产生 server_id 为 100 的 binlog 事件(从备 1 上复制过去的,来源于主的事物),当备 1 复制指向备 2 时,这些 server_id 为 100 的事件,就可能会始终循环执行。具体是否会循环执行,还依赖于 binlog 格局以及具体的事件。
在 row 模式下,如果是 insert 事件,且波及的表无主键和惟一束缚,insert 会始终循环执行。
在 statement 模式下,如果是 update 语句(update t set c = c + 1),则该 update 语句会始终循环执行。

复制架构中存在环路的状况下,批改 server_id 也可能会产生相似的问题。
这类问题须要从源头上防止:
1、保障 server_id 全局惟一。
2、不随便批改 server_id。
3、批改复制架构时,如果备库存在提早,须要特地留神。
4、开启 GTID。如果开启了 GTID,则不会反复执行事务。

更多技术信息请查看云掣官网 https://yunche.pro/?t=yrgw

正文完
 0