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

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

问题分析
1.检查binlog_expire_logs_auto_purge参数
binlog_expire_logs_auto_purge 设置为on,说明开启了自动清理过期的 binglog

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

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等存储引擎表

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

解决方案
在xtrabackup备份完毕后,调用一次 flush binlog logs 命令,从而实现对过期binlog日志的清理
总结
- xtrabackup产生lock instance for backup锁导致purge binary log 执行失败无法清理过期binlog 日志
- 非xtrabackup时段,由于业务量产生少,没有产生binlog切换,所以也没有清理掉过期的binglog日志
参考文档
https://support.enmotech.com/article/search/8491
https://bugs.mysql.com/bug.php?id=103684




