MariaDB主从复制数周偶发中断、Relay log读取失败问题咨询
MariaDB主从复制周期性中断故障解决方案
故障核心特征
报错日志关键信息:
2021-09-06 14:15:52 11 [ERROR] Slave SQL: Relay log read failure: Could not parse relay log event entry. Internal MariaDB error code: 1594 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log 'mariadb-bin.000054' position 466175364伴随现象:每隔数周触发一次故障,故障发生时从库mysqld进程消失,/var/lib/mysql目录下存在数千个未清理的mysqld-relay-bin中继日志文件,使用MariaDB 10.3.18版本。
根因定位
- 最高概率原因:从库中继日志自动清理机制未开启,数周时间积累的中继日志占满磁盘空间,导致mysqld进程被系统OOM杀掉或主动异常退出,异常退出过程中正在写入的中继日志出现部分损坏,下次启动时就会抛出1594号错误。
- 次大概率原因:主从之间网络存在周期性波动,主库binlog发送过程中出现丢包,导致从库接收的中继日志写入不完整产生损坏。
- 小概率原因:MariaDB 10.3.18版本存在复制相关的已知BUG,长时间运行后会出现中继日志写入异常。
故障修复步骤
临时恢复复制流程
- 登录从库执行
SHOW SLAVE STATUS\G,记录Relay_Master_Log_File和Exec_Master_Log_Pos两个字段的值,本次故障对应值为mariadb-bin.000054和466175364 - 停止从库复制:
STOP SLAVE; - 重置从库损坏的中继日志:
RESET SLAVE; - 重新配置复制位点,替换为实际的主库连接信息和上一步记录的位点:
CHANGE MASTER TO MASTER_HOST='你的主库IP地址', MASTER_USER='复制账号用户名', MASTER_PASSWORD='复制账号密码', MASTER_LOG_FILE='mariadb-bin.000054', MASTER_LOG_POS=466175364;
- 启动从库复制:
START SLAVE; - 执行
SHOW SLAVE STATUS\G确认Slave_IO_Running和Slave_SQL_Running两个字段值均为Yes,说明复制已恢复正常。
永久规避故障配置
- 开启中继日志自动清理:在从库的my.cnf配置文件中添加
relay_log_purge = 1,该参数默认开启,若之前被手动关闭必须改回,开启后会自动删除已经执行完成的中继日志,避免日志无限制积累。 - 限制单条中继日志大小:添加配置
max_relay_log_size = 1G,单个中继日志达到1G就自动滚动,避免单文件过大损坏后影响范围过大。 - 升级稳定版本:若调整配置后仍然出现周期性故障,可以将MariaDB升级到10.3分支的最新稳定版,修复已知的复制相关BUG。
- 配置磁盘监控:对从库/var/lib/mysql挂载的磁盘配置使用率告警,使用率超过80%时及时处理,避免磁盘占满导致mysqld进程异常退出。
内容的提问来源于stack exchange,提问作者Sebastian Dziedzic
相关产品推荐
相关产品推荐

