MySQL主从复制常见错误解决方式

重构主从:(slave节点)
#清理从库的所有主从状态,执行后请从新构建主从复制操作
stop slave;
reset slave all;
错误一:
mysql> start slave;
ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository

解决:
    reset slave;
错误二:
mysql -uroot -predhat -e "show slave status\G;"
Last_IO_Error: Got fatal error 1236 from master when reading data from binary log: 'Misconfigured master - master server_id is 0'

解决:
    修改server_id,id冲突
错误三:
mysql -uroot -predhat -e "show slave status\G;"
The replication receiver thread cannot start because the master has GTID_MODE = ON and this server has GTID_MODE = OFF

解决:
    主从节点GTID开启不一致
错误四:(1236错误)
在slave上通过set global gtid_purged='xxxx'的方式,跳过已经purge的部分
GTID故障范例:https://www.cnblogs.com/cenalulu/p/4309009.html
错误1236
Got fatal error 1236 from master when reading data from binary log: 'The slave is connecting using CHANGE MASTER TO MASTER_AUTO_POSITION = 1, but the master has purged binary logs containing GTIDs that the slave requires.'

解决:

1,不需要重新搭建主从的方式,对于主从复制报错,出现问题,虽然重新搭建主从是万能法,但尽量尝试其它方式,因为对于大数据量数据库,重新搭建主从需要耗费很长时间。

在主库上执行

mysql>show global variables like '%gtid_purged%';

或

show global variables like '%gtid%'\G

查看主库的gtid_purged的value值。

在从库上也执行该命令,查看gtid_purged值是否和主库相同,如果小于主库的值如下。

2,在从库上执行

mysql>stop slave;

mysql>set @@global.gtid_purged='主库查询到的value值';   #'set @@global.gtid_purged='a95d8cb2-3ff7-11e9-8bfa-000c299b47f8:16-23';

mysql>begin;commit;

mysql>set gtid_next='automatic';

mysql>start slave;

查看一下主从状态。

mysql>show slave status\G;

这时的主从状态,SQL线程和IO线程都是yes了。
一般两种情况会出现以上现象
1.在主库上手动执行清除二进制日志文件
2.主库重启,重新同步时
二、解决方法:
1.在主库上执行以下命令,查询gtid_purged,记录下改值
mysql> show global variables like '%gtid%'\G
wKiom1hTZpKCU8WoAABPgzDyrTQ054.png
2.在从库上执行以下命令,查询已经执行过的gtid即gtid_executed,记录下主库的值,本机的不需要
wKioL1hTZp-DQZMvAAAspE0SKJ8150.png
3.在从库上执行以下命令停止同步线程及重置同步相关信息
mysql> stop slave;
mysql> reset slave;
mysql> reset master;
4.在从库上设置gtid_purged
该值有两个来源,一是在主库上查询的gtid_purged,二是在从库上查询的已经执行过的gtid_executed值(本机的就不需要,主库上gtid)
注意:一定记得加上从库上已经执行过的gtid,若只设置了主库上的gtid_purged,此时从库会重新拉取主库上所有的二进制日志文件,同步过程会出现其他错误,导致同步无法进行
mysql> set @@global.gtid_purged='4fa9ab33-3077-11e6-8ee6-fcaa14d0751b:1-18240458,6e41a42e-8529-11e6-b72e-fcaa14d07546:1-56604052:56604054-56605629:56605631-56871196,9850e381-b601-11e6-8e46-fcaa14d07546:1-3126210,c5cdcae2-9cb0-11e6-909c-fcaa14d0751b:1-1189,10a59961-c02d-11e6-a2de-fcaa14d07546:1-13381418';
注意:设置gtid_purged值时,gtid_executed值必须为空否则报错,该值清空的方法就是reset  master命令
执行完,再次查看相关信息
错误五:(1008错误)
错误:1008
    # 因为在从库执行了SQL操作,导致主从同步删除olda库时不存在
    Last_SQL_Errno: 1008
    Last_SQL_Error: Error 'Can't drop database 'olda'; database doesn't exist' on query. Default database: 'olda'. Query: 'drop database olda'

解决:
    如果是传统主从binlog模式:
        stop slave ;
        set global sql_slave_skip_counter=1;
        start slave;

    如果是GTID模式主从:
        # 查看主库的事务ID号
        mysql> show master status;
        +------------------+----------+--------------+------------------+-------------------------------------------+
        | File             | Position | Binlog_Do_DB | Binlog_Ignore_DB | Executed_Gtid_Set                         |
        +------------------+----------+--------------+------------------+-------------------------------------------+
        | mysql-bin.000001 |     3174 |              |                  | 53139cb7-c043-11e9-951e-000c291f7490:1-16 |
        +------------------+----------+--------------+------------------+-------------------------------------------+
        # 跳过事务到那个主库的的事务号
        set gtid_next='53139cb7-c043-11e9-951e-000c291f7490:16';
        begin;commit;
        set gtid_next="automatic";
        start slave;
「点点赞赏,手留余香」

    还没有人赞赏,快来当第一个赞赏的人吧!
0 条回复 A 作者 M 管理员
    所有的伟大,都源于一个勇敢的开始!
欢迎您,新朋友,感谢参与互动!欢迎您 {{author}},您在本站有{{commentsCount}}条评论