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


    作者:俊达

    主库server_id没有设置

    主库没有设置server_id

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

    主库查看server_id

    mysql> show variables like 'server_id';
    +----------------+-------+
    | Variable_name  | Value |
    +----------------+-------+
    | server_id      | 1     |
    
    • 1
    • 2
    • 3
    • 4
    • 5

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

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

    mysql> set global server_id=234;
    
    • 1

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

    stop slave;
    start slave;
    show slave status\G
    
    • 1
    • 2
    • 3

    备库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
    
    • 1
    • 2
    • 3
    • 4
    • 5

    从错误日志中可以看到无法启动备库的原因:

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

    解决方法:设置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)
    
    • 1
    • 2
    • 3
    • 4
    • 5

    主备库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).
    
    • 1

    解决方法:
    设备库将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

  • 相关阅读:
    前辈经验分享:Linux后台开发调试
    微软出品自动化神器【Playwright+Java】系列(九)多线程、重定向、弹出新窗口、截图、新页面、录制、页面对象模式操作
    blog--4美化主题
    webapi接收text/plain数据(笔记)
    22 VueComponent 响应式处理
    数据结构和算法(4):栈与队列
    Python数据分析步骤(入门学习)
    第二章:求长方体数组,指定区间内的完全数,改进指定区间内的完全数
    【吴恩达机器学习-笔记整理】推荐算法,协同过滤,均值规范化
    12- STM32模数转换器(ADC)
  • 原文地址:https://blog.csdn.net/weixin_43756308/article/details/136249472