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. 代码 抠图_Python装逼指南——五行代码实现批量抠图!
  2. [hiho1159] Poker
  3. .com域名一定要实名认证吗
  4. Java语言实现二分查找(可查询重复数据)
  5. 【Java】 5.9 初始化块
  6. 现在好用的mysql客户端_还在用 Navicat 的,可以试试这几款免费且好用的 MySQL 客户端...
  7. 备案php代码,备案查询API PHP代码
  8. NSA 分享植入 web shell 的常用漏洞列表
  9. Python网络编程 —— 线程
  10. 网络管理常用命令(6/14) -netstat命令详解
  11. linux 安全狗 乱码,打狗棒法之:Cknife(C刀)自定义模式秒过安全狗
  12. android 谷歌地图离线访问,谷歌升级Android版地图应用 支持离线使用
  13. 【ArcGIS微课1000例】0032:ArcGIS中河流(曲线)、湖泊(水体色)图例制作案例教程
  14. uniapp实现APP微信登录流程
  15. 东方mmd巨大化_爱丽丝玛格特罗伊德 动漫人物资料
  16. spring-cloud-oauth2
  17. php数据传输神器,「curl」PHP中的传输神器
  18. 360前端星计划学习笔记0410
  19. android 跳转oppo应用中心_安卓市场—OPPO应用市场ASO详解
  20. 旅游行业数字化进程分析——2023年元旦与春节,旅游市场开启复苏模式,跨省游热度上升

热门文章

  1. 昇思MindSpore携手宝兰德推出智慧工地解决方案,助力工地安全生产管理领域数智化升级
  2. 在linux下怎么打包直接运行的node-webkit桌面应用
  3. 第八章 Caché 使用持久对象
  4. 用C++模拟大数的除法 ————墨白
  5. pip is not an internal or external command how to solve pip 不是内部或外部命令 ------解决方法 顺便把pip升级
  6. rd640服务器加硬盘,联想RD640服务器外部简介
  7. O2O汽车平台(三)
  8. 计蒜客习题:走迷宫2
  9. GiB 与 GB 的区别
  10. 打破金属打印性能世界纪录,这家中国公司开发纳米改性超级金属-1