背景
Centos 7.9
mysql 5.7.43
同事误删除MySQL主库全部bin-log日志,导致MySQL主库无法启动;删除MySQL从库全部relay-bin日志,导致MySQL主从同步失效,且重新配置主从信息报错。
一、MySQL主库删除所有二进制日志,导致MySQL无法启动
这种情况处理很简单,只需要将datadir目录中记录二进制日志文件的index文件清空即可重启MySQL。
二、MySQL从库删除全部relay-bin日志,导致MySQL主从同步失效,且重新配置主从信息报错
从库删除relay-bin日志导致主从同步故障,为保证数据一致,可继续部署主从同步,决定先停止slave,重新配置主从复制。
首先,执行stop slave停止主从复制,然后按照常规流程部署主从复制,删除从库旧数据库,将主库数据库导出sql文件后,再导入到从库中,保证数据一致。
然后,执行配置同步信息语句:
CHANGE MSTER TO MASTER_USER='XXX',MASTER_PASSWORD='XXX',MASTER_HOST='X.X.X.X',MASTER_PORT=XXX,MASTER_LOG_FILE='mysql-bin.000003',MASTER_LOG_POS=154;
发现报错1:ERROR 1373 (HY000): Target log not found in binlog index
通过排查:
1、查看MySQL日志,发现报错 [ERROR] Failed to locate old binlog or relay log files
2、主库的log-bin.index文件和从库的log-bin.index、relay-log.index文件发现与数据目录下的二进制日志文件和中继日志文件对应,没有问题。
3、因为之前运行正常,文件权限没有变动,再次确认权限后,没有问题。
4、进入数据库执行reset slave和reset slave all后继续报错 ERROR 1373 (HY000): Target log not found in binlog index 无法执行。
5、进入数据库执行 show slave status\G,查看复制状态,发现同步连接信息中指向主库的连接信息生效,但是Relay_Log_File在用的文件不对!依旧用的旧relay-log文件!找到问题!
但是,此时relay-log已经被清除,现有的relay-log文件与index文件对应正确,且无法执行reset slave和reset slave all。
只能尝试重启数据库了,然后再查询当前slave状态,发现调用relay文件没变,但是没有打印报错信息。
继续尝试重新配置change master to同步信息语句,发现执成功,不再报错!而且relay-log日志重置成功!
执行start slvae 启动同步复制!发现无法启动同步,有新的报错!
报错信息2 ERROR 1872 (HY000): Slave failed to initialize relay log info structure from the repository
根据提示,猜测原因是slave无法从存储库初始化relay log。
经过查询了解到mysql.slave_relay_log_info表依旧记录的是旧的复制信息,导致新的从库启动时无法找到对应文件和信息,所以需要清除mysql.slave_relay_log_info表的信息,执行reset slave语句清除,不要执行ddl语句!执行成功!恢复主从!
总结:重启MySQL服务,清除缓存,恢复调用正确的relay-log,很关键!然后执行reset slave清除mysql.slave_relay_log_info表的信息即可 。reset slave all会将mysql.slave_relay_log_info表都清空,包括change master to的信息!所以如果执行reset slave all还需执行chnge master to。