MySQL: журнал двоичных изменений заполнил диск
Журнал двоичных изменений нужен для репликации и восстановления, но без настроенной очистки он растёт бесконечно. При заполнении раздела база останавливается — и это одна из самых частых причин внезапной остановки MySQL на долго работающих серверах.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Не настроен срок хранения журнала
Без срока файлы копятся годами. На нагруженной базе это десятки гигабайт в месяц.
-
Реплика отстала и держит файлы
База не удаляет журнал, пока он нужен подписчику. Отставшая или отключённая реплика приводит к росту.
-
Раздел мал для объёма изменений
При интенсивной записи журнал занимает много места между очистками.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Размер файлов журнала изменений.
sudo du -sh /var/lib/mysql/*bin.* 2>/dev/null | tail -5Список файлов журнала с размерами.
mysql -e 'SHOW BINARY LOGS;' 2>/dev/null | tail -5Свободное место на разделе базы.
df -h /var/lib/mysqlРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Без срока файлы копятся годами. На нагруженной базе это десятки гигабайт в месяц.
- Как проверить
-
Посмотрите срок и размер журнала.
mysql -e "SHOW VARIABLES LIKE 'binlog_expire_logs_seconds';" 2>/dev/null sudo du -sh /var/lib/mysql/*bin.* 2>/dev/null | tail -3
- Как исправить
- Задайте срок хранения в настройках. Удалять файлы вручную из файловой системы нельзя: база потеряет их учёт.
- Почему происходит
- База не удаляет журнал, пока он нужен подписчику. Отставшая или отключённая реплика приводит к росту.
- Как проверить
-
Посмотрите состояние репликации.
mysql -e 'SHOW REPLICAS;' 2>/dev/null || mysql -e 'SHOW SLAVE HOSTS;' 2>/dev/null
- Как исправить
- Восстановите репликацию или уберите ненужного подписчика. Пока он числится, файлы будут храниться.
- Почему происходит
- При интенсивной записи журнал занимает много места между очистками.
- Как проверить
-
Посмотрите место и размеры файлов.
df -h /var/lib/mysql sudo ls -lh /var/lib/mysql/ | grep bin | tail -5
- Как исправить
- Вынесите журнал на отдельный раздел или сократите срок хранения.
Пример вывода
Журнал изменений заполнил раздел. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
mysqld[1200]: [ERROR] [MY-000035] [Server] Disk is full writing './binlog.000412' (OS errno 28 - No space left on device). Waiting for someone to free space...
mysqld[1200]: [ERROR] [MY-011072] [Server] Retry attempt 1 ...
Связанные ошибки
- No space left on device в журнале службы Нет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- MySQL: InnoDB не запускается после аварийного завершения Ошибки InnoDB при старте: повреждение страниц, несовпадение журнала, режим принудительного восстановления.
- Disk quota exceeded для службы Место на разделе есть, а запись отклоняется: исчерпана дисковая квота пользователя или группы.
- Docker: no space left on device при запуске контейнеров Раздел с /var/lib/docker заполнен образами и слоями. Как посчитать занятое и что можно удалить безопасно.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Input/output error в журнале службы Ошибка ввода-вывода: проблемы носителя, отвалившийся сетевой ресурс, повреждённая файловая система. Что проверять срочно.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- MySQL: Can't connect to local server through socket Клиент не находит unix-сокет MySQL: сервер не запущен, путь к сокету другой, каталог в /run не создан.
Где встречается чаще всего
Источники
- Документация MySQL: журнал двоичных изменений
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено заполнением раздела файлами журнала изменений.