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

Безопасное преобразование из одного файла InnoDB (ibdata) в файл innodb для каждой таблицы

У меня есть база данных MySQL с таблицами на движке InnoDB. Но сервер настроен на использование только одного файла ibdata0 без параметра innodb_file_per_table. Я хочу изменить это без создания дампа и восстановить его на перенастроенном сервере. Итак, мой план состоял в том, чтобы добавить параметр innodb_file_per_table в my.cnf перезапустите сервер и принудительно используйте ALTER TABLE перестроить все таблицы InnoDB.

Делать ALTER TABLE tablename ENGINE = InnoDB должен создать .idb файл для каждого .frm файл в моем /val/lib/mysql/mydatabase каталог, и это произошло (и я подумал переместить данные из ibdata файл). Но после того, как я выключил сервер и удалил старый файл ibdata, я вижу все таблицы (SHOW TABLES) но если я сделаю SELECT в них я получаю такую ​​ошибку:

ERROR 1146 (42S02): Table 'mytable' doesn't exist

Поэтому я полагаю, что некоторые данные остались в старом файле ibdata.

Я что-то пропустил? Есть ли способ делать то, что я хочу?

Нет, придется делать дамп и восстанавливать. Даже после выполнения alter table engine Уловка, некоторые данные останутся в файле ibdata1.

  • Выгрузить все таблицы innodb во внешние файлы
  • Отбросить все таблицы innodb
  • Выключите mysql
  • Удалите ibdata1 (и любые файлы журналов, если они существуют)
  • Запустить mysql
  • Импортировать файлы дампа sql

Я сам столкнулся с этой проблемой, и сброс всех таблиц, а затем их повторный импорт без выключения mysql не работает. Перед удалением файла ibdata1 необходимо удалить все таблицы innodb.