15

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

但是当我SHOW VARIABLES WHERE Variable_Name='expire_logs_days'在 MySQL 中运行时,它会返回一个值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

4 回答 4

12

您的问题中的事实

  • 二进制日志不能循环出
  • 你说你可以运行 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,此文件夹包含所有二进制日志。

这里有2个问题:

  1. 是否有任何/var/log/mysql数字上不连续的二进制日志?
  2. 是否有任何二进制日志/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

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

试试看 !!!

于 2013-03-19T22:06:14.423 回答
1

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)

..

于 2019-10-05T08:15:39.413 回答
0

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

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

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

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

听起来#3 会expire_logs_days在它进行冲洗/清除时执行。

于 2013-03-18T21:58:42.303 回答
0

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

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

ps辅助| grep mysqld

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

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

于 2013-03-22T21:00:48.490 回答