Безопасное удаление и ротация бинарных логов (binlog) в MySQL: binlog_expire_logs_seconds
- Диск переполняется сотнями файлов вида
binlog.000123илиmysql-bin.000456. - Сервер аварийно блокирует транзакции в режиме
read-onlyиз-за исчерпания свободного места. - Удаление файлов логов вручную через
rmприводит к нарушению целостности индексаbinlog.index.
1. Просмотр текущих файлов бинарных логов
SHOW BINARY LOGS;
SHOW MASTER STATUS;2. Безопасная ручная очистка бинарных логов
# Удалить все логи старше конкретной даты
PURGE BINARY LOGS BEFORE '2024-01-01 00:00:00';
# Удалить все логи до определенного файла (не включая его)
PURGE BINARY LOGS TO 'binlog.000150';3. Автоматическая ротация и настройка срока жизни (TTL)
Отредактируйте /etc/mysql/my.cnf:
[mysqld]
# Хранить логи не более 3 дней (3 дня = 259200 секунд)
binlog_expire_logs_seconds = 259200
# Максимальный размер одного файла бинлога перед ротацией
max_binlog_size = 500MПрименение без перезагрузки:
SET GLOBAL binlog_expire_logs_seconds = 259200;4. Восстановление при случайном удалении через 'rm'
Если файлы были удалены через консоль Linux и MySQL выдает ошибки:
# Пересоздать чистый binlog поток
RESET MASTER; Частые вопросы (FAQ)
Почему нельзя просто удалить старые binlog-файлы через rm -f?
MySQL ведет текстовый индекс-файл (например, binlog.index), где зарегистрированы все сегменты. Ручное удаление приведет к несоответствию индекса и сбою репликации реплик.
В чем разница между expire_logs_days и binlog_expire_logs_seconds?
Параметр expire_logs_days устарел и поддерживает только целочисленные значения в днях. binlog_expire_logs_seconds позволяет задавать точный срок хранения с точностью до секунды.