MySQL 5.5与MariaDB 10.2主从复制中继日志写入失败求助
我碰到过好几个类似跨版本+Docker部署的主从复制场景,很容易因为环境差异触发Relay log write failure: could not queue event from master这个错误。结合你的配置信息,咱们一步步排查解决:
1. 先排查磁盘空间问题(最常见原因)
Docker容器的存储依赖宿主机磁盘,或者你挂载的外部卷,一旦磁盘满了,中继日志根本写不进去。
- 检查宿主机磁盘使用情况:
df -h - 进入Docker容器内部检查磁盘:
docker exec <你的MariaDB容器名/ID> df -h
如果发现磁盘使用率接近100%,清理无用文件(比如旧的binlog、中继日志,或者宿主机的垃圾文件),或者扩容磁盘空间。
2. 检查中继日志目录的权限
Docker容器内的MariaDB进程默认以mysql用户运行,如果挂载的目录权限不对,会导致无法写入中继日志。
- 查看容器内中继日志所在目录的权限(默认是
/var/lib/mysql/):docker exec <你的MariaDB容器名/ID> ls -l /var/lib/mysql/ | grep relay - 如果权限不是
mysql:mysql,修改权限:docker exec <你的MariaDB容器名/ID> chown -R mysql:mysql /var/lib/mysql/
另外,如果你是用外部卷挂载/var/lib/mysql,启动容器时要确保卷的权限正确,或者添加--user mysql参数(注意有些场景下可能需要调整宿主机卷的权限)。
3. 排查跨版本兼容性问题
MySQL 5.5和MariaDB 10.2虽然兼容,但部分binlog事件格式可能存在差异:
- 先检查主库的binlog格式:
-- 在MySQL主库执行 SHOW VARIABLES LIKE 'binlog_format';
如果是STATEMENT格式,建议改成MIXED或者ROW(注意:切换格式前要评估业务影响,比如某些依赖SQL上下文的业务可能需要调整):
SET GLOBAL binlog_format = 'MIXED'; -- 永久生效需要修改主库my.cnf,添加binlog_format=MIXED,然后重启主库
- 可以用
mysqlbinlog工具解析主库的binlog,查看是否有MariaDB 10.2无法识别的事件:mysqlbinlog --no-defaults /path/to/mysql-bin.xxxxxx
4. 检查主从连接与网络稳定性
网络波动或者主从连接异常可能导致从库接收的binlog事件不完整,触发写入失败:
- 在MariaDB从库查看复制状态:
SHOW SLAVE STATUS\G
重点看Slave_IO_Running是否为Yes,以及Last_IO_Error里的错误信息,排查连接问题。
- 测试从库容器到主库的网络连通性:
docker exec <你的MariaDB容器名/ID> ping <主库IP> - 测试复制用户的连接权限:
docker exec <你的MariaDB容器名/ID> mysql -h <主库IP> -u repl -pDuoS123 -e "SELECT 1;"
如果连接失败,检查主库的防火墙、安全组是否开放3306端口,或者复制用户的权限是否正确(你已经创建了repl@'%',但要确认主库是否允许远程连接)。
5. 检查中继日志配置参数
从库的中继日志相关配置可能限制了写入:
- 在MariaDB从库查看中继日志配置:
SHOW VARIABLES LIKE 'relay_log%';
如果relay_log_space_limit设置了较小的值(比如几G),可以调大或者直接注释掉(不限制中继日志大小):
SET GLOBAL relay_log_space_limit = 0; -- 0表示不限制 -- 永久生效需要修改容器内的my.cnf(或者你挂载的配置文件),添加relay_log_space_limit=0,然后重启容器
内容的提问来源于stack exchange,提问作者frodo

