MySQL Binlog 文件数量日益增加,其大小也以 GB 为单位不断增加。如何才能阻止 binlog 文件大小不断增加?它们正在填满磁盘空间。
答案1
从MySQL8开始,他们默认开启了二进制日志记录,并且二进制日志的默认清除(过期/删除)设置为30天。
进入 SSH 和 mysql 后,可以使用以下命令
显示二进制日志
mysql> SHOW BINARY LOGS;
手动清除二进制日志直到某个时间点
mysql> PURGE BINARY LOGS TO 'binlog.000142';
将自动默认清除期限从 30 天(默认)更改为 3 天
mysql> SET GLOBAL binlog_expire_logs_seconds = 259200;
Query OK, 0 rows affected (0.00 sec)
mysql> SET PERSIST binlog_expire_logs_seconds = 259200;
Query OK, 0 rows affected (0.01 sec)
以上值以秒为单位,即 3 天的秒数 = (60 秒 x 60 分钟 x 24 小时 x 3 天) = 259200
答案2
如果不需要保留这些二进制日志,则可以在 MySQL 中像这样“修剪”它们:
mysql> PURGE BINARY LOGS BEFORE '2021-01-01 00:00:00';
当然,你可以将日期更改为你想要的任何日期。如果你想要修剪到特定的二进制日志文件,你可以这样做:
mysql> PURGE BINARY LOGS TO 'mysql-bin.12345';
请务必指定您要修剪的实际文件。
重要的:不要简单地从文件系统中删除文件。MySQL 将来会以可怕的方式抱怨。使用以下方法可以节省不必要的停机时间 PURGE BINARY LOGS
MySQL 内部的命令。
答案3
复制和某些形式的备份需要 Binlog。听起来你都没有做这两件事。
为了更改设置,我喜欢添加一个新文件,例如(其中“rj”是我的姓名首字母):
/etc/mysql/mysql.conf.d/rj.cnf
并在其中添加覆盖,例如下面的内容。进行更改后,
sudo systemctl restart mysql
log_bin
控制 binlog 的创建。
为了保持它们被清除,请添加binlog_expire_logs_seconds = 86400
(或其他数字)。
另一个设置控制每个 binlog 文件的最大大小;这不会影响使用的总磁盘空间,但最后一个文件将保留直到“过期”。每次重启(或重新启动 mysql)后都会启动新的 binlog,因此您可能会看到很多小文件。
因此,我的 rj.cnf 文件可能包含以下内容:
# Added by Rick James
[mysqld]
log_bin = # turn off
binlog_expire_logs_seconds = 86400 # 1 day
max_binlog_size = 104857600 # 100M