Назад | Перейти на главную страницу

MySQL отменил импорт - потерянные данные в файле ibdata

Я импортировал дамп базы данных - почти 1 ГБ:

mysql -uroot -ppassword < mysqldump.sql

Когда я получил предупреждение о том, что жесткий диск почти заполнен. Я запаниковал и нажал Ctrl-C на импорте. Дважды.

Глядя на свою БД, я вижу, что импорт был отменен. Однако когда я смотрю в /var/lib/mysql/ я могу видеть ibdata1 все еще слишком велик - я думаю, в нем все еще есть все импортированные данные. Это примерно в два раза больше, чем должно быть для данных, доступных в БД.

Я побежал mysqlcheck -optimize -A но во всяком случае это сделало ibdata1 файл большего размера.

Как я могу удалить эти потерянные данные? У меня на жестком диске осталось около 100МБ ...

Это известная ошибка MySQL: 1341. Это продолжается уже 8 лет. Вы можете попробовать обходной путь, опубликовано на StackOverflow:

Который ibdata1 не сжимается - особенно неприятная особенность MySQL. В ibdata1 файл не может быть сокращен, если вы не удалите все базы данных, файлы и перезагрузите дамп.

Но вы можете настроить MySQL так, чтобы каждая таблица, включая ее индексы, хранилась как отдельный файл. Таким образом ibdata1 не станет таким большим.

Это было некоторое время назад. Однако, чтобы настроить сервер для использования отдельных файлов для каждой таблицы, вам необходимо изменить my.cnf чтобы включить это:

[mysqld]
innodb_file_per_table=1

http://dev.mysql.com/doc/refman/5.5/en/multiple-tablespaces.html

Как вы хотите освободить пространство от ibdata1 вам действительно нужно удалить файл:

  1. Сделать mysqldump всех баз данных, процедур, триггеров и т. д.
  2. Отбросьте все базы данных, кроме mysql-db
  3. Остановить mysql
  4. Удалить ibdata1 и ib_log файлы
  5. Запустить mysql
  6. Восстановить из дампа

Когда вы запускаете MySQL на шаге 5, ibdata1 и ib-log файлы будут созданы заново.

Теперь ты готов к работе. При создании новой базы данных для анализа таблицы будут располагаться в отдельных ibd* файлы, а не в ibdata1. Поскольку вы обычно удаляете базу данных вскоре после этого, ibd* файлы будут удалены.

http://dev.mysql.com/doc/refman/5.1/en/drop-database.html

Или, если вы хотите, чтобы база данных работала, пока вы это делаете, вы можете попробовать следующее:

Включите опцию innodb_file_per_table, не закрывая базу данных. Идея такая:

  • Настройте исходную базу данных как главную. Если ваша база данных уже не использует журналы для обеспечения безопасности, это единственный шаг, который потребует перезапуска MySQL.
  • Сделайте резервную копию исходной базы данных с помощью Xtrabackup.
  • Восстановите резервную копию и запустите второй экземпляр MySQL.
  • Запустите mysqldump на втором экземпляре.
  • Остановите второй экземпляр, но пока не удаляйте его.
  • Создайте новую базу данных и запустите третий экземпляр MySQL с включенной опцией innodb_file_per_table.
  • Восстановите дамп, загрузив его в третий экземпляр MySQL.
  • Настройте третий экземпляр как подчиненный и запустите репликацию.
  • Когда начальная репликация завершится и ведомое устройство догонит ведущего, перенастройте своих клиентов для использования нового экземпляра.
  • Вот и все. Теперь вы можете остановить первый экземпляр и удалить его.

Подробную статью можно найти здесь.