Существует несколько способов преобразования таблицы (типа, движка) MySQL из одной подсистемы хранения в другую (например, из MyISAM в InnoDB), и у каждого из них есть свои преимущества и недостатки.
В этом блоге мы рассмотрим три наиболее распространенных способа.
ALTER TABLE
Простейший способ преобразования таблицы из одной подсистемы в другую — использование команды ALTER TABLE
. Следующая команда преобразует таблицу mytable к типу InnoDB:
mysql> ALTER TABLE mytable ENGINE = InnoDB;
Такой синтаксис работает для всех подсистем хранения, но есть одна загвоздка — это может занять много времени. MySQL будет построчно копировать старую таблицу в новую. В это время, скорее всего, будет задействована вся пропускная способность диска сервера, а исходная таблица окажется заблокированной для чтения. Поэтому будьте осторожны, применяя этот подход для активно используемых таблиц. Вместо него можно задействовать один из рассмотренных далее методов, которые сначала создают копию таблицы.
При изменении подсистемы хранения утрачиваются все присущие старой подсистеме возможности. Например, после преобразования таблицы InnoDB в MyISAM, а потом обратно будут потеряны все внешние ключи, определенные в исходной таблице InnoDB.
Экспорт и импорт
Чтобы лучше контролировать процесс преобразования, можете сначала экспортировать таблицу в текстовый файл с помощью утилиты mysqldump
. После этого можно будет просто изменить команду CREATE TABLE
в этом текстовом файле. Не забудьте изменить название таблицы и ее тип, поскольку нельзя иметь две таблицы с одинаковыми именами в одной и той же базе данных, даже если у них разные типы, — a mysqldump
по умолчанию пишет команду DROP TABLE
перед командой CREATE TABLE
, так что вы можете потерять свои данные, если не будете осторожны!
CREATE и SELECT
Третий способ преобразования обеспечивает компромисс между скоростью первого и безопасностью второго. Вместо того чтобы экспортировать всю таблицу или преобразовывать ее за один прием, создайте новую таблицу и используйте для ее заполнения команду MySQL INSERT ... SELECT
следующим образом:
mysql> CREATE TABLE innodb_table LIKE myisam_table;
mysql> ALTER TABLE innodb.table ENGINE=InnoDB;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table;
При небольших объемах данных это хороший вариант. Но если объем данных велик, то зачастую гораздо эффективнее заполнять таблицу частями, подтверждая транзакцию после каждой части, чтобы журнал отмены не становился слишком большим. Предполагая, что id
является первичным ключом, запустите этот запрос несколько раз (каждый раз задавая все большие значения х
и у
), пока не скопируете все данные в новую таблицу:
mysql> START TRANSACTION;
mysql> INSERT INTO innodb_table SELECT * FROM myisam_table -> WHERE id BETWEEN x AND y;
mysql> COMMIT;
После выполнения у вас будет исходная таблица, которую можно удалить, и целиком заполненная новая таблица. Не забудьте заблокировать исходную таблицу, если не хотите получить несогласованную копию данных!