所以……昨天我收到了一封“事后邮件”,内容是有关我运行的一项服务已启动的活动。现在数据库服务器正在遭受重击,二进制日志复制的速度大约为 300mb/分钟。你可以想象,这会以相当快的速度占用空间。
我通常的二进制日志有效期是 7 天,这根本不够。我只能截断日志,只保留最后 4 个小时的日志(我正在使用以下命令验证复制是否是最新的mk-heartbeat
):
PURGE MASTER LOGS BEFORE DATE_SUB( NOW(), INTERVAL 4 HOUR);
我只是每隔几个小时从 cron 运行一次以度过难关,但它让我对的最小值产生了疑问expire_logs_days
。我还没有遇到小于 1 的值,但这并不意味着不可能。http://dev.mysql.com/doc/refman/5.0/en/server-system-variables.html#sysvar_expire_logs_days给出的类型为数字,但没有表明它是否需要整数。
答案1
事实上,有一种方法可以模拟它。
以下是清除二进制日志至 1 小时的步骤。
步骤 01)创建一个 SQL 脚本,删除所有时间戳超过一小时的二进制日志:
echo "FLUSH LOGS;" > /usr/bin/purge.sql
echo "PURGE BINARY LOGS BEFORE NOW() - INTERVAL 1 HOUR;" >> /usr/bin/purge.sql
步骤 02)创建一个 shell 脚本(/usr/bin/purge.sh
)来mysql
调用purge.sql
mysql -uroot -p... < /usr/bin/purge.sql
步骤 03) 使/usr/bin/purge.sh
可执行文件
chmod +x /usr/bin/purge.sh
步骤 04)添加usr/bin/purge.sh
到 crontab 中,每小时启动一次
0 * * * * /usr/bin/purge.sh
试一试 !!!
答案2
实验是当晚的重点......
mysql> 设置@@global.expire_logs_days=0.75; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=.75; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=3.4; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=3/4; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=F; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=0xF; 错误 1232 (42000):变量“expire_logs_days”的参数类型不正确 mysql> 设置@@global.expire_logs_days=1; 查询成功,影响 0 行(0.00 秒)
答案3
该页面确实说范围是 0-99..所以是的,它是一个整数。
0 = 没有过期..
你让我想知道 0.5 会做什么。我想它会忽略 .5 部分并且不会使它们过期。
答案4
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)
..
SET PERSIST binlog_expire_logs_seconds = 86400;
我添加了这个 my.cnf 文件
[mysqld]
binlog_expire_logs_seconds = 86400
expire_logs_days = 1