Got fatal error 1236 from master when reading data from binary log 解决方案

我在之前的一篇文章讲到过如何给mariadb做主从同步(mysql也同理但是不推荐mysql,二进制包安装没有mariadb简单…)但是,由于是实验环境进行配置所以不会遇到以上错误。不过先来说说发生这个错误的原因:

错误原因:

这个报错主要是指slave端无法读取master端的二进制日志,其实你应该打开slave端并且输入:SHOW SLAVE STATUS\G; 来查看slave的运行情况,并且查找这句话(靠顶部的位置)Slave_IO_Running:  一般正常会显示YES但是如果出现错误会显示NO。出现这种情况有两种原因:首先第一种网络问题,那么第二种问题会出现在非实验环境中,正常首先输入SHOW MASTER STATUS查看二进制日志,随后到从服务器中来追溯打印出的二进制日志的文件名和ID。但是可能会遇到这个情况在你手动进行配置从服务器的时候,主服务器收到多条插入语句并且执行导致二进制日志的ID号码改变甚至文件名改变。那么在slave端执行同步命令后查看SHOW SLAVE STSTUS\G; 后会看到Slave_IO_Running: NO并且在下面同步选项会有报错信息就是:Got fatal error 1236 from master when reading data from binary log.

解决方案:

首先在slave端停止slave运行:

SLVAE STOP;

停止之后,我的建议是将master端的mariadb增加防火墙并且DROP 对外网卡的3306端口(当然可能你设置的其他端口,记得主从同步的内部网卡可别DROP掉,或者允许从库地址访问端口。)为的就是不再进行数据的大量插入从而改变ID号码。

随后在master localhost中再次查看ID号码,随后使用slave进行同步:

SHOW MASTER STATUS;
+-------------------+----------+--------------+-------------------------------------------+
 | File | Position | Binlog_Do_DB | Binlog_Ignore_DB |
 +-------------------+----------+--------------+-------------------------------------------+
 | MASTER-bin.000010 | 106 | | information_schema,mysql |
 +-------------------+----------+--------------+-------------------------------------------+
#随后我们回到slave上面去:
CHANGE MASTER TO MASTER_LOG_FILE='MASTER-bin.000010',MASTER_LOG_POS=106;
SLAVE START;
SHOW SLAVE STATUS\G; #查看一下Slave_IO_Running:是否为YES?

如果上述执行还是失败,首先在master上面执行FLUSH LOGS; 并且输入SHOW MASTER STATUS;进行查看二进制日志文件名和ID然后回到SLAVE上面去进行上述操作。最后别忘了将被DROP 3306端口策略删除!

结语:

遇到这种问题基本都是正在使用的mariadb中进行配置主从,所以我的建议是在配置的时候先写个脚本对master端的对外网卡的3306端口进行临时的DROP,记得主从同步的内部网卡可别DROP掉!或者允许从库地址访问端口。随后重启mariadb主库,然后再去从库中操作。这样就保证主库被插入数据。但是这样在生产环境中就非常麻烦,有没有办法不通过二进制日志进行设置同步呢?答案是必须有的,下一篇我来说说给予GTID形式进行复制!

Comments

Leave a Reply

Your email address will not be published. Name and email are required