[[Конвертация типа движка таблиц MySQL из MyISAM в InnoDB и обратно]]

MySQL

Конвертация типа движка таблиц 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
1) обычно /etc/mysql/my.cnf

Обсуждение

Денис, 2011/07/07 14:06

Не легче на PHP?

	$sql = "SHOW TABLES";
	$query = mysql_db_query(DBName, $sql);
	while($row = mysql_fetch_assoc($query))
	{
			mysql_db_query(DBName, "ALTER TABLE `".$row['Tables_in_sportextre']."` ENGINE = InnoDB");
	}
Crank, 2013/04/01 11:35

Представьте что у вас база размером в несколько гигабайт с десятками миллионов записей. Как думаете что будет быстрее ваш способ или предложенный в статье?

Dmitriy, 2012/03/02 18:29

Легче просто с консоли одной строкой ;-) как то так:

for n in `mysql DBNAME -pPASSDB -B -N -e "show tables;"`;do mysql DB_NAME -pPASSDB -B -N -e "ALTER TABLE $n ENGINE=innodb;";done

…сам только что так сделал, 120 таблиц - проверено "мин нет" :-)

ЗЫ bash надеюсь у всех есть? ;-)

Aleksey, 2012/03/02 20:14

Что будешь делать если есть FullText индекс ?

Dmitriy, 2012/03/02 20:24

..ну небыло у меня таких:-)

попадусь - напишу обязательно FIXME

Igor, 2014/03/11 22:49

Спасибо!

Mac, 2014/08/31 21:02

Пытаюсь конвертировать InnoDB в MyISAM. После

sed -i s/ENGINE=InnoDB/ENGINE=MyISAM/g dbname.sql > dbname.myisam.sql

Создается пустой файл.

dim-dim, 2015/01/11 20:17

та же беда. на выходе пустой файл. хотя во временный файл делает вид, что пишет.

BrainFucker, 2015/02/10 21:52

Тут либо ключ -i не нужен, либо не нужно > dbname.myisam.sql

При использовании ключа -i сразу изменяется исходный файл.

Михаил, 2016/08/25 22:03

Здравствуйте. Эк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, но не знаю как это сделать, по возможности помогите по шагово, учусь.

заранее благодарен.

С уважением.

Aleksey, 2016/08/25 22:06

Отказаться от FULLTEXT indexes в таблице wp_posts и других если есть

сами же и нашли ответ

Ваш комментарий. Вики-синтаксис разрешён:
75 +11 = ?
 
practice/mysql/convert_myisam_innodb.txt · Последние изменения: 2015/02/11 09:44 — lexa
Gentoo Linux Driven by DokuWiki