在这个博客中,我解释如何从复制故障引起的损坏继电器恢复日志文件。
MySQL副本存储数据来自源头的二进制日志的中继日志文件。这个文件可能损坏,由于各种原因,主要是硬件故障。如果发生这种情况,复制将停止工作,和复制的错误日志条目类似于:
|
1
2
3
4
|
2022年- - - - - -05年- - - - - -12个病人
:
32
:
07.282374 z
2
(
错误
]
错误
在
Log_event
:
:
read_log_event
(
)
:
“事件太小”
,
data_len
:
0
,
event_type
:
0
2022年- - - - - -05年- - - - - -12个病人
:
32
:
07.282386 z
2
(
错误
]
错误
阅读
继电器
日志
事件
为
通道
”
:
奴隶
SQL
线程
流产
因为
的
我/O
。
。
。
2022年- - - - - -05年- - - - - -12个病人
:
32
:
07.282396 z
2
(
错误
]
奴隶
SQL
为
通道
”
:
继电器
日志
读
失败
:
可以
不
解析
继电器
日志
事件
条目
。
的
可能的
原因
是
:
的
主
的二进制日志损坏(你可以通过运行”
mysqlbinlog
二进制日志),奴隶的
年代
继电器
日志
是
损坏
(
你
可以
检查
这
通过
运行
“mysqlbinlog”
在
的
继电器
日志
)
,
一个
网络
问题
,
或
一个
错误
在
的
主
“年代或奴隶”
年代
MySQL
代码
。
如果
你
想要
来
检查
的
主
的二进制日志或奴隶的
年代
继电器
日志
,
你
将
是
能力
来
知道
他们的
的名字
通过
发行
“显示奴隶状态”
在
这
奴隶
。
Error_code
:
1594年
|
一旦你执行建议检查,发现失败的原因是,事实上,腐败继电器的日志文件,你可以通过重置副本恢复复制。
首先,您必须确保源服务器的二进制日志不损坏。你可以做这个的帮助下mysqlbinlog命令。简单地运行它在二进制日志,确保它不会失败的错误。
找出当前的二进制日志,运行命令显示副本状态(或显示奴隶状态如果您正在运行MySQL,比8.0.22)。
然后找到的价值Relay_Source_Log_File(Relay_Master_Log_File):
|
1
|
Relay_Source_Log_File
:
mysql- - - - - -本
。
000002年
|
这将是二进制日志的副本SQL线程执行最后一个语句。
同时,注意到的价值Exec_Source_Log_Pos(Exec_Master_Log_Pos):最新的执行位置。这将为下一个步骤是必要的。
如果您使用的是GTIDs,你需要找到包含最后一个GTID二进制日志Executed_Gtid_Set。
一旦你确保源的二进制日志文件是健康的,你可以运行重置副本(重置的奴隶)语句。在描述https://dev.mysql.com/doc/refman/8.0/en/reset-replica.html”,它清除复制元数据存储库,删除所有中继日志文件,并开始一个新的中继日志文件。也重置为0的复制延迟指定SOURCE_DELAY | MASTER_DELAY选项的改变复制源(从MySQL 8.0.23)或声明改变主声明(MySQL 8.0.23之前)。”
所以你需要运行改变复制源来(或改变主来)命令。如果你使用定位复制的副本Relay_Source_Log_File和Exec_Source_Log_Pos上一步中记录。
对于GTID-based副本,使用SOURCE_AUTO_POSITION=1(MASTER_AUTO_POSITION=1)。
结论
中继日志文件的副本存储变化,可以从源服务器检索。因此安全移除损坏继电器日志文件的帮助下重置副本声明,然后允许复制重新加载数据从源服务器上的二进制日志文件。检查如果源服务器没有在执行此操作之前冲洗所需的二进制日志。






