Скрипт конвертации БД из MyISAM в InnoDB

Делюсь скриптом для конвертации всех таблиц базы из MyISAM в InnoDB. Нашел когда-то где-то на просторах интернета.

Делюсь скриптом для конвертации всех таблиц базы из MyISAM в InnoDB. Нашел когда-то где-то на просторах интернета, на авторство не претендую совершенно.

#!/bin/bash
echo "Converting tables for database ИМЯ_БАЗЫ"
for table in `mysql -u ПОЛЬЗОВАТЕЛЬ -p'ПАРОЛЬ' -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'ИМЯ_БАЗЫ' AND engine = 'MyISAM'"`
do
echo -n " Alter table table $table "
mysql -u admin -p'ПАРОЛЬ' -N -e "ALTER TABLE $table ENGINE = InnoDB" ИМЯ_БАЗЫ
echo "done"
done
if [ "$table" = "" ]; then
echo "No tables found in ИМЯ_БАЗЫ"
else
echo "Converting completed"

Сохраните под любым именем, указав свои названия базы, логины и пароли, назначьте файлу права на выполнение либо запустите через bash. Все таблицы внутри указанной базы перейдут на движок InnoDB. В Ubuntu и Debian скрипт работает отлично.

Зачем нужна конвертация в InnoDB?

Строго говоря, если у вас нет такой надобности — смена движка не требуется. Конвертировать «на всякий случай» бессмысленно. Для сайтов с посещаемостью до десяти-тридцати тысяч человек в сутки нет никакой разницы, какой движок используют таблицы. Если сайт нагруженный, бездумная смена движка может навредить. Нужно смотреть, какие операции в БД происходят, искать медленные запросы и только тогда принимать соответствующее решение.

Есть специфический случай, для которого этот скрипт мне пригождался не раз: требовалось привести в порядок старый сайт на WordPress. Не раз замечал, что таблицы в таких сайтах используют и MyISAM, и InnoDB, да ещё и в разных кодировках. Возможно, при переносе с одного хостинга на другой менялись дефолтные параметры базы.

У InnoDB есть преимущество перед MyISAM, которое не раз сберегло нервы: автоматическое восстановление при сбоях. Когда сайт размещается на VPS какого-то не очень стабильного хостинга, сервер может зависать и перезагружаться в самые неожиданные моменты. Запускать каждый раз myisamchk для починки MyISAM таблиц накладно. В InnoDB это происходит автоматически по логам операций, лишь бы файловая система сервера не оказалась повреждена.