本文主要内容如下:
一、现象
最近项目的测试环境遇到一个主备同步的问题:
备库的同步线程停止了,无法同步主库的数据更改。
备库报错如下:
完整的错误信息:
Relay log read failure: Could not parse relay log event entry. The possible reasons are: the master's binary log is corrupted (you can check this by running 'mysqlbinlog' on the binary log), the slave's relay log is corrupted (you can check this by running 'mysqlbinlog' on the relay log), a network problem, or a bug in the master's or slave's MySQL code. If you want to check the master's binary log or slave's relay log, you will be able to know their names by issuing 'SHOW SLAVE STATUS' on this slave.
上面的报错信息是什么意思呢?
翻译一下就是主库的 binlog 或者从库的 relay log 损坏了,造成这个问题的原因:
- 可能是网络问题。
- 也可能是主库或备库的代码 bug。
首先我们还是得复习下主从同步的原理才能更好地分析原因。
二、主从同步的原理
首先我们还是得复习下主从同步的原理才能更好地分析原因。
- 从库会生成两个线程,一个 I/O 线程,名字叫做 Slave_IO_Running,另外一个是 SQL 线程,名字叫做 Slave_SQL_Running;
- 从库的 I/O 线程会去请求主库的 binlog 日志文件,并将得到的 binlog 日志文件写到本地的 relay-log (中继日志)文件中;
- 主库会生成一个 dump 线程,用来给从库 I/O 线程传 binlog;
- 从库 SQL 线程,会读取 relay log 文件中的日志,并解析成 SQL 语句逐一执行。
三、排查思路
3.1 分析从库的同步状态
我们可以打印下从库的同步状态,看到如下几个关键信息:
Master_Log_File
: mysql-bin.000956,代表从库读到的主库的 binlog file,
Read_Master_Log_Pos
: 528071913,代表从库读到的主库的 binlog file 的日志偏移量
Relay_Log_File
: relay-bin.000094,代表从库执行到了哪一个 relay log
Relay_Log_Pos
: 123408769,代表从库执行的 relay log file 的日志偏移量
Relay_Master_Log_File
: mysql-bin.000955,代表从库已经重放到了主库的哪个 binlog file。
Exec_Master_Log_Pos
: 123408556,代表从库已经重放到了主库 b