Как преобразовать все таблицы из MyISAM в InnoDB? - PullRequest
237 голосов
/ 04 октября 2010

Я знаю, что могу по отдельности выдать таблицу изменения, чтобы изменить хранилище таблиц с MyISAM на InnoDB.

Мне интересно, есть ли способ быстро изменить их все на InnoDB?

Ответы [ 26 ]

6 голосов
/ 23 ноября 2017

Чтобы сгенерировать операторы ALTER для всех таблиц во всех несистемных схемах, упорядоченных по этим схемам / таблицам, выполните следующее:

SELECT  CONCAT('ALTER TABLE ',TABLE_SCHEMA,'.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables
WHERE   TABLE_SCHEMA NOT IN ('mysql', 'information_schema', 'performance_schema', 'innodb', 'sys', 'tmp')
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY TABLE_SCHEMA, table_name DESC;

После этого выполните эти запросы через клиента, чтобы выполнить изменение.

  • Ответ основан на ответах выше, но улучшает обработку схемы.
5 голосов
/ 28 апреля 2015

Обычная версия MySQL.

Вы можете просто запустить исполняемый файл mysql, использовать базу данных и скопировать и вставить запрос.

Это преобразует все таблицы MyISAM в текущей базе данных в таблицы INNODB.

DROP PROCEDURE IF EXISTS convertToInnodb;
DELIMITER //
CREATE PROCEDURE convertToInnodb()
BEGIN
mainloop: LOOP
  SELECT TABLE_NAME INTO @convertTable FROM information_schema.TABLES
  WHERE `TABLE_SCHEMA` LIKE DATABASE()
  AND `ENGINE` LIKE 'MyISAM' ORDER BY TABLE_NAME LIMIT 1;
  IF @convertTable IS NULL THEN 
    LEAVE mainloop;
  END IF;
  SET @sqltext := CONCAT('ALTER TABLE `', DATABASE(), '`.`', @convertTable, '` ENGINE = INNODB');
  PREPARE convertTables FROM @sqltext;
  EXECUTE convertTables;
  DEALLOCATE PREPARE convertTables;
  SET @convertTable = NULL;
END LOOP mainloop;

END//
DELIMITER ;

CALL convertToInnodb();
DROP PROCEDURE IF EXISTS convertToInnodb;
5 голосов
/ 11 сентября 2012

Внутри mysql вы можете использовать поиск / замену с помощью текстового редактора:

SELECT table_schema, table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Примечание: вы, вероятно, должны игнорировать information_schema и mysql, потому что «Базы данных mysql и information_schema, которые реализуют некоторые из внутренних компонентов MySQL, все еще используют MyISAM. В частности, вы не можете переключить таблицы предоставления для использования InnoDB». (http://dev.mysql.com/doc/refman/5.5/en/innodb-default-se.html)

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

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'myisam';

Теперь просто скопируйте / вставьте этот список в ваш текстовый редактор и найдите / замените "|" с «ALTER TABLE» и т. д.

Затем у вас будет такой список, который вы можете просто вставить в свой терминал mysql:

ALTER TABLE arth_commentmeta           ENGINE=Innodb;
ALTER TABLE arth_comments              ENGINE=Innodb;
ALTER TABLE arth_links                 ENGINE=Innodb;
ALTER TABLE arth_options               ENGINE=Innodb;
ALTER TABLE arth_postmeta              ENGINE=Innodb;
ALTER TABLE arth_posts                 ENGINE=Innodb;
ALTER TABLE arth_term_relationships    ENGINE=Innodb;
ALTER TABLE arth_term_taxonomy         ENGINE=Innodb;
ALTER TABLE arth_terms                 ENGINE=Innodb;
ALTER TABLE arth_usermeta              ENGINE=Innodb;

Если ваш текстовый редактор не может сделать это легко, вот другое решение для получения аналогичного списка (который вы можете вставить в mysql) только для одного префикса вашей базы данных из терминала linux:

mysql -u [username] -p[password] -B -N -e 'show tables like "arth_%"' [database name] | xargs -I '{}' echo "ALTER TABLE {} ENGINE=INNODB;"
3 голосов
/ 08 октября 2013

используйте эту строку, чтобы изменить ядро ​​базы данных для одной таблицы.

  ALTER TABLE table_name ENGINE = INNODB;
3 голосов
/ 03 января 2014

Я новичок и должен был найти свое собственное решение, потому что команды mysql в Интернете, как правило, изобилуют орфографическими ошибками, которые создают настоящий кошмар для людей, только начинающих.Вот мое решение ....

Вместо одной команды на таблицу я подготовил сразу несколько десятков команд (готовых для копирования и вставки), используя excel.

Как?разверните окно замазки и введите mysql, а затем выполните команду "SHOW TABLE STATUS;"и скопируйте / вставьте вывод в Microsoft Excel.Перейдите на вкладку «Данные» и используйте функцию «текст в столбцы», разделив столбцы клавишей пробела.Затем отсортируйте столбцы по тому, какой столбец показывает типы таблиц, и удалите все строки, таблицы которых уже находятся в формате InnoDb (поскольку нам не нужно запускать команды для них, они уже выполнены).Затем добавьте 2 столбца слева от столбца таблиц и 2 столбца справа.Затем вставьте первую часть команды в столбец-1 (см. Ниже).Колонка 2 должна содержать только пробел.Столбец 3 - это столбец вашей таблицы.Колонка 4 должна содержать только пробел.Колонка 5 - последняя часть вашей команды.Это должно выглядеть так:

column-1        column-2            column-3         column-4     column-5
ALTER TABLE     t_lade_tr           ENGINE=InnoDB;
ALTER TABLE     t_foro_detail_ms    ENGINE=InnoDB;
ALTER TABLE     t_ljk_ms            ENGINE=InnoDB;

Затем скопируйте и вставьте около 5 строк одновременно в mysql.Это преобразует около 5 сразу.Я заметил, что если я сделаю больше, чем сразу, то команды потерпят неудачу.

2 голосов
/ 12 августа 2014

Некоторые исправления в этом скрипте утилит

SET @DATABASE_NAME = 'Integradb';

SELECT  CONCAT('ALTER TABLE ', table_schema, '.', table_name, ' ENGINE=InnoDB;') AS sql_statements
FROM    information_schema.tables AS tb
WHERE   table_schema = @DATABASE_NAME
AND     `ENGINE` = 'MyISAM'
AND     `TABLE_TYPE` = 'BASE TABLE'
ORDER BY table_name DESC;
2 голосов
/ 21 декабря 2013

Попробуйте этот скрипт оболочки

DBENGINE='InnoDB' ;
DBUSER='your_db_user' ;
DBNAME='your_db_name' ;
DBHOST='your_db_host'
DBPASS='your_db_pass' ;
mysqldump --add-drop-table -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME > mtest.sql; mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "SHOW TABLES;" | while read TABLE ; do mysql -h$DBHOST -u$DBUSER -p$DBPASS $DBNAME -Nse "ALTER TABLE $TABLE ENGINE=$DBENGINE;" ; done
2 голосов
/ 04 октября 2010

Вы можете написать сценарий, чтобы сделать это на вашем любимом языке сценариев.Сценарий будет выполнять следующее:

  1. Issue SHOW FULL TABLES.
  2. Для каждой возвращенной строки убедитесь, что во втором столбце указано 'BASE TABLE', а не 'VIEW'.
  3. Если это не 'VIEW', введите соответствующую команду ALTER TABLE.
2 голосов
/ 02 июля 2016

В моем случае я выполнял миграцию с экземпляра MySQL с MyISAM по умолчанию на экземпляр MariaDB с DEFAULT InnoDB по умолчанию.

В Документах по миграции MariaDB.

При старом запуске сервера:

mysqldump -u root -p --skip-create-options --all-databases > migration.sql

--skip-create-options гарантирует, что при загрузке данных сервер базы данных использует механизм хранения по умолчанию вместо MyISAM.

mysql -u root -p < migration.sql

Это вызвало ошибку при создании mysql.db, но теперь все прекрасно работает:)

2 голосов
/ 23 апреля 2018

Только что опробовал другой (простой?) Способ и работал для меня.

Просто экспортируйте свою БД в виде файла .sql, отредактируйте ее с помощью gedit или блокнота;

Замените ENGINE=MyISAMс помощью ENGINE=INNODB и сохраните отредактированный файл

Число или сделанная замена должны соответствовать числу ваших таблиц

Импортируйте его в MySQL (phpMyAdmin или командную строку)

И вуаля!

...