问题现象

mysql8.0.30 一主一从的主库的数据目录下的mysql-bin开头的文件已经有100多个了,每天产生2到4个mysql-bin**开头的文件,每个文件大小1.1G,这个文件不是自动删除的吗?

问题分析与处理方法

1. 检查从库复制状态

在从库执行:

mysql> SHOW REPLICA STATUS\G

Replica_IO_Running: 是否为 Yes
Replica_SQL_Running: 是否为 Yes
Seconds_Behind_Source: 复制延迟了0秒。如果这个值很大,或者为 NULL,说明从库有问题。
如果从库已经中断,您需要修复复制问题。这是治本的方法。

2. 检查主库并调整 binlog 过期策略

如果复制状态正常,那么很可能是配置问题。

查看主库配置:

SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs_seconds';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| binlog_expire_logs_seconds | 0     |
+----------------------------+-------+
1 row in set (0.25 sec)

从 MySQL 8.0.29 开始,引入了 binlog_expire_logs_auto_purge 和基于空间的清理优先级。

确保自动清理功能是开启的(默认是开启的):

SHOW GLOBAL VARIABLES LIKE 'binlog_expire_logs_auto_purge';
+-------------------------------+-------+
| Variable_name                 | Value |
+-------------------------------+-------+
| binlog_expire_logs_auto_purge | ON    |
+-------------------------------+-------+
1 row in set (0.00 sec)

设置为一个合理的值(例如,保留 7 天):
– 动态设置(重启后失效)

SET GLOBAL binlog_expire_logs_seconds = 604800; -- 7 * 24 * 60 * 60
mysql> SET GLOBAL binlog_expire_logs_seconds = 604800;
ERROR 4113 (HY000): The option expire_logs_days cannot be used together with option binlog_expire_logs_seconds. To set one, first unset the other by setting it to 0.
mysql> SHOW GLOBAL VARIABLES LIKE 'expire_logs_days';
+------------------+-------+
| Variable_name    | Value |
+------------------+-------+
| expire_logs_days | 30    |
+------------------+-------+
1 row in set (0.00 sec)

mysql> SET GLOBAL expire_logs_days = 0;

– 永久生效,需要写入配置文件 my.cnf

-- [mysqld]
 MySQL 配置文件(通常是 my.cnf 或 my.ini),在 [mysqld] 部分添加或修改以下行:

[mysqld]
expire_logs_days = 0
binlog_expire_logs_seconds = 604800

设置后,MySQL 会自动清理超过 7 天的 binlog 文件。

知识扩展:
自动清理的触发时机
清理过程主要在以下时刻被触发:

3. 【立即释放空间】手动安全清理 binlog

如果想立即清理掉已经过期且不再需要的 binlog 文件,可以使用以下命令:

清理指定时间之前的所有 binlog:

-- 清理 3 天前的所有 binlog
PURGE BINARY LOGS BEFORE NOW() - INTERVAL 3 DAY;

-- 或者清理某个时间点之前的
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
清理到某个特定的 binlog 文件(保留最新的几个):

-- 清理掉 mysql-bin.000100 之前的所有文件(但不包括 mysql-bin.000100)
PURGE BINARY LOGS TO 'mysql-bin.000100';

⚠️ 注意:手动执行 PURGE 命令前,最好再次确认从库状态,确保没有复制延迟,否则可能导致复制失败。

4. 触发日志轮转

有时,手动刷新日志可以帮助系统重新评估清理条件:

FLUSH LOGS;

这条命令会:
关闭当前的 binlog 文件。

创建一个新的 binlog 文件(例如,从 mysql-bin.000100 切换到 mysql-bin.000101)。

在切换过程中,自动触发过期 binlog 的清理检查,删除所有超过 7 天的文件。

⚠️ 重要提示:在执行 FLUSH LOGS; 或等待自动清理之前,请务必再次确认您的从库复制状态(即使您之前检查过)。因为这是清理发生的最后一道关卡。

Logo

汇聚全球AI编程工具,助力开发者即刻编程。

更多推荐