介绍

介绍

我们最近发现,在 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 项目提供了以下内容:

基本原理

几乎所有生产安装都启用了二进制日志,因为它用于复制和时间点恢复。

鉴于此,我们应该默认启用它,原因如下:

  1. 我们为用户省去了一个配置步骤。1A. 稍后启用它需要重新启动 mysqld。
  2. 我们对服务器进行了更多类似生产的内部测试。
  3. 我们可以更好地了解和面对二进制日志的性能影响

到期

在 mysql 8.0 中,日志文件的默认过期时间为30 days,由变量控制binlog_expire_logs_seconds,默认值为2592000 seconds。要真正进行清除,必须刷新日志。根据文档,当关闭一个二进制日志文件并启动一个新文件时,会自动刷新日志。单个文件的最大大小可以由控制,max_binlog_size最大为 1GB。但是,需要注意的是,事务不会拆分到日志文件中,理论上最多可以达到 4GB。您也可以自己每天发出flush logspurge binary logs声明。

答案2

配置binlog_expire_logs_seconds86400会说每天清除日志。我喜欢将其延长到一周或两周。

同时,检查max_binlog_size。如果您希望每天清除 binlog,并且每天生成 5MB,那么我建议将其设置为 100M。

一天后清除 100M 将使磁盘使用量保持在 500 到 600M 之间(或者可能是 500M 到 1100M,我不知道确切的算法)。

每天 500M 似乎很多。您是否经常更新大型表中的每一行?还是其他原因?

同意默认配置可能不是最好的。有几种默认情况需要考虑,安装不会询问您想要哪种:

  • 复制(需要 binlog)。“Expire” 可能已被默认。
  • 想要“时间点恢复”。同样,需要 binlog,但是什么是好的默认值?
  • 不需要binlog。
  • 其他?

相关内容