
Итак... вчера я получил "письмо постфактум" о кампании, которая началась для одного из сервисов, которые я запускаю. Теперь сервер БД нагружен, жестко, примерно на 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