为什么MySQL 8默认打开binlog并且会自动删除它们?

Ale*_*lex 5 mysql

我们最近发现,在 Ubuntu 20.04 机器上的 MySQL 8 默认配置中,binlog.*文件混乱/var/lib/mysql

即我们有 4.2 GB 的数据库大小和每天大约 500 MB 的二进制日志。

因此,我们的磁盘空间不足。

当然,我们可以禁用和删除二进制日志,但我们想知道这种默认配置的原因是什么,以及它们是否都会被删除(我们只需要在我们的机器上增加一点存储空间)。

我们猜测它们不应该永远保留在默认配置中,因为那样就需要无限的存储空间。

Ger*_*rit 5

介绍

这实际上是上游的变化。一些发行版可能会改变设置,但大多数发行版可能只会追随上游。

代码库托管在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/

该工作日志项的基本原理部分提供了以下内容:

基本原理

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

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

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

到期日

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


Ric*_*mes 2

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

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

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

每天 500M 看起来很多。您是否经常更新大表中的每一行?或者是其他东西?

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

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