mysql数据库日志binlog保存时效问题如何解决

77次阅读
没有评论

共计 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 小编将为大家输出更多高质量的实用文章!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计5977字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)