背景
我们都知道expire_logs_days控制了清理多少天之前的binlog,但有一些疑问。
测试前疑问
- 这个一天怎么算?
- 清理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。