mysql-bin
中遇到了这些/var/db/mysql/
文件。有数百个文件,例如mysql-bin.000123
,mysql-bin.000223
等。我已经通过检查了mysql复制在执行show master status
和show slave status
时,它们在某些位置使用了一些mysql-bin文件,但是我想所有其他bin文件都是剩余的,将不再使用。在这种情况下,可以安全地删除所有那些mysql-bin文件,但复制当前指向的文件除外吗?如果可以安全地删除,那么有什么办法可以我自动删除那些文件一旦不被使用?
#1 楼
请不要只是在操作系统中将它们删除。您需要让mysqld为您执行此操作。 mysqld的管理方式如下:
文件
mysql-bin.[index]
保留mysqld生成并自动旋转的所有二进制日志的列表。与mysql-bin.[index]
一起清除二进制日志的机制为:PURGE BINARY LOGS TO 'binlogname';
PURGE BINARY LOGS BEFORE 'datetimestamp';
这些将在您刚刚指定的二进制日志或时间戳记之前清除所有二进制日志。
例如,如果运行
PURGE BINARY LOGS TO 'mysql-bin.000223';
这将删除
mysql-bin.000223
之前的所有二进制日志。如果运行
PURGE BINARY LOGS BEFORE DATE(NOW() - INTERVAL 3 DAY) + INTERVAL 0 SECOND;
,这将删除3天前午夜之前的所有二进制日志。
如果需要要自动删除binlog并保持3天有效,只需进行以下设置: > SHOW SLAVE STATUS \ G
这很关键。当您运行
/etc/my.cnf
时,您将从主服务器上看到两个二进制日志: 。当复制延迟很大时,这些值是不同的。为了简单起见,请选择任何SHOW SLAVE STATUS\G
,然后返回到主服务器并运行mysql> SET GLOBAL expire_logs_days = 3;
那样,复制不会被中断。
#2 楼
这实际上取决于您的备份策略。保留二进制日志的主要原因之一是将数据库还原到“时间点”。如果数据库崩溃并需要还原,则将还原最新的完整备份,然后从完整备份的位置开始播放二进制日志。因此,如果每天进行一次完整备份并且您有7天的二进制日志,很可能您可以删除过去4-6天的二进制日志。您可以使用
expire_logs_days
设置控制保留多少天的二进制日志。您可以通过首先查看要保留的最旧日志来删除不需要的二进制日志:
ls -lh /path/to/binary/logs/mysql-bin.0*
,然后在mysql中:
mysql> PURGE BINARY LOGS TO 'mysql-bin.XXXXX';
#3 楼
尝试以下操作:RESET MASTER;
如文档所述:
RESET MASTER使您可以删除任何二进制日志文件及其相关内容二进制日志索引文件,将主数据库恢复到启动二进制日志记录之前的状态。
这将删除所有相关的二进制日志文件,而这些文件可能不是您想要的。
评论
请注意输入错误-下划线,而不是破折号:[mysqld] expire_logs_days = 3(并且您必须包括[mysqld]部分
– Changokun
2014年8月12日17:23
@changokun这不是错字。 my.cnf将接受破折号。运行SET GLOBAL expire_logs_days = 3;从mysql客户端不会接受它们。 MySQL Docs中的示例:dev.mysql.com/doc/refman/5.5/en/mysqld-option-tables.html
– RolandoMySQLDBA
2014年8月12日17:25
这对我有用。问题,两者之间有什么区别?mysql> SET GLOBAL expire_logs_days = 3;和/etc/my.cnf中的expire-logs-days = 3。是否相同?这是多余的吗?或者,重要的是运行SET GLOBAL ...然后添加expire-logs-days = ..?谢谢。
– Nino Paolo
15年3月24日在2:57
显然,快速删除所有日志:在DATE(NOW())之前清除二进制日志;为什么没有理智的默认设置呢?我无处可寻,从来没有明确地将日志文件的大小更改为巨大的数量。运行此命令后,我有一个10.0 GB的日志文件,我的mysql.bin文件夹大小缩小到1.6GB。
– Michael Trouw
16年6月14日在19:53