删除mysql-bin文件是否安全?

124 mysql replication mysql-5 binlog

我在 mysql 中有 MM 复制,我想在框中挤出一些可用空间以删除不必要的文件,我在mysql-bin里面遇到了这些文件/var/db/mysql/有数百个这样的文件mysql-bin.000123mysql-bin.000223等等。我已经检查了 mysql 复制show master statusshow slave status它们是在某些位置使用一些 mysql-bin 文件,但我猜所有其他 bin 文件都是剩余的,不会再使用了。在这种情况下,删除除复制当前指向的文件之外的所有 mysql-bin 文件是否安全?

如果删除是安全的,那么我可以做些什么来在不使用这些文件时自动删除它们?

Rol*_*DBA 184

请不要只是在操作系统中删除它们。

你需要让 mysqld 为你做这件事。以下是 mysqld 管理它的方式:

该文件mysql-bin.[index]保留了 mysqld 生成并自动旋转的所有二进制日志的列表。清除二进制日志的机制mysql-bin.[index]是:

PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';
Run Code Online (Sandbox Code Playgroud)

这些将清除您刚刚指定的二进制日志或时间戳之前的所有二进制日志。

例如,如果您运行

PURGE BINARY LOGS TO 'mysql-bin.000223';
Run Code Online (Sandbox Code Playgroud)

这将清除之前的所有二进制日志mysql-bin.000223

如果你跑

PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;
Run Code Online (Sandbox Code Playgroud)

这将在 3 天前的午夜之前擦除所有二进制日志。

如果您想让 binlog 自动旋转并保留 3 天,只需设置:

mysql> SET GLOBAL expire_logs_days = 3;
Run Code Online (Sandbox Code Playgroud)

然后将此添加到 /etc/my.cnf

[mysqld]
expire_logs_days=3
Run Code Online (Sandbox Code Playgroud)

mysqld 会为你删除它们的日志

显示从机状态\G

这很关键。运行时SHOW SLAVE STATUS\G,您将看到来自 Master 的两个二进制日志:

  • Master_Log_File
  • Relay_Master_Log_File

当复制很少或没有滞后时,这些通常是相同的值。当有很多复制滞后时,这些值是不同的。为了简单起见,选择任何东西Relay_Master_Log_File,然后回到 Master 并运行

PURGE BINARY LOGS TO 'Whatever Relay_Master_Log_File Is';
Run Code Online (Sandbox Code Playgroud)

这样,复制就不会中断。

  • 请注意,我的帖子已经超过 8 年了。我尽量不修改我非常旧的答案(已有 10 年的历史)并解决旧版本的 MySQL。大多数 MySQL 安装仍然使用 5.5/5.6,即使它们是 EOL。所以我的旧答案可以帮助这些用户。 (2认同)
  • 使用系统变量 `binlog_expire_logs_seconds` 而不是弃用的系统变量 `expire_logs_days`。请参阅:https://dev.mysql.com/doc/refman/8.0/en/replication-options-binary-log.html#sysvar_binlog_expire_logs_seconds (2认同)

Der*_*ney 24

这实际上取决于您的备份策略。保留二进制日志的主要原因之一是将数据库恢复到“时间点”。如果您的数据库崩溃并需要恢复,您将恢复最新的完整备份,然后从完整备份的位置开始播放二进制日志。

因此,如果您每天都进行完整备份并且您有 7 天的二进制日志,那么您很可能可以删除过去 4-6 天的二进制日志。您可以通过设置控制保留多少天的二进制日志expire_logs_days

您可以通过首先查看要保留的最旧日志来删除不需要的二进制日志:

ls -lh /path/to/binary/logs/mysql-bin.0*
Run Code Online (Sandbox Code Playgroud)

然后在mysql中:

mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';
Run Code Online (Sandbox Code Playgroud)


小智 12

尝试这个:

RESET MASTER;
Run Code Online (Sandbox Code Playgroud)

正如文件所说:

RESET MASTER 使您能够删除任何二进制日志文件及其相关的二进制日志索引文件,将主服务器恢复到二进制日志记录启动之前的状态。

这将删除所有相关的二进制日志文件,这可能不是您想要的。


Edu*_*ana 12

是的,它很安全。对于 mysql 8,您可以按照以下方法进行操作。

我们也可以将其设置binlog_expire_logs_seconds 为选项系统变量或命令行参数,但我将展示如何将其用作配置选项。

作为选项,您必须编辑配置文件。您可以在此处查找Windows 和 Linux 文件。对于linux,我去了/etc/mysql/my.cnf文件:

$ cat /etc/mysql/my.cnf
...
!includedir /etc/mysql/conf.d/
!includedir /etc/mysql/mysql.conf.d/
Run Code Online (Sandbox Code Playgroud)

让我们看看里面有什么/etc/mysql/mysql.conf.d/

$ ls /etc/mysql/mysql.conf.d/
mysql.cnf  mysqld.cnf
Run Code Online (Sandbox Code Playgroud)

例如,要仅保留 3 天的日志,您必须计算总秒数 (24 60 60*3)。现在,我们必须binlog_expire_logs_seconds向一个部分添加选项mysqld。我的解决方案是创建一个包含以下内容的文件:

$ cat /etc/mysql/mysql.conf.d/binlog_expiration.cnf 
[mysqld]

# Three days: 24*60*60*3
binlog_expire_logs_seconds=259200
Run Code Online (Sandbox Code Playgroud)

由于该文件位于其包含的目录内,/etc/mysql/my.cnf因此将随服务一起加载。

然后,重新启动服务:

sudo service mysql restart
Run Code Online (Sandbox Code Playgroud)

它会为您删除日志并不断删除它们。

注意:仅供参考,expire_logs_days已弃用。