Уменьшаем размер ibdata1 в MySQL

При работе с базами данных в MySQL рано или поздно начинает полнеть файл ibdata1. Этот файл содержит в себе индексы и данные всех innodb таблиц, если не было указано в настройках иное. При работе с крупными базами рекомендуется использовать опцию innodb_file_per_table, тогда этот файл будет гораздо меньше. Но просто добавлением опции дело не исправить, необходимо переложить все таблицы имеющихся баз руками в отдельные файлы и папки.

Для этого:

  1. Делаем бэкап всех баз
    mysqldump --all-databases -p > mysqldump-all.sql
  2. Удаляем все базы, кроме служебных (mysql и performance_schema)
  3. Добавляем в my.cnf опцию innodb_file_per_table в секцию [mysqld]
  4. Останавливаем MySQL
  5. Удаляем файлы /var/lib/mysql/ibdata1 и /var/lib/mysql/ib_logfile*
  6. Запускаем MySQL
  7. Заливаем дамп назад, наблюдая за заполнением /var/lib/mysql отдельными папками под каждую базу
    mysql -p < mysqldump-all.sql

Ссылки: