У нас есть производственная база данных, полностью состоящая из таблиц MyISAM. Мы рассматриваем возможность преобразования их в InnoDB, чтобы улучшить параллелизм и надежность.
Могу ли я просто изменить таблицы myISAM на InnoDB, не завершая работу MySQL? Какие здесь рекомендуемые процедуры?
Сколько времени займет такое преобразование? Все таблицы имеют общий размер около 700 МБ.
Таблиц довольно много. Есть ли способ подать заявку ALTER TABLE
ко всем таблицам MyISAM сразу, а не по одной?
Есть ли подводные камни, о которых мне нужно знать?
Спасибо
Я использую CREATE и SELECT:
mysql> CREATE TABLE i_table LIKE table;
mysql> ALTER TABLE i_table ENGINE=InnoDB;
mysql> INSERT INTO i_table SELECT * FROM table;
mysql> RENAME TABLE table TO b_table;
mysql> RENAME TABLE i_ TO other_db.tbl_name;
Это хорошо работает, если у вас мало данных. Лучше использовать
mysql> ALTER TABLE table ENGINE = InnoDB;
Будьте осторожны, прежде чем пробовать этот метод в загруженной базе данных.
Также вы можете сделать дамп db, изменить ENGINE в файле дампа и имя DATABASE в файле дампа. Восстановите БД, а затем переименуйте БД.
У меня есть автоматический способ конвертировать MyISAM в InnoDB, используя только MySQL
Вот запрос для создания таблиц SQL для MyISAM в каждой базе данных:
SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL
FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN
('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length);
В командной строке Linux запустите создание сценария следующим образом:
mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema NOT IN ('information_schema','mysql','performance_schema') ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql
Это сгенерирует SQL для преобразования каждой таблицы MyISAM во всех базах данных из самой маленькой таблицы в самую большую таблицу.
Вы можете легко настроить SQL для преобразования всех таблиц MyISAM в InnoDB в конкретной базе данных, подобной этой (например, базе данных mystuff):
mysql -h... -u... -p.... -A --skip-column-names -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=InnoDB;') InnoDBConversionSQL FROM information_schema.tables WHERE engine='MyISAM' AND table_schema = 'mystuff' ORDER BY (data_length+index_length)" > MyISAM_To_InnoDB.sql
Ты можешь это сделать. Преобразование из MyISAM в InnoDB не должно быть проблемой, поскольку InnoDB имеет больше функций, недоступных в MyISAM, таких как транзакции.
Вы можете изменять таблицы во время работы базы данных. Нет необходимости выключать, но эта операция заблокирует таблицы.
Время, которое потребуется, зависит от спецификаций / нагрузки / размера сервера и т. Д.
Вы можете сделать это с помощью сценария для автоматизации процесса. Используя команду show tables
, вы можете получить список таблиц. Затем, используя простой скрипт, вы можете прочитать этот список и выполнить команды изменения таблицы.
Вот простой Perl-скрипт, который будет читать список таблиц из файла и записывать SQL-запросы в другой файл. После вызова этого скрипта вы можете передать выходной файл в mysql
команду для внесения необходимых изменений.
open(INFILE, "< tables_list.txt");
open(OUTFILE, "> alter_tables.sql");
foreach my $name (<INFILE>) {
chomp($name);
print OUTFILE "ALTER TABLE $name engine=InnoDB;\n";
}
close(INFILE);
close(OUTFILE);
Халед и оошро рассмотрели семантику; вопросы 2 и 4 труднее судить, потому что это зависит от вашей конфигурации и оборудования. Что вы можете сделать для # 2, так это выгрузить БД в файл и импортировать его на рабочую станцию или другой сервер (купите облачный Slice за 5 долларов и используйте его, если вам нужно), затем попробуйте выполнить свои параметры изменения, чтобы увидеть сколько времени это займет в общем, общем смысле. Это не совсем идеальный тест, но лучше, чем ничего - 700 МБ не очень много и не займет много времени, если ваш MySQL находится на выделенном сервере с питанием (например, Dell 2970 с 16 ГБ ОЗУ).
Для №4 - не конвертируйте mysql / database в InnoDB. :) В целом, процесс вызовет полную блокировку таблицы во время его работы (реально, в фоновом режиме он просто создает новую таблицу, передает данные, а затем удаляет / переименовывает ее на место), поэтому вы хотите изменить движки в нерабочее время ночью. Убедитесь, что вы получаете полный дамп на случай, если что-то пойдет не так. (mysqldump -A --flush-привилегии> dbdump.sql).