首页 > 数据库 >MySQL binlog超过binlog_expire_logs_seconds阈值没有删除案例

MySQL binlog超过binlog_expire_logs_seconds阈值没有删除案例

时间:2024-04-11 21:22:42浏览次数:22  
标签:binlog 00 logs 10 seconds mysql MySQL

生产环境有一套3个节点的MySQL InnoDB Cluster,MySQL的版本为Server version: 8.0.35 MySQL Community Server - GPL, 早上突然收到Zabbix的告警,其中一个节点出现空间告警:"/data: Disk space is low (used > 80%)"

检查分析后发现是因为MySQL的binlog没有清理导致空间报警,如下所示(binlog太多,省略了部分内容)

$ du -sh *
78G     bin_logs
12K     conf
7.3G    data
132K    logs
4.0K    mysql.pid
0       mysql_temp
4.0K    slow_logs
$ cd bin_logs
$ ls -lrt
total 81783492
-rw-r----- 1 mysql mysql  909802606 Jan  9 00:10 mysql_binlog.000011
-rw-r----- 1 mysql mysql  984228474 Jan 10 00:10 mysql_binlog.000012
-rw-r----- 1 mysql mysql  980302993 Jan 11 00:10 mysql_binlog.000013
-rw-r----- 1 mysql mysql  985147519 Jan 12 00:10 mysql_binlog.000014
-rw-r----- 1 mysql mysql  962232624 Jan 13 00:10 mysql_binlog.000015
....................................................
....................................................
-rw-r----- 1 mysql mysql  891703862 Apr  7 00:10 mysql_binlog.000101
-rw-r----- 1 mysql mysql  920700543 Apr  8 00:10 mysql_binlog.000102
-rw-r----- 1 mysql mysql  921675101 Apr  9 00:10 mysql_binlog.000103
-rw-r----- 1 mysql mysql       3854 Apr  9 00:10 mysql_binlog.index
-rw-r----- 1 mysql mysql  330341220 Apr  9 09:30 mysql_binlog.000104

检查三个节点(姑且用node1, node2, node3表示),发现其它两个节点(node1,node2)的binlog都正常清理了,而唯独节点node3的binlog一直没有被清理。三个节点的MySQL系统变量是一致的,如下所示,

mysql> show variables like 'binlog_expire_logs_seconds';
+----------------------------+---------+
| Variable_name              | Value   |
+----------------------------+---------+
| binlog_expire_logs_seconds | 1209600 |
+----------------------------+---------+
1 row in set (0.00 sec)

mysql> show variables like 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 0     |
+------------------+-------+
1 row in set (0.00 sec)

mysql> 

binlog_expire_logs_seconds设置为1209600,也就是14天,超过14天的binlog应该被清理掉,但是检查发现node3上超过14天的binlog并没有被清理。那么为什么节点node3上的过期的binlog没有被清理呢?

首先,这三个节点的MySQL数据库版本是一致的,出现问题的节点node3是MySQL InnoDB集群的备库,我们在这个节点上做Xtrabackup备份。

其次,我们检查MySQL错误日志,其实每天作业做Xtrabackup备份时,都会收到类似下面告警邮件

2024-04-09T00:10:03.078285+08:00 357726 [Warning] [MY-013712] [Server] No suitable 'keyring_component_metadata_query' service implementation found to fulfill the request.
2024-04-09T00:10:12.066464+08:00 357726 [Warning] [MY-014054] [Server] Could not purge binary logs since another session is executing LOCK INSTANCE FOR BACKUP. Wait for that session to release the lock.

出现这个告警信息,之前也查过,官方文档提示,当对MySQL实例发出LOCK INSTANCE FOR BACKUP语句期间,PURGE BINARY LOGS是不允许的,因为它会从服务器中删除文件(删除binlog文件),违反了备份锁(backup lock)的规则。从MySQL 8.0.28开始,这个是不允许的。具体的官方文档[1]信息如下所示:

PURGE BINARY LOGS should not be issued while a LOCK INSTANCE FOR BACKUP statement is in effect for the instance, because it contravenes the rules of the backup lock by removing files from the server. From MySQL 8.0.28, this is disallowed.

因为Xtrabackup备份时,它会执行FLUSH NO_WRITE_TO_BINLOG BINARY LOGS命令,它会轮换二进制日志(rotate the binlog),这实质上将创建一个新的二进制日志,而在 轮换二进制日志时,就会触发PURGE BINARY LOGS,而由于当前MySQL版本为MySQL 8.0.35,在MySQL进行Xtrabackup时,由于LOCK INSTANCE FOR BACKUP锁,导致PURGE BINARY LOGS是不允许的。所以Xtrabackup期间,我们会收到这个告警,即使binlog出现了轮换,但是也不会触发清理过期的binlog。之前分析过这个告警,但是觉得它没有产生什么异常或问题,就忽略了这个告警。

另外,我们要弄清楚清理过期binlog的原理机制,即使我们设置了系统变量binlog_expire_logs_seconds,不是说一旦binlog的创建时间超过了系统变的binlog_expire_logs_seconds的阈值,就会立即触发MySQL的相关线程去清理过期的binlog。清理过期的binlog,一般发生在MySQL启动时或刷新二进制日志时进行。官方文档[2]的描述如下:

Binary log files are automatically removed after the server's binary log expiration period. Removal of the files can take place at startup and when the binary log is flushed.

我检查系统变量max_binlog_size的大小,如下所示,也就是1G,

mysql> show variables like 'max_binlog_size';
+-----------------+------------+
| Variable_name   | Value      |
+-----------------+------------+
| max_binlog_size | 1073741824 |
+-----------------+------------+
1 row in set (0.01 sec)

mysql>

由于这个系统一天产生的binlog小于1G(可以从上面的binlog的输出信息看出,例如,binlog的大小,binlog的创建时间),也就是说,一天24小时内,MySQL的binlog不会由于binlog过大而触发binlog的切换,也就是说只有Xtrabackup时才触发了binlog的切换,而又由于限制问题,导致过期的binlog不能被清理,久而久之,过期的binlog一直不能清理,直到触发空间告警,问题才被暴露出来。

而其它几套MySQL InnoDB Cluster也有这个问题,但是它们的过期的binlog为什么被清理了呢? 因为它们一天产生的binlog的大小,超过了系统变量max_binlog_size的大小,在其它时间点会轮换/切换binlog,从而触发了PURGE BINARY LOGS。所以就没有遇到这样的问题。

参考资料

[1]

1: https://dev.mysql.com/doc/refman/8.0/en/lock-instance-for-backup.html

[2]

2: https://dev.mysql.com/doc/refman/8.0/en/purge-binary-logs.html

标签:binlog,00,logs,10,seconds,mysql,MySQL
From: https://www.cnblogs.com/kerrycode/p/18130054

相关文章

  • 从零开始写 Docker(十)---实现 mydocker logs 查看容器日志
    本文为从零开始写Docker系列第十篇,实现类似dockerlogs的功能,使得我们能够查查看容器日志。完整代码见:https://github.com/lixd/mydocker欢迎Star推荐阅读以下文章对docker基本实现有一个大致认识:核心原理:深入理解Docker核心原理:Namespace、Cgroups和Rootfs......
  • mysqlbinlog历史sql查询和恢复
    Mysql命令:查看binlog文件showbinarylogs;远程拉取binlog日志mysqlbinlog-umaxen-p-h127.0.0--read-from-remote-server--rawmysql-bin.001219>/home/mysql-bin.001218通过sql语句搜索binlog日志记录mysqlbinlog--no-defaults--base64-output=decode-rows......
  • MySQL主从同步延迟Seconds_Behind_Master很大
    1.mysql> showslavestatus\G  查看延迟6天多,也是很神奇了2.查看 Master_Log_File和Relay_Master_Log_File对比,可以说明中继日志差100多位置,所有定位是中继日志问题 3.查看中继日志文件,密密麻麻的relay-bin文件 4.查看优化配置mysql>showvariableslike'%......
  • 二进制部署logstash
    部署logstash下载地址:https://www.elastic.co/cn/downloads/past-releases/(注意这里是跟elasticsearch版本一致)#创建目录mkdir-p/home/work#解压到指定目录tar-xvflogstash-7.17.3-linux-x86_64.tar.gz-C/home/work在本机上创建一个配置文件#Kafka输入配置,从Kafk......
  • 2023-12-5-logstash和filebeat使用
    应用场景、组件介绍、logstash启动、filebeat启动应用场景分布式场景中,不同服务器的服务日志集中收集管理,方便排查问题组件介绍logstash日志收集器,将接受到的日志存储到ES中fielbeat日志解析器,将日志解析后通过网络发送给日志收集器logstash启动下载https://www.elastic......
  • binlog2sql的安装及使用
    binlog2sql的安装及使用binlog2sql的用途:1)数据快速回滚(闪回)2)主从切换后数据不一致的修复3)从binlog生成标准SQL,带来的衍生功能yum-yinstallepel-releaseyum-yinstallgitpython-pipgitclonehttps://github.com/danfengcao/binlog2sql.git&&cdbinlog......
  • 查看宝塔mysql二进制文件 mysqlbinlog
    mysqlbinlog执行文件位置/www/server/mysql/binmysql-bin二进制日志位置/www/server/data/#/www/server/data/mysql-bin.000060把二进制导出为.sql文件#建议/www/server/data/mysql-bin.000060文件cp到mysqlbinlog文件执行目录并设置权限为www755./mysqlbinlogmysql-......
  • 服务器端jupyter notebook映射到本地浏览器的操作【文章转自https://www.cnblogs.com/
    这篇文章转自主要介绍了服务器端jupyternotebook映射到本地浏览器的操作,做科研经常有这样的需求:即需要借助服务器的计算资源,本地编辑的工程文件需要每次都传到服务器才能运行。jupyter是较好的交互式编辑工具,有没有一种方式可以在jupyter上编辑属于服务器的文件呢?这就引出了我们......
  • MYSQL 是如何保证binlog 和redo log同时提交的?
    MYSQL一个事务在提交的时候能够保证binlog和redolog是同时提交的,并且能在宕机恢复后保持binlog和redolog的一致性。先来看看什么是redolog和binlog,以及为什么要保持它们的一致性。什么是redolog,binlogredolog是innodb引擎层产生的日志,MYSQL从磁盘读取数据的单位是一......
  • Python爬虫实战系列1:博客园cnblogs热门新闻采集
    实战案例:博客园热门新闻采集一、分析页面打开博客园网址https://www.cnblogs.com/,点击【新闻】再点击【本周】本次采集,我们以页面新闻标题为案例来采集。这里可以看到标题“李彦宏:以后不会存在“程序员”这种职业了”。1.1、分析请求F12打开开发者模式,然后点击Network后点......