测试expire_logs_days参数

背景

我们都知道expire_logs_days控制了清理多少天之前的binlog,但有一些疑问。

测试前疑问

  1. 这个一天怎么算?
  2. 清理binlog的时机是什么?

测试结果

1. 这个一天怎么算?

假设expire_logs_days=1,即清理1天前的binlog,我们有如下binlog

start time end time
binlog1 2019-10-08T00:00:00 2019-10-08T03:00:00
binlog2 2019-10-08T03:00:01 2019-10-09T02:00:00
binlog3 2019-10-09T02:00:00 2019-10-09T04:00:00
binlog4 2019-10-09T04:00:01 2019-10-09T05:00:00

测试在产生 binlog4 的时候会清除 binlog1 ,而产生 binlog3 时并没有清除binlog1

结论是:

在 binlog rotate 产生新的 binlog 时,判断前面 binlog 的 end time,而不是 start time。
如果超过1天了,则清理。
binlog3 rotate 生成 binlog4 时,时间为2019-10-09T04:00:02。减去 binlog1 的end time大于1天了,所以清理 binlog1。而减去 binlog2 的end time 未到一天,不清理 binlog2。

2. 清理 binlog 的时机是什么?

根据前面表格测试的结论,清理 binlog 的时机是产生新 binlog 的时候。
在binlog3持续的时间,2019-10-09T02:00:00 ~ 2019-10-09T04:00:00,中途达到 2019-10-08T03:00:00 这个过期时间,但 binlog1 一直没有被清理。直到刷新出 binlog4 时才触发清理 binlog,清除掉 binlog1。

总结:

  • 重启 mysqld
  • binlog 写满(根据参数 max_binlog_size,默认 1G)
  • flush logs/flush binary logs

以上三种行为都会触发 binlog rotate,产生新 binlog,从而根据参数 expire_logs_days 设置,清理过期 binlog。

原文地址:https://www.cnblogs.com/fander/p/11635925.html