Очистка файла mysql ibdata1

ibdata1 хранит данные таблиц (кроме схем — они хранятся в других файлах), индексы и некоторую другую  информацию. Этот файл нельзя просто удалить, так как это приведет к уничтожению данных таблиц. Кроме того файл ibdata1 фактически не может быть сокращен в размере, если только вы не удалите все базы данных, не удалите файлы и не перезагрузите дамп.

С целью оптимизации потребления дискового пространства файлом ibdata1 я предлагаю комплексный подход: настроить MySQL на использование отдельных файлов для каждой таблицы и затем освобождение дискового пространства, занятого файлом ibdata1 :

Чтобы настроить сервер для использования отдельных файлов для каждой таблицы, в my.cnf добавьте следующую директиву:

Далее освобождаем пространство, занятое файлом ibdata1:

  • Сделайте mysqldump всех баз данных, процедур, триггеров и т.д.:
  • Удалите все базы данных , кроме mysql и performance_schema:
  • Остановите mysql:
  • Удалите ibdata1 и ib_log файлы:

    (и удалите любой другой ib_logfile, который может быть назван ib_logfile0, ib_logfile1 и т.д.)
  • Запустите mysql:

  • Восстановите базы данных из дампа:

Команда выше сработает если alldatabases.sql содержит CREATE DATABASE директивы, иначе вам необходимо будет сначала создать пустые базы данных командами create database [database_name] и лишь затем выполнить последний шаг.

После запуска MySQL файлы ibdata1 и ib_log будут воссозданы. Но теперь когда вы создаете новую базу данных, таблицы будут находиться в отдельных файлах ibd*, а не в ibdata1. Как правило, если вы удаляете базу данных, файлы ibd* также будут удалены.
Используя команду ALTER TABLE ENGINE=innodb или OPTIMIZE TABLE , вы можете извлекать данные и индексировать страницы из ibdata1 для разделения файлов. Однако ibdata1 не будет сокращаться в размере, если вы не выполните указанные выше шаги.