Convert to innodb, перевод таблиц в innodb


InnoDB отличает от MyISAM — другого популярного движка баз данных MySQL прежде всего принцип блокировки при выполнении запросов и скорость работы. С InnoDB скорость работы сервера баз данных значительно возрастает и конвертация таблиц может быть решением при высокой нагрузке, создаваемой MySQL  из-за низкой оптимизированности запросов. В статье рассмотрен скрипт «Convert to innodb» автоматически изменяющий тип таблиц в указанной базе данных.



Прежде всего оказывается полезным узнать сколько таблиц и какие именно используют движок MyISAM.

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

SELECT TABLE_SCHEMA as DbName ,TABLE_NAME as TableName ,ENGINE as Engine FROM information_schema.TABLES WHERE ENGINE = 'MyISAM' AND TABLE_SCHEMA NOT IN('mysql','information_schema','performance_schema');



Авторизоваться в БД нужно с реквизитами пользователя root.

Чтобы преобразовать одну из таблиц из вывода предыдущей команды нужно выполнить:

USE databasename;

ALTER TABLE tablename ENGINE = InnoDB;



Этого запроса достаточно для того, чтобы конвертировать таблицу, но в больших проектах таких таблиц как правило сотни и тысячи и если нужно конвертировать все то повторять запрос для каждой непрактично.



Автоматизировать работу можно написав простой bash-скрипт. За счёт него таблицы на сервере можно перевести в InnoDB массово. Предварительно нужно создать бэкап базы данных на случай сбоев.



Перевод таблиц в innodb при помощи bash скрипта 'Convert to innodb'


#!/bin/bash
echo "Converting tables for database DBnamE"
for table in `mysql -u root -pPassworD -N -e "SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA = 'DBnamE' AND engine = 'MyISAM'"`
do
echo -n "  Alter table table $table ... "
mysql -u root -pfc8d68997c2c96c6f955921c23c48d33 -N -e "ALTER TABLE $table ENGINE = InnoDB" DBnamE
echo "done"
done
if [ "$table" = "" ]; then
echo "No tables found in DBnamE"
else
echo "Converting completed";
fi


Вместо DBnamE в скрипт подставляем имя базы данных, в которой находятся таблицы, вместо fc8d68997c2c96c6f955921c23c48d33 актуальный пароль пользователя root


В скрипте операции выполняются от имени пользователя root, но можно указать имя другого пользователя, который имеет достаточно привилегий для изменения таблиц


Вместо PassworD нужно указать пароль пользователя



Как и любой bash скрипт данный код нужно сохранить в файл и дать на него права на исполнение

chmod +x convert



Затем в файле подставляются имя баз данных, пользователя и его пароль и скрипт запускается и из консоли

./convert



Информация о конвертируемых таблицах будет выводиться на экран. Если случаются какие-то ошибки таблицы при которых они произошли нужно конвертировать вручную после того как скрипт отработает.



В случае если таблиц для конвертации не найдено скрипт об этом сообщит.


Convert to innodb


Пример приведен на скриншоте. Запуск выполнялся для пустой базы, такой же вывод будет в случае если в БД нет таблиц с движком MyISAM.

Читайте также про оптимизацию настроек MySQL

Сказать спасибо