> 文档中心 > MySQL 主从relay日志损坏恢复

MySQL 主从relay日志损坏恢复

别怕!MySQL从库接力日志坏了,这下有救了!

听说 MySQL主从同步出了问题,从库报错error 1594, relay日志坏了,是不是愁坏了?别担心,这回有办法了!

之前老办法得重建从库,这要花上老半天时间, especially 当数据量大的时候,那叫一个心塞。但现在有了GTID,这事儿就简单多了!

GTID,全称 Global Transaction Identifier,简单概括就是每个事务都有个独一无二的ID,这样主从之间的日志传输就有了“聪明的导航”。从库只需告诉主库它已经执行过哪些GTID,主库就会自动过滤,只发没执行过的日志过来,这样数据就完美一致了。

那该怎么操作呢?几步走:

1. 先备个份,看看当前同步状态:
show slave statusG

select * from mysql.slave_relay_log_infoG

select * from mysql.slave_master_infoG

2. 关闭复制进程
stop slave;

3. 重置复制进程,不要用 reset slave all,因为这会把所有配置信息都清空,只用:
reset slave;

4. 最后启动复制进程:
start slave;

这样,从头来过,主从同步就恢复了,再也不用担心relay日志损坏的问题啦!是不是简单又高效?

版本:

        MySQL-5.7.32+GTID

问题:

        MySQL主从同步由于relay日志损坏,导致从库复制报错error: 1594

问题分析:

        在遇到从库relay日志损坏时,重建从库是其中的一个修复办法之一,但该方法的消耗的时间长,效率低,如果遇到数据量大的库,修复时间可能要1个小时以上

        其实,对于从库relay日志损坏,完全可以不用重建从库,在基于GTID的主从同步中,复制进程开启master_auto_position的情况下,从库会将当前已经执行过的gtid集合发送给主库,主库接收到从库发送的gtid集合后,会在现有的binlog里面进行比对,将从库没有执行过的gtid发送给备库,从而保证数据的一致性

 

        所以,在遇到relay日志损坏,只需要重置复制进程,重新拉取主库的日志就行。

问题解决:

        备份当前从库的同步状态信息       

        

show slave status\Gselect * from mysql.slave_relay_log_info\Gselect * from mysql. slave_master_info 

       

        关闭复制进程

stop slave;

         重置复制进程,会清空当前从库全部的relay log,不要使用reset slave all,因为在5.7.24之后,在master_info_repoistory=table的情况下,reset slave会将连接信息保留在内存里面,不需要重新设置change master,而reset slave all会清空全部的relay log以及配置信息

        重置命令

reset slave;

 

        重新开启复制进程,主从同步恢复 

start slave;