共计 5977 个字符,预计需要花费 15 分钟才能阅读完成。
本篇内容介绍了“mysql 数据库日志 binlog 保存时效问题如何解决”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让丸趣 TV 小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!
一、设置语法 1、方法一
编辑 /etc/my.cnf 文件,在 [mysqld] 节点中增加如下两行
max_binlog_size = 500M
expire_logs_days = 15
max_binlog_size:bin log 日志每达到设定大小后,会使用新的 bin log 日志。如 mysql-bin.000002 达到 500M 后,创建并使用 mysql-bin.000003 文件作为日志记录。
expire_logs_days:保留指定日期范围内的 bin log 历史日志,上示例设置的 15 天内。
2、方法二
-- mysql8.0 以下版本查看当前数据库日志 binlog 保存时效 以天为单位,默认 0 永不过期,最多只能设置 99 天
show variables like expire_logs_days
set global expire_logs_days=60;
-- mysql8.0 以上版本通过设置全局参数 binlog_expire_logs_seconds 修改 binlog 保存时间 以秒为单位;默认 2592000 30 天 14400 4 小时;86400 1 天;259200 3 天
show variables like %binlog_expire_logs_seconds%
set global binlog_expire_logs_seconds=259200;
二、过期删除策略
总结:
通过下面的实验,对于 mysql binlog 过期删除策略,我们可以做出如下推测。
1. mysql 是根据 binlog 文件的操作系统最近修改时间,来判断 binlog 是否过期(而不是根据 binlog 日志中事物发生的时间)。
2. 在触发 mysql 过期删除时,mysql 先检查 *bin.index 文件,找到目前最老的 binlog,然后检查该文件的系统时间,会有如下两种情况:
1) 如果发现该文件未过期,则认为目前没有 binlog 日志过期,不进行删除,即使此时有其他 binlog 已过期。
2) 如果发现该文件已经过期,则会找下一个 binlog,判断是否过期,同样存在两种情况(过期或者未过期),如此往复,直到找到第一个过期的 binlog 即停止继续查找,并删除该 binlog 及所有该 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 日志已经被自动删除
9. 获取 binlog 文件列表
show binary logs;
查看指定 binlog 文件的内容
show binlog events in mysql-bin.000002
只查看第一个 binlog 文件的内容
show binlog events;
“mysql 数据库日志 binlog 保存时效问题如何解决”的内容就介绍到这里了,感谢大家的阅读。如果想了解更多行业相关的知识可以关注丸趣 TV 网站,丸趣 TV 小编将为大家输出更多高质量的实用文章!