在my.cnf中忽略了expire_logs_days

时间:2013-03-15 16:49:32

标签: mysql database-replication

我有一对为主从复制设置的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命令。

有人有什么想法吗?我只是轻拍。

感谢。

4 个答案:

答案 0 :(得分:10)

您问题的事实

  • 二进制日志无法旋转
  • 你说你可以运行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,此文件夹包含所有二进制日志。

以下是2个问题:

  1. /var/log/mysql中的二进制日志是否在数字上不连续?
  2. /var/log/mysql中是否存在 NOT IN mysql-bin.index的二进制日志?
  3. 为什么会出现这些情况?

    有时,人们会删除操作系统中的二进制日志。这可以抛弃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发生了什么,但是对于更大的问题,看起来你有几个选择:

  1. 运行mysqldump并指定您希望文件刷新/清除
  2. 运行'清除'(就像你一样)
  3. 设置max_binlog_size。根据文件:
  4.   

    可能的删除发生在启动时和刷新二进制日志时。

      

    此外,当二进制日志的大小达到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)

..