MySQL运维实战(7.2) MySQL复制server_id相关问题

俊达10个月前技术文章280

主库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相同的问题。


server_id_ring.png

如上图的例子中,主和备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,则不会重复执行事务。



相关文章

MySQL运维实战(5.6) 字符集设置对mysqldump的影响

mysqldump不指定字符集不指定字符集时,默认使用了utf8。可能和环境有关系。mysqldump -uroot test test_load >&n...

MySQL运维实战(4.3) SQL_MODE之ONLY_FULL_GROUP_BY

设置ONLY_FULL_GROUP_BY后,对有group by子句SQL,select的字段要么是group by中的字段,要么对字段进行聚合运算,否则sql执行报错。不设置ONLY_FULL_GR...

MySQL运维实战(6)用户认证插件caching_sha2_password

MySQL用户认证可以使用几种不同的方式,创建用户时可以制定认证方式:create user 'username'@'%' identif...

MySQL运维实战之备份和恢复(8.4)xtrabackup恢复全量备份

恢复全量备份恢复全量备份大致可以分成以下几步:解压备份文件、prepare备份文件、将数据copy到目标实例相关目录、启动数据库实例。解压文件如果备份时使用了xbstream,需要先解压备份文件。我们...

MySQL运维实战(4.1) MySQL表存储引擎

MySQL表的特点和其他数据库如Oracle、SQL Server相比,mysql有一些特点:MySQL使用插件式存储引擎,同一个数据库中的表可以使用不同的存储引擎。存储引擎决定了表的物理存储格式。表...

MySQL运维实战之备份和恢复(8.5)xtrabackup恢复增量备份

恢复增量备份时,需要先对基础全量备份进行恢复,然后再依次按增量备份的时间进行恢复。这个例子中,相关备份文件的目录结构如下:/data/backup ├── full │ &nb...

发表评论    

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。