我有一对为主从复制设置的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
我试过了:
expire_logs_days='3'
mysqld --help --verbose | grep cnf
/etc/mysql/my.cnf /etc/my.cnf ~/.my.cnf order of preference
my.cnf
文件位于/etc/my.cnf
SET GLOBAL expire_logs_days=3
在MySQL中工作,但本身并没有真正解决我的问题这就是我能想到的所有事情。我已经运行了手动PURGE命令,它运行得很好,但我更喜欢(但是,如果没有办法,我还是会这样做),不要使用cron运行PURGE命令。
有人有什么想法吗?我只是轻拍。
感谢。
答案 0 :(得分:10)
由于你可以使用PURGE BINARY LOGS;
删除二进制日志,我有两个地方供你查看你没有提到
mysql-bin.index
此文件包含所有二进制日志的位置。设置expire_logs_days后,mysqld将打开此文本文件,检查每个文件中的日期时间戳,直到遇到时间戳小于NOW() - INTERVAL expire_logs_days DAY)
的二进制日志。
mysql-bin.index中的二进制日志预计在数字上是连续的。如果二进制日志不是数字连续的,则禁用日志轮换。
/var/log/mysql
文件夹根据您的my.cnf
,此文件夹包含所有二进制日志。
以下是2个问题:
/var/log/mysql
中的二进制日志是否在数字上不连续?/var/log/mysql
中是否存在 NOT IN 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
在此之后,你应该有一个品牌打屁股新的二进制日志设置。
试一试!!!
答案 1 :(得分:0)
我不确定你的my.cnf发生了什么,但是对于更大的问题,看起来你有几个选择:
max_binlog_size
。根据文件:可能的删除发生在启动时和刷新二进制日志时。
和
此外,当二进制日志的大小达到max_binlog_size系统变量的值时,将刷新二进制日志。
听起来#3会在执行刷新/清除时执行expire_logs_days
。
答案 2 :(得分:0)
更改该配置文件中的任何OTHER选项是否有效?我们需要积极的,我们正在打击正确的配置文件。更改server-id的值可能是一个很好的选择。
如果没有效果,让我们通过运行找到正确的文件:
ps aux | grep mysqld
查看--defaults-file或--defaults-extra-file
的值如果你仍然难倒,请确保没有--init-file设置某处将值设置为0.
答案 3 :(得分:0)
Mysql(社区)版本8.0.17-1.sles12-OpenSUSE风滚草2019.10.02
mysql> SET GLOBAL expire_logs_days = 4;
ERROR 3683 (HY000): The option expire_logs_days and binlog_expire_logs_seconds
cannot be used together. Please use binlog_expire_logs_seconds to set the expire
time (expire_logs_days is deprecated)
..