Конвертация типа движка таблиц MySQL из MyISAM в InnoDB и обратно
Если перед вами возникла задача конвертировать таблицы MyISAM в InnoDB (или наоборот), то можете воспользоваться моей инструкцией.
Я провожу конвертацию sql дампа из-за этого создает даунтайм на время операции.
Предварительно
Перед тем как начать стоит убедиться, что в конфиге mysql включена поддержка InnoDB и другие параметры настроены верно, иначе потеряете и время и нервы.
Откройте конфиг mysql 1) и убедитесь что там нет или закоментирована сточка skip-innodb (если вы наоборот отказываетесь от innodb, то в последствии можете добавить эту строчку, это позволит сэкономить память на ненужном движке).
Так же для innodb убедитесь в правильности параметра innodb_data_file_path. Он должен быть похож на:
innodb_data_file_path = ibdata1:100M:autoextend
, где 100M – минимальный создаваемый размер файла под хранение таблиц, autoextend – разрешает автоматическое увеличение этого файла.
Если у этого параметра установлен еще ключ max:NN – то либо удалите его совсем, либо выставите *NN* в максимальный размер для одной таблице, иначе импорт дампа может выпасть за этот лимит и придется его менять.
Или за место innodb_data_file_path использовать innodb_file_per_table, тогда под каждую таблицу будет использоваться свой отдельный файл.
Любые изменения в конфигурации потребует перезапуска mysql сервера.
Конвертация
Все операции выполняются в консоле.
- Создание исходного дампа базы:
mysqldump --opt -u USER -p DBNAME > dbname.sql
- Изменяем тип движка для таблиц:
для MyISAM → InnoDB:
sed 's/ENGINE=MyISAM/ENGINE=InnoDB/g' dbname.sql > dbname.innodb.sql
для InnoDB → MyISAM:
sed s/ENGINE=InnoDB/ENGINE=MyISAM/g dbname.sql > dbname.myisam.sql
- Теперь удалим саму БД:
mysqladmin -u USER -p drop DBNAME
- И создадим заново:
mysqladmin -u USER -p create DBNAME
- Заливаем дамп обратно:
mysql -u USER -p DBNAME < dbname.{innodb|myisam}.sql
Обсуждение
Не легче на PHP?
Представьте что у вас база размером в несколько гигабайт с десятками миллионов записей. Как думаете что будет быстрее ваш способ или предложенный в статье?
Легче просто с консоли одной строкой как то так:
…сам только что так сделал, 120 таблиц - проверено "мин нет"
ЗЫ bash надеюсь у всех есть?
Что будешь делать если есть FullText индекс ?
..ну небыло у меня таких
попадусь - напишу обязательно
Спасибо!
Пытаюсь конвертировать InnoDB в MyISAM. После
Создается пустой файл.
та же беда. на выходе пустой файл. хотя во временный файл делает вид, что пишет.
Тут либо ключ -i не нужен, либо не нужно
> dbname.myisam.sql
При использовании ключа -i сразу изменяется исходный файл.
Здравствуйте. Экcпортировал БД,пытаюсь установить на локалку Open Server
выдает ошибку - Ошибка
SQL запрос:
ALTER TABLE `wp_posts` ADD FULLTEXT KEY `wppepvn_post_title_ftind` (`post_title`);
Ответ MySQL: Документация
#1214 - The used table type doesn't support FULLTEXT indexes
понимаю что надо поменять движок - InnoDB на MyISAM, но не знаю как это сделать, по возможности помогите по шагово, учусь.
заранее благодарен.
С уважением.
Отказаться от FULLTEXT indexes в таблице wp_posts и других если есть
сами же и нашли ответ