【问题标题】:expire_logs_days ignored in my.cnfmy.cnf 中忽略 expire_logs_days
【发布时间】:2013-03-15 16:49:31
【问题描述】:

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

有人有什么想法吗?我即将被窃听。

谢谢。

【问题讨论】:

标签: mysql database-replication


【解决方案1】:

您的问题中的事实

  • 二进制日志不能轮换出
  • 你说你可以运行 PURGE BINARY LOGS

这是我的工作理论

由于您可以使用PURGE BINARY LOGS; 擦除二进制日志,因此我有两个您没有提到的地方供您查看

地点 #1:mysql-bin.index

此文件包含所有二进制日志的位置。设置 expire_logs_days 后,mysqld 会打开这个文本文件,检查每个文件中的日期时间戳,直到遇到时间戳小于NOW() - INTERVAL expire_logs_days DAY) 的二进制日志。

mysql-bin.index 中的二进制日志预计在数字上是连续的。如果二进制日志在数字上不是连续的,则禁用日志轮换。

地点 #2:/var/log/mysql 文件夹

根据您的my.cnf,此文件夹包含所有二进制日志。

这里有两个问题:

  1. /var/log/mysql 中是否存在数字不连续的二进制日志?
  2. /var/log/mysql 中是否有任何二进制日志不在 mysql-bin.index 中?

为什么会出现这些情况?

有时,人们会删除操作系统中的二进制日志。由于 mysqld 使用mysql-bin.index 在内部跟踪二进制日志的存在,这可能会导致 mysqld 失效。只需使用rm -f 删除二进制日志,就逻辑上破坏了 mysqld 所知道的日志轮换机制。

建议

如果是其中一种或两种情况,您可以按如下方式进行清理:

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

在此之后,您应该有一个全新的二进制日志设置。

试试看!!!

【讨论】:

  • 谢谢,我已经点击了 2.2 - 因为我不想重置主人;此命令将显示要删除的内容 diff <(find /var/log/mysql/ -iname "mysql-bin.[0-9]*" |sort -n) /var/log/mysql/mysql-bin.index | sed -ne 's/^</rm/p'
【解决方案2】:

Mysql(社区)版本 8.0.17-1.sles12 - OpenSUSE tumbleweed 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)

..

【讨论】:

    【解决方案3】:

    我不确定您的 my.cnf 发生了什么,但对于更大的问题,您似乎有几个选择:

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

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

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

    听起来#3 在执行刷新/清除时会执行expire_logs_days

    【讨论】:

    • 1) 我对转储 mysql 不感兴趣。 2)是的,我可以这样做,而且我可能不得不这样做,但从根本上说,我发现我必须非常有趣的问题,所以我希望得到一个答案而不是解决方法(任何事情都是不过总比没有好...) 3)坦率地说,我不在乎 binlog 是 1KB 还是 1TB,我只想在 3 天后将其删除...所以我不知道这个选项是否真的能达到我的目的正在寻找。
    【解决方案4】:

    更改该配置文件中的任何 OTHER 选项是否有任何影响?我们需要确定我们正在使用正确的配置文件。更改 server-id 的值可能是一个不错的选择。

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

    ps 辅助 | grep mysqld

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

    如果您仍然感到困惑,请确保没有在某处设置 --init-file 将值设置为 0。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-20
      • 1970-01-01
      相关资源
      最近更新 更多