一、设置 binlog 日志保存时间和文件大小限制

在 MySQL 中,常见日志包括二进制日志(binlog)、错误日志和查询日志等。这些日志对数据库管理、复制和故障恢复都很重要。本文重点记录 binlog 日志的保留策略。

不同 MySQL 版本的默认保留策略并不完全相同。以 MySQL 8.0 为例,binlog_expire_logs_seconds 默认值为 2592000,也就是 30 天。为了避免版本差异带来的误解,生产环境建议显式配置保留时间和单个 binlog 文件大小。

MySQL 8.0 及以上版本建议使用 binlog_expire_logs_seconds,不要再使用已经弃用的 expire_logs_days。例如保留 7 天:

1
2
3
4
5
6
[mysqld]
# 设置日志保留时间:7 天 = 7 * 24 * 60 * 60 秒
binlog_expire_logs_seconds=604800

# 设置单个 binlog 文件最大大小
max_binlog_size=100M

以上配置会让 MySQL 自动清理超过 7 天的 binlog,并把单个 binlog 文件大小限制在约 100MB。达到 max_binlog_size 后,MySQL 会在合适的时机切换到新的 binlog 文件。

更改设置后,需要重新启动MySQL服务才能使其生效。

注意事项:

  • max_binlog_size 不能小于 4096 字节。
  • expire_logs_days 在 MySQL 8.0 中已经弃用,MySQL 8.2.0 起已移除;新配置应使用 binlog_expire_logs_seconds
  • log_bin_trust_function_creators 与 binlog 过期清理无关,它主要影响存储函数创建时的安全检查,不建议混在日志保留策略中配置。

可以通过下面的命令查看当前配置:

1
2
SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';
SHOW VARIABLES LIKE 'max_binlog_size';

二、如何手动清理 binlog

1. 使用 MySQL 命令行

在 MySQL 命令行中,使用 PURGE BINARY LOGS 语句可以删除指定时间或指定文件之前的 binlog。

例如,为了删除超过7天的binlog日志文件,可以运行以下命令:

1
PURGE BINARY LOGS BEFORE DATE_SUB(NOW(), INTERVAL 7 DAY);

2. 按照 binlog 名称删除

1
2
3
-- 将 mysql-bin.000011 之前的日志清理掉
mysql> purge binary logs to 'mysql-bin.000011';
Query OK, 0 rows affected (0.01 sec)

3. 按照时间删除

1
2
3
-- 删除 2023-03-21 18:08:00 之前的 binlog 日志
mysql> purge binary logs before '2023-03-21 18:08:00';
Query OK, 0 rows affected, 1 warning (0.02 sec)

手动清理前应先确认复制链路是否已经消费相关 binlog,避免主从复制或数据恢复受影响。