Справочник системных ошибок и решений

Windows Server, Active Directory, 1С:Предприятие, СУБД, Linux, Cisco, MikroTik, Asterisk.

⚠️ Важная информация Все материалы, инструкции, команды и скрипты на сайте предоставлены исключительно в ознакомительных целях. Их применение может повлиять на работу операционной системы, программного обеспечения, баз данных, сетевого оборудования и других компонентов инфраструктуры. Перед выполнением действий создайте резервную копию и по возможности протестируйте изменения в безопасной среде. Пользователь самостоятельно оценивает риски и несет ответственность за результат. При отсутствии необходимых знаний обратитесь к квалифицированному ИТ-специалисту.

IBDATA1_DISK_FULL Linux / DevOps

Траблшутинг разрастания файла ibdata1 и журнала транзакций ib_logfile в MySQL

Обновлено: 21.08.2026
  • Системный файл 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  # 1GB

3. Очистка и физическое сжатие файла ibdata1

InnoDB не уменьшает размер файла ibdata1 на диске автоматически даже после удаления данных. Единственный способ вернуть место в ОС:

  1. Сделать полный логический дамп:
    mysqldump --all-databases --routines --triggers > /backup/full_dump.sql
  2. Остановить службу и удалить файлы данных:
    systemctl stop mysqld
    rm -rf /var/lib/mysql/*
  3. Инициализировать базу и восстановить данные:
    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
💡 Практика специалистов: Главная причина разрастания ibdata1 — зависшие транзакции в состоянии 'Sleep' (например, незакрытые коннекты в пулах соединений PHP/Python). Настройте wait_timeout и interactive_timeout, чтобы сервер принудительно обрывал их.

Частые вопросы (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;) без ручного удаления файлов.

Полезные материалы
Рекомендуем