Может ли expire_logs_days быть меньше 1 дня в MySQL?

Может ли expire_logs_days быть меньше 1 дня в MySQL?

Итак... вчера я получил "письмо постфактум" о кампании, которая началась для одного из сервисов, которые я запускаю. Теперь сервер БД нагружен, жестко, примерно на 300 МБ/мин в двоичном журналировании для репликации. Как вы можете себе представить, это поглощает пространство с довольно огромной скоростью.

Мой обычный 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) Создайте скрипт оболочки ( /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

Связанный контент