my.cnf中的expire_logs_days忽略

问题描述 投票:12回答:4

我有一对用于主从复制的MySQL数据库。奴隶做得很好。

另一方面,尽管我尽了最大努力(自动),但主服务器仍在ho积二进制日志。

我正在尝试在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命令。

有人有什么想法吗?我正要轻按。

谢谢。

mysql database-replication
4个回答
11
投票

您的问题的事实

  • 二进制日志无法旋转
  • 您说您可以运行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使用mysql-bin.index内部跟踪二进制日志的存在,因此这可能会导致mysqld退出。如mysqld所知,只需使用rm -f删除逻辑上破坏日志循环机制的二进制日志即可。

推荐

如果是这两种情况中的一种或两种,都可以按照以下步骤进行清理:

mysql -ANe"RESET MASTER"
service mysql stop
cd /var/log/mysql
rm -f mysql-bin.*
cd
service mysql start

此后,您应该拥有一个崭新的二进制日志设置程序。

尝试一下!

我不确定您的my.cnf发生了什么,但是要解决更大的问题,看来您有几种选择:

  1. 运行mysqldump并指定您要刷新/清除文件
  • 运行'purge'(一直以来)
  • 设置max_binlog_size。根据文档:
  • 可能会在启动时以及刷新二进制日志时发生。

    此外,当二进制日志的大小达到系统变量max_binlog_size的值时,将刷新该日志。

    听起来像#3在执行冲洗/吹扫时将执行expire_logs_days

    更改该配置文件中的任何其他选项是否有效?我们需要肯定的是,我们要找到正确的配置文件。更改server-id的值可能是一个不错的选择。

    如果没有效果,让我们通过运行找到正确的文件:

    ps aux | grep mysqld

    并查看--defaults-file或--defaults-extra-file的值

    并且如果您仍然感到困惑,请确保未在某处设置--init-file将该值设置为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)
    

    ..


    0
    投票

    我不确定您的my.cnf发生了什么,但是要解决更大的问题,看来您有几种选择:


    0
    投票

    更改该配置文件中的任何其他选项是否有效?我们需要肯定的是,我们要找到正确的配置文件。更改server-id的值可能是一个不错的选择。


    0
    投票

    Mysql(社区)版本8.0.17-1.sles12-OpenSUSE风滚草2019.10.02

    © www.soinside.com 2019 - 2024. All rights reserved.