暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

MySQL 8.0 超过 binlog_expire_logs_seconds 后过期的binlog日志竟然没有自动清理

原创 柚子身上依 2024-07-22
885

适用范围

建议mysql 8.0.29 及以上版本

问题概述

binlog_expire_logs_seconds 设置为 604800 秒(7天),但是查看 binlog目录下面的日志文件,超过7天的仍然在保留;其中 expire_logs_days 设置为了0,说明此参数不生效,并且在mysql 8.0中已经不建议使用,后面版本会废弃掉

image.png

在启动mysql时、flush binary log时进行自动清理过期日志
image.png

问题分析

1.检查binlog_expire_logs_auto_purge参数

binlog_expire_logs_auto_purge 设置为on,说明开启了自动清理过期的 binglog
b683e0c6b80e0bfb683038aa71c33fb.jpg

在8.0.29开始可以通过设置binlog_expire_logs_auto_purge开启binlog 是否自动清理,默认开启
image.png

2.检查error log

日志中存在下面的警告信息,通过参考 https://bugs.mysql.com/bug.php?id=103684 可以知道在查询表 SELECT * FROM performance_schema.keyring_component_status时会产生,但是平常没有人查询这张表,考虑到是不是备份时会查询这张表引起的,通过检查发现存在xtrabackup备份

[Warning] [MY-013712] [Server] No suitable 'keyring_component_metadata_query' service implementation found to fulfill the request 

3.检查xtrabackup

通过查看crontab定时任务发现每天凌晨进行定时备份,并且每次备份时都会产生一条 [Warning] [MY-013712] [Server] No suitable ‘keyring_component_metadata_query’ service implementation found to fulfill the request 告警,说明此告警确实是备份时产生,手工查询 performance_schema.keyring_component_status表同样会产生一条告警

4.xtrabackup备份会导致binary log无法清理吗

xtrabackup在备份时会先获取lock instance for backup锁,此备份锁会阻止其他会话进行repair table 、truncate table 、optimizet table 及账户管理的语句,也会阻止进行 purge binary logs; xtrabackup在备份过程中会执行 flush no_write_to_binlog binary logs 进行切换binlog log到下一个日志,在进行 flush binary logs过程中触发执行purge binary log ,但是由于产生了lock instance for backup锁,导致purge binary log 执行失败,error日志中未产生报错信息,但是自己手工测试会产生报错信息

mysql> lock instance for backup;
mysql> purge binary logs to 'master-bin.000284';
mysql> ERROR 4085 (HY000): Could not purge binary logs since another session is executing LOCK INSTANCE FOR BACKUP. Wait for that session to release the lock.

xtabackup 在备份MySQL 8.0.32 时流程如下,同时存在 innnodb,Myisam等存储引擎表
image.png

5.为什么非xtrabackup时段未进行清理

max_binlog_size 是500M,说明在日志大小超过 500M 时才会自动切换日志,并且触发 purge binlog log操作清理超过 binlog_expire_logs_seconds 时间的过期binlog 日志 ;由于每天的业务量产生的日志量很小达不到500M,检查binglog目录下面日志文件,发现日志文件都很小,均不超过50M;并且在每天凌晨进行xtrbackup 备份,所以日志又会切换,导致在非xtrabackup时段无法达到500M从而无法触发清理过期binlog的操作
image.png

解决方案

在xtrabackup备份完毕后,调用一次 flush binlog logs 命令,从而实现对过期binlog日志的清理

总结

  1. xtrabackup产生lock instance for backup锁导致purge binary log 执行失败无法清理过期binlog 日志
  2. 非xtrabackup时段,由于业务量产生少,没有产生binlog切换,所以也没有清理掉过期的binglog日志

参考文档

https://support.enmotech.com/article/search/8491
https://bugs.mysql.com/bug.php?id=103684

最后修改时间:2024-07-23 10:33:30
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论