开发者

mysql数据库日志binlog保存时效问题(expire_logs_days)

开发者 https://www.devze.com 2023-03-10 09:00 出处:网络 作者: lihongbao80
目录一、设置语法1、方法一2、方法二二、过期删除策略最后一、设置语法 1、方法一
目录
  • 一、设置语法
    • 1、方法一
    • 2、方法二
  • 二、过期删除策略
    • 最后

      一、设置语法

      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  http://www.devze.com  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 slowww.devze.comw3306.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;
      +-----------------+----开发者_Hive程客栈--------+
      | 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 | 1编程66 |
      | 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;

      最后

      以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。

      0

      精彩评论

      暂无评论...
      验证码 换一张
      取 消