mysql主从不同步

明天就要放端午小长假了,晚上还不得休息。最近在帮公司弄微信公众服务号,里面有个会员卡管理,然后需要整合到公司OA里。晚上测试时发现公司MYSQL上修改后,Slave没有相应进行同步。

仔细检查,发现从机上的file和position都和主服务器上是一致的,而且在从服务器上运行:show slave status\G 发现Slave_IO_Running: Yes
Slave_SQL_Running: Yes
也都是正常的,而且很奇怪,在测试时发现有时能同步,有时不能同步。一开始以为是主/从间网络问题,但最终确定不是。

查阅了很多资料,在MySQL的主从环境中通过在slave上执行show slave status来查看slave的一些状态信息,其中有一个比较重要的参数Seconds_Behind_Master。有些资料上说这个值为0就代表主从已经处于一致了,这种理解是错误的。因为天南在上面的测试过程中发现,Seconds_Behind_Master一直为0,但slave并没有同步。

首先我们需要明白的一点:Seconds_Behind_Master表示slave上SQL thread与IO thread之间的延迟,我们都知道在MySQL的复制环境中,slave先从master上将binlog拉取到本地(通过IO thread),然后通过SQL thread将binlog重放,而Seconds_Behind_Master表示本地relaylog中未被执行完的那部分的差值。那么Seconds_Behind_Master的值为0是否表示主从已经处于一致了呢?答案几乎是否定的!为什么几乎是否定的?因为绝大部分的情况下复制都是异步的,异步就意味着master上的binlog不是实时的发送到slave上,所以即使Seconds_Behind_Master的值为0依然不能肯定主从处于一致。所以如果我们要以这个参数来估计主从延迟多久的话至少得在一个比较好的网络环境中,这样才能保证几乎master上的binlog都已经发送到slave上。

上面解释了Seconds_Behind_Master这个值的真正含义,那么它的值到底是怎么计算出来的呢?实际上在binlog中每个binlog events都会附上执行时的timestamp,所以在在确定Seconds_Behind_Master的值时MySQL是通过比较当前系统的时间戳与当前SQL thread正在执行的binlog event的上的时间戳做比较,这个差值就是Seconds_Behind_Master的值。也许你会有疑问那要是两台服务器之间的时钟不一致怎么办?确实会存在这种情况,那么此时这个值的可靠性就不大了。主/从系统时间一定要同步,天南这次遇到的就是Slave时间比Master时间快10几分钟,造成主从不能正常同步。

Seconds_Behind_Master的值除了是非负数之外还可能是NULL,它是由如下几种情况导致的:SQL thread没运行/IO thread没运行/slave没有连接到master。

发布者:天南

一个好人

留下评论

电子邮件地址不会被公开。 必填项已用*标注