我们最近发现,在 MySQL 8 默认配置中,文件在Ubuntu 20.04 机器上binlog.*
变得混乱。/var/lib/mysql
例如,我们的数据库大小为 4.2 GB,每天的 binlog 数量约为 500 MB。
因此,我们的磁盘空间不足。
当然,我们可以禁用和删除 binlog,但我们想知道这种默认配置的原因是什么,以及它们是否会被删除(我们只需要在我们的机器上稍微增加存储空间)。
我们猜测它们不应该永远保存在默认配置中,因为那样的话就需要无限的存储空间。
答案1
介绍
这实际上是上游的变更。一些发行版可能会改回该设置,但大多数发行版可能只会遵循上游。
代码库托管于https://github.com/mysql/mysql-server 二进制日志默认开启的实际文件是 sql/sys_vars.cc
通过深入分析责任,我最终确定了改变默认设置的提交: https://github.com/mysql/mysql-server/commit/9fa9504e5aaf68661aef2d735cecbd3c58eb7790
它提到了 mysql 团队的工作日志项:#10470。您可以在这里查找:https://dev.mysql.com/worklog/
这理由部分该 Worklog 项目提供了以下内容:
基本原理
几乎所有生产安装都启用了二进制日志,因为它用于复制和时间点恢复。
鉴于此,我们应该默认启用它,原因如下:
- 我们为用户省去了一个配置步骤。1A. 稍后启用它需要重新启动 mysqld。
- 我们对服务器进行了更多类似生产的内部测试。
- 我们可以更好地了解和面对二进制日志的性能影响
到期
在 mysql 8.0 中,日志文件的默认过期时间为30 days
,由变量控制binlog_expire_logs_seconds
,默认值为2592000 seconds
。要真正进行清除,必须刷新日志。根据文档,当关闭一个二进制日志文件并启动一个新文件时,会自动刷新日志。单个文件的最大大小可以由控制,max_binlog_size
最大为 1GB。但是,需要注意的是,事务不会拆分到日志文件中,理论上最多可以达到 4GB。您也可以自己每天发出flush logs
或purge binary logs
声明。
答案2
配置binlog_expire_logs_seconds
。 86400
会说每天清除日志。我喜欢将其延长到一周或两周。
同时,检查max_binlog_size
。如果您希望每天清除 binlog,并且每天生成 5MB,那么我建议将其设置为 100M。
一天后清除 100M 将使磁盘使用量保持在 500 到 600M 之间(或者可能是 500M 到 1100M,我不知道确切的算法)。
每天 500M 似乎很多。您是否经常更新大型表中的每一行?还是其他原因?
同意默认配置可能不是最好的。有几种默认情况需要考虑,安装不会询问您想要哪种:
- 复制(需要 binlog)。“Expire” 可能已被默认。
- 想要“时间点恢复”。同样,需要 binlog,但是什么是好的默认值?
- 不需要binlog。
- 其他?