Траблшутинг разрастания файла ibdata1 и журнала транзакций ib_logfile в MySQL
- Системный файл
ibdata1занимает десятки или сотни гигабайт и продолжает расти. - Раздел диска переполняется, вызывая аварийную остановку сервера баз данных с ошибкой
No space left on device. - Параметр
History list lengthв выводеSHOW ENGINE INNODB STATUSпревышает миллионы записей. - Логи транзакций
ib_logfile0,ib_logfile1или каталоги#innodb_redoне ротируются.
1. Анализ причин разрастания через статус InnoDB
SHOW ENGINE INNODB STATUS\GВ секции TRANSACTIONS проверьте наличие зависших или забытых транзакций (Long-running active transactions), удерживающих очистку Undo Log (History list length).
2. Настройка независимых табличных пространств
Убедитесь, что в /etc/mysql/my.cnf активирована опция размещения каждой таблицы в отдельном файле .ibd:
[mysqld]
innodb_file_per_table = 1
# Для MySQL 8.0: включение отдельных Undo пространств
innodb_undo_tablespaces = 2
innodb_undo_log_truncate = ON
innodb_max_undo_log_size = 1073741824 # 1GB3. Очистка и физическое сжатие файла ibdata1
InnoDB не уменьшает размер файла ibdata1 на диске автоматически даже после удаления данных. Единственный способ вернуть место в ОС:
- Сделать полный логический дамп:
mysqldump --all-databases --routines --triggers > /backup/full_dump.sql - Остановить службу и удалить файлы данных:
systemctl stop mysqld rm -rf /var/lib/mysql/* - Инициализировать базу и восстановить данные:
mysqld --initialize --user=mysql systemctl start mysqld mysql < /backup/full_dump.sql
4. Корректное изменение размера ib_logfile (для MySQL 5.7)
# В my.cnf: innodb_log_file_size = 512M
systemctl stop mysqld
mv /var/lib/mysql/ib_logfile* /tmp/
systemctl start mysqld Частые вопросы (FAQ)
Почему удаление строк командой DELETE не уменьшает размер ibdata1?
Освободившиеся страницы внутри ibdata1 помечаются как свободные для повторного использования ядром InnoDB, но физическое дисковое пространство файловой системе ОС не возвращается.
Как в MySQL 8.0 динамически управлять размером журналов Redo?
В MySQL 8.0.30+ размер Redo Log настраивается динамически параметром innodb_redo_log_capacity (например, SET GLOBAL innodb_redo_log_capacity = 2*1024*1024*1024;) без ручного удаления файлов.