我有一对为主从复制设置的 MySQL 数据库。奴隶做得很好。
另一方面,尽管我尽了最大的努力(自动化),但主人一直在囤积二进制日志。
我正在尝试在 MySQL 的 my.cnf 文件中设置“expire_logs_days”变量,但由于某种原因,它似乎被忽略了。我的 my.cnf 文件看起来像:
[mysqld]
...
log-bin=/var/log/mysql/mysql-bin.log
server-id=1
expire_logs_days=3
log_bin_trust_function_creators=TRUE
sync_binlog=1
[mysqld_safe]
...
但是当我在 MySQL 中运行 SHOW VARIABLES WHERE Variable_Name='expire_logs_days'
时,它返回的值是 0
我试过了:
- 重启 MySQL
- 使用这一行:
expire_logs_days='3'
- 检查了其他 my.cnf 文件:
mysqld --help --verbose | grep cnf
- 找到行:
/etc/mysql/my.cnf/etc/my.cnf ~/.my.cnf order of preference
- 我的
my.cnf
文件位于/etc/my.cnf
- 其他位置没有名为 my.cnf 的文件
SET GLOBAL expire_logs_days=3
可以在 MySQL 中工作,但并不能真正解决我的问题
这就是我能想到的所有事情。我已经运行了手动 PURGE 命令,它工作得很好,但我更喜欢(虽然,如果没有办法解决它,我还是会这样做)不使用 cron 运行 PURGE 命令。
有人有什么想法吗?我即将被窃听。
谢谢。
最佳答案
你问题的事实
- 二进制日志不能轮转出
- 你说你可以运行 PURGE BINARY LOGS
这是我的工作理论
由于您可以使用PURGE BINARY LOGS;
清除二进制日志,所以我有两个地方供您查看,您没有提到
地方#1:mysql-bin.index
此文件包含所有二进制日志的位置。设置 expire_logs_days 后,mysqld 将打开此文本文件,检查每个文件中的日期时间戳,直到遇到时间戳小于 NOW() - INTERVAL expire_logs_days DAY)
的二进制日志。
mysql-bin.index 中的二进制日志应该是数字连续的。如果二进制日志在数字上不连续,则禁用日志轮换。
PLACE #2 : /var/log/mysql
文件夹
根据您的my.cnf
,此文件夹包含所有二进制日志。
这里有两个问题:
/var/log/mysql
中是否存在数字不连续的二进制日志?/var/log/mysql
中是否有不在mysql-bin.index
中的二进制日志?
为什么会出现这些情况?
有时,人们会删除操作系统中的二进制日志。这可以摆脱 mysqld,因为 mysqld 使用 mysql-bin.index
在内部跟踪二进制日志的存在。简单地使用 rm -f
删除二进制日志在逻辑上破坏了 mysqld 知道的日志轮换机制。
建议
如果其中一种或两种情况,您可以按如下方式清理:
mysql -ANe"RESET MASTER"
service mysql stop
cd /var/log/mysql
rm -f mysql-bin.*
cd
service mysql start
在此之后,您应该拥有全新的二进制日志设置。
试一试!!!
关于mysql - my.cnf 中忽略了 expire_logs_days,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15437908/