expire_logs_days
Posted 渔夫数据库笔记
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了expire_logs_days相关的知识,希望对你有一定的参考价值。
mysql中的expire_logs_days参数大家应该都熟悉,主要用来控制binlog日志文件保留时间,超过保留时间的binlog日志会被自动删除。比如我们指定expire_logs_days=7,表示表示最近7天的binlog日志,7天以前的binlog日志会被自动删除。下面是官方文档中对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”.
对于上面的疑问,谷歌和官方文档上都没有找到相关信息。所以只能自己测试来验证了,下面列出的是我的测试过程:
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的主要内容,如果未能解决你的问题,请参考以下文章