MySQL: как преобразовать много таблиц MyISAM в InnoDB в производственной базе данных?

Смотрите на программу 'маршрута' на Linux (маршрут человека). При попытке выполнить статическую маршрутизацию, что-то вроде:

route add [-host|-net] ...[etc]

Что Вы пытаетесь сделать точно? Еще с некоторыми деталями кто-то мог, вероятно, привести Вас к точно решению, которое Вы ищете.

3
задан 27 February 2011 в 13:46
4 ответа

Можно сделать это. Преобразование от MyISAM до InnoDB не должно быть проблемой, поскольку InnoDB имеет больше функций, которые не доступны в MyISAM, таком как транзакции.

Можно изменить таблицы, в то время как база данных работает. Никакая потребность в завершении работы, но эта операция не заблокирует таблицы.

В течение времени это возьмет, это зависит от размера спецификаций/загрузки/дб сервера и т.д.

Можно сделать это с помощью сценария для автоматизации процесса. Используя команду show tables, можно получить список таблиц. Затем с помощью простого сценария можно прочитать этот список и выполниться, изменяют команды таблицы.

Вот простой сценарий жемчуга, который прочитает список таблиц из файла и запишет 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
ответ дан 3 December 2019 в 05:08

Я использую, СОЗДАЙТЕ и ВЫБЕРИТЕ:

 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 и затем переименуйте DB.

3
ответ дан 3 December 2019 в 05:08

Khaled и ooshro покрыли Вас на семантике; вопросы 2 и 4 более трудно судить, потому что это зависит от Вашей конфигурации и аппаратных средств. То, что Вы могли сделать для № 2, является дампом DB в файл, и импортируйте его к рабочей станции, или другой сервер (пойдите, покупают облачную Часть за 5$ и использование, что, если Вы имеете к), затем попытайтесь выполнить Ваш изменять опции на нем для наблюдения, сколько времени он принимает просто общий, полный смысл. Это не действительно идеальный тест, но это лучше чем ничего - 700 МБ не являются очень большими и не займут много времени, если Ваш MySQL находится на выделенном сервере с питанием (RAM Dell 2970 w/16gig, например).

Для № 4 - не преобразовывают mysql/базу данных в InnoDB.:) В целом, процесс вызовет полную блокировку таблицы, в то время как он работает (реалистично, в фоновом режиме он просто составляет новую таблицу, передавая данные, затем удалите/переименуйте его в место), таким образом, Вы хотите изменить механизмы во время от часов ночью. Удостоверьтесь, чтобы Вы получили полный дамп на всякий случай, что-то идет не так, как надо. (mysqldump-A - полномочия сброса> dbdump.sql).

1
ответ дан 3 December 2019 в 05:08

У меня есть автоматизированный способ преобразовать 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
2
ответ дан 3 December 2019 в 05:08

Теги

Похожие вопросы