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
Информация о конвертируемых таблицах будет выводиться на экран. Если случаются какие-то ошибки таблицы при которых они произошли нужно конвертировать вручную после того как скрипт отработает.
В случае если таблиц для конвертации не найдено скрипт об этом сообщит.
Пример приведен на скриншоте. Запуск выполнялся для пустой базы, такой же вывод будет в случае если в БД нет таблиц с движком MyISAM.
Читайте также про оптимизацию настроек MySQL