mysql中的expire_logs_days参数大家应该都熟悉,主要用来控制binlog日志文件保留时间,超过保留时间的binlog日志会被自动删除。比如我们指定expire_logs_days=7,表示表示最近7天的binlog日志,7天以前的binlog日志会被自动删除。下面是官方文档中对expire_logs_days的描述:

expire_logs_days

Command-Line Format --expire_logs_days=#
System Variable Name expire_logs_days
Variable Scope Global
Dynamic Variable Yes
Permitted Values Type integer
Default 0
Min Value 0
Max Value 99

The number of days for automatic binary log file removal. The default is 0, which means “no automatic removal.” Possible removals happen at startup and when the binary log is flushed. Log flushing occurs as indicated in Section 5.4, “MySQL Server Logs”.

To remove binary log files manually, use the PURGE BINARY LOGS statement. See Section 13.4.1.1, “PURGE BINARY LOGS Syntax”.

虽然我们都知道expire_logs_days控制着binlog日志保留时间以及自动删除,但是当发生触发日志删除的情况下(什么情况下会触发日志自动删除请见我的另一篇博客http://blog.csdn.net/shaochenshuo/article/details/51504947),mysql根据什么规则来确定哪些binlog是过期的,需要被删除呢?

对于上面的疑问,谷歌和官方文档上都没有找到相关信息。所以只能自己测试来验证了,下面列出的是我的测试过程:

1. 查看数据库binlog列表
1)
mysql> show binary logs;
+-----------------+------------+
| Log_name        | File_size  |
+-----------------+------------+
| 3306-bin.000006 | 1074742033 |
| 3306-bin.000007 | 1074580678 |
| 3306-bin.000008 | 1074739627 |
| 3306-bin.000009 |  250635228 |
| 3306-bin.000010 |        120 |
+-----------------+------------+
5 rows in set (0.00 sec)2)
ls -lrt
total 7402312
-rw-r--r-- 1 root  root        1747 Mar 25 10:06 test
-rw-rw---- 1 mysql mysql 1074742032 May  4 16:48 3306-bin.000006
-rw-rw---- 1 mysql mysql 1074580678 May  4 16:54 3306-bin.000007
-rw-rw---- 1 mysql mysql 1074739627 May  4 17:00 3306-bin.000008
-rw-rw---- 1 mysql mysql        168 May  4 17:00 3306-bin.index
-rw-rw---- 1 mysql mysql  250635182 May  4 17:02 3306-bin.000009
-rw-rw---- 1 mysql mysql   10448198 May 27 05:04 slow3306.log
-rw-r----- 1 mysql root     1096759 May 27 05:06 error3306.log
-rw-rw---- 1 mysql mysql 4093675902 May 27 05:06 general3306.log
##我们看到mysql目前保留着4个binlog日志,序号从6到9,当前正在使用的为序号为9的日志2. 设定binlog过期时间
set global expire_logs_days=7;
##在第1步中我们可以看到3306-bin.000006,3306-bin.000007,3306-bin.000008 三个日志都是属于过期的(因为3306-bin.000009是当前正在使用的日志,所以不是过期日志)3. 修改3306-bin.000006文件系统时间
使用 vi 查看3306-bin.000006文件,不做任何修改保存退出。4. 修改后查看binlog文件时间
ls -lrt
total 7402312
-rw-r--r-- 1 root  root        1747 Mar 25 10:06 test
-rw-rw---- 1 mysql mysql 1074580678 May  4 16:54 3306-bin.000007
-rw-rw---- 1 mysql mysql 1074739627 May  4 17:00 3306-bin.000008
-rw-rw---- 1 mysql mysql        168 May  4 17:00 3306-bin.index
-rw-rw---- 1 mysql mysql  250635182 May  4 17:02 3306-bin.000009
-rw-rw---- 1 mysql mysql   10448198 May 27 05:04 slow3306.log
-rw-r----- 1 mysql root     1096759 May 27 05:06 error3306.log
-rw-rw---- 1 mysql mysql 4093675902 May 27 05:06 general3306.log
-rw-rw---- 1 mysql mysql 1074742033 May 27 10:13 3306-bin.000006
##3306-bin.000006 日志文件已经系统日志已经变成当天时间5. flush logs
##我们知道flush logs;会触发过期日志清除操作6. 查看现有binlog
1)
mysql> show binary logs;
+-----------------+------------+
| Log_name        | File_size  |
+-----------------+------------+
| 3306-bin.000006 | 1074742033 |
| 3306-bin.000007 | 1074580678 |
| 3306-bin.000008 | 1074739627 |
| 3306-bin.000009 |  250635228 |
| 3306-bin.000010 |        120 |
+-----------------+------------+
5 rows in set (0.00 sec)2)
ls -lrt
total 7402316
-rw-r--r-- 1 root  root        1747 Mar 25 10:06 test
-rw-rw---- 1 mysql mysql 1074580678 May  4 16:54 3306-bin.000007
-rw-rw---- 1 mysql mysql 1074739627 May  4 17:00 3306-bin.000008
-rw-r----- 1 mysql root     1096759 May 27 05:06 error3306.log
-rw-rw---- 1 mysql mysql 1074742033 May 27 10:13 3306-bin.000006
-rw-rw---- 1 mysql mysql   10448370 May 27 10:14 slow3306.log
-rw-rw---- 1 mysql mysql 4093676334 May 27 10:14 general3306.log
-rw-rw---- 1 mysql mysql  250635228 May 27 10:14 3306-bin.000009
-rw-rw---- 1 mysql mysql        120 May 27 10:14 3306-bin.000010
-rw-rw---- 1 mysql mysql        210 May 27 10:14 3306-bin.index
##我们发现3306-bin.000006,3306-bin.000007,3306-bin.000008三个日志并没有被删除(此时3306-bin.000006文件系统时间为当天,3306-bin.000007和3306-bin.000008文件时间都是4号)7. purge 最早的3306-bin.000006日志
1)
mysql> purge master logs to '3306-bin.000007';
Query OK, 0 rows affected (0.31 sec)2)
mysql> show binary logs;
+-----------------+------------+
| Log_name        | File_size  |
+-----------------+------------+
| 3306-bin.000007 | 1074580678 |
| 3306-bin.000008 | 1074739627 |
| 3306-bin.000009 |  250635228 |
| 3306-bin.000010 |        120 |
+-----------------+------------+
4 rows in set (0.01 sec)3)
ls -lrt
total 6352756
-rw-r--r-- 1 root  root        1747 Mar 25 10:06 test
-rw-rw---- 1 mysql mysql 1074580678 May  4 16:54 3306-bin.000007
-rw-rw---- 1 mysql mysql 1074739627 May  4 17:00 3306-bin.000008
-rw-r----- 1 mysql root     1096759 May 27 05:06 error3306.log
-rw-rw---- 1 mysql mysql   10448370 May 27 10:14 slow3306.log
-rw-rw---- 1 mysql mysql  250635228 May 27 10:14 3306-bin.000009
-rw-rw---- 1 mysql mysql        120 May 27 10:14 3306-bin.000010
-rw-rw---- 1 mysql mysql        168 May 27 10:17 3306-bin.index
-rw-rw---- 1 mysql mysql 4093676603 May 27 10:17 general3306.log##3306-bin.000006日志已经被删除8. 再次flush logs;
1) flush logs;
mysql> flush logs;
Query OK, 0 rows affected (0.30 sec)2)查看 binlog
mysql> show binary logs;
+-----------------+-----------+
| Log_name        | File_size |
+-----------------+-----------+
| 3306-bin.000009 | 250635228 |
| 3306-bin.000010 |       166 |
| 3306-bin.000011 |       120 |
+-----------------+-----------+
3 rows in set (0.00 sec)ls -lrt
total 4253804
-rw-r--r-- 1 root  root        1747 Mar 25 10:06 test
-rw-r----- 1 mysql root     1096759 May 27 05:06 error3306.log
-rw-rw---- 1 mysql mysql  250635228 May 27 10:14 3306-bin.000009
-rw-rw---- 1 mysql mysql   10448542 May 27 10:17 slow3306.log
-rw-rw---- 1 mysql mysql 4093676814 May 27 10:17 general3306.log
-rw-rw---- 1 mysql mysql        166 May 27 10:17 3306-bin.000010
-rw-rw---- 1 mysql mysql        120 May 27 10:17 3306-bin.000011
-rw-rw---- 1 mysql mysql        126 May 27 10:17 3306-bin.index##此时我们发现3306-bin.000007,3306-bin.000008日志已经被自动删除

总结:
    通过上面的实验,对于mysql binlog过期删除策略,我们可以做出如下推测。
    1. mysql是根据binlog文件的操作系统最近修改时间,来判断binlog是否过期(而不是根据binlog日志中事物发生的时间)。
    2. 在触发mysql过期删除时,mysql先检查*bin.index文件,找到目前最老的binlog,然后检查该文件的系统时间,会有如下两种情况:
    1)如果发现该文件未过期,则认为目前没有binlog日志过期,不进行删除,即使此时有其他binlog已过期。
    2)如果发现该文件已经过期,则会找下一个binlog,判断是否过期,同样存在两种情况(过期或者未过期),如此往复,直到找到第一个过期的binlog 即停止继续查找,并删除该binlog及所有该binlog之前的所有日志。

expire_logs_days相关推荐

  1. mysql binlog size_设置max_binlog_size和expire_logs_days参数,设置mysql数据库bin log清除机制...

    自从前段时间数据库服务增加了mysql主从同步功能,发现主服务器的bin log日志一直在增长,短短一段时间有的文件达到几百兆.如果时间长了势必会占用很多服务器资源. 在百度搜索到,mysql-bin ...

  2. mysql expire_mysql expire_logs_days是怎么生效的

    mysql主备复制是通过binlog完成的.在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog.那么expire_logs_days是在什么 ...

  3. mysql expire_mysql expire_logs_days是怎么生效和计算出来的

    mysql主备复制是通过binlog完成的.在开启binlog的情况下,expire_logs_days参数可以让mysql自动清理若干天前的binlog. 那么expire_logs_days是在什 ...

  4. mysql数据库日志binlog保存时效(expire_logs_days)

    一.设置语法 1.方法一: 编辑/etc/my.cnf文件,在[mysqld]节点中增加如下两行 max_binlog_size = 500M expire_logs_days = 15 max_bi ...

  5. mysql 8 expire_logs_days 废弃 启用binlog_expire_logs_seconds设置binlog自动清除日志时间 阿里云RDS暂时不支持

    查看binlog日志相关配置信息 -- 查看binlog日志 show binary logs; -- mysql系统配置中查找 时效 相关配置  show variables like '%expi ...

  6. rancher 外置 mysql_rancher使用外部数据库无法正常使用

    mysql参考配置文件[root@rancher-db ~]# cat /etc/my.cnf [client] port            = 3306 socket          = /v ...

  7. mysql中logs库_MySQL Logs

    摘要 一.MySQL日志 1.1 查询日志 1.2 慢查询日志 1.3 错误日志 1.4 二进制日志 一. MySQL日志 MySQL服务器上一共有六种日志:错误日志,查询日志,慢查询日志,二进制日志 ...

  8. 主从配置_MySQL主从复制配置详解

    MySQL版本5.5.58 第一步配置主机 主机配置如下: server-id = 1 #服务器id (主从必须不一样) log_bin = mysql-bin #打开日志(主机需要打开), 这个my ...

  9. mysql优化说明_MySQL性能优化各个参数解释说明

    [client] port = 3306 socket = /tmp/mysql.sock [mysqld] port = 3306 socket = /tmp/mysql.sock basedir ...

最新文章

  1. 机器学习 对不平衡数据的四种处理方法
  2. php 文件位置获取
  3. android开机优化服务,Android开机速度优化简单回顾
  4. ASP.NET Core 沉思录 - 环境的思考
  5. a股历史30年的大盘价_2020年7月30日大盘走势分析
  6. django 按钮的样式_Python学习第五十六天记录打call:Django视图
  7. 民生服务是“双创”永恒主题 且听“鸿雁旅居网”、“熊猫中医”谈背后心路历程...
  8. kafka web页面监控KafkaOffsetMonitor
  9. python线性回归预测pm2.5_李宏毅 线性回归预测PM2.5
  10. 类型的Overflow与underflow
  11. 2.2   字 母 表 和 符 号 串 的 基 本 概 念
  12. 模板引擎--新闻案例
  13. java制作《石头迷阵》游戏。
  14. Linux 系统基础知识
  15. 1行Python代码识别身份证信息,还能自动告警,YYDS
  16. 【91xcz】想在Win8里了解各种炒股资讯吗
  17. HTTP中content-type和MIME媒体类型
  18. CC65 开发FC/NES 游戏(三)使用摇杆
  19. Qt学习笔记(十八):QListWidget 的常用方法
  20. Individual Project - Word frequency program-11061171-MaoYu

热门文章

  1. Mysql数据库技术——MEB备份技术
  2. 手把手教你逆向微信之朋友圈小视频转发(上)
  3. c语言整数编年历系统,作为程序员必须知道的编程语言编年史
  4. 新号连续3条视频破百万,这位唱rap的语文老师如何引爆全网
  5. ZJOI2008 瞭望塔 半平面交
  6. 全球及中国太阳能纸行业产销态势及前景趋势预测报告(2022-2028年)
  7. gb和gib的区别_GB和GIB的区别
  8. PaddleHub实战篇{ERNIE实现文新闻本分类、ERNIE3.0 实现序列标注}【四】
  9. JavaMeStudio工作室正式开张,专业开发手机软件!
  10. Q learning--强化学习系列文章3