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

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

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

Ответы [ 26 ]

519 голосов
/ 29 февраля 2012

Запустите этот оператор SQL (в клиенте MySQL, phpMyAdmin или где-либо еще), чтобы получить все таблицы MyISAM в вашей базе данных.

Замените значение переменной name_of_your_db на имя вашей базы данных.

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', 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;

Затем скопируйте вывод и запустите новый SQL-запрос.

151 голосов
/ 04 октября 2010

PHP-код

    // Actual code starts here 

    $sql = "SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES
        WHERE TABLE_SCHEMA = 'your_database_name' 
        AND ENGINE = 'MyISAM'";

    $rs = mysql_query($sql);

    while($row = mysql_fetch_array($rs))
    {
        $tbl = $row[0];
        $sql = "ALTER TABLE `$tbl` ENGINE=INNODB";
        mysql_query($sql);
    }
?>

Direct в MySQL

Запустите этот оператор SQL (в клиенте MySQL, phpMyAdmin или где угодно), чтобы получить всетаблицы MyISAM в вашей базе данных.

Замените значение переменной name_of_your_db на имя вашей базы данных.

SET @DATABASE_NAME = 'name_of_your_db';

SELECT  CONCAT('ALTER TABLE `', 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;

Затем скопируйте вывод и запустите новый SQL-запрос.

52 голосов
/ 04 июня 2015
SELECT CONCAT('ALTER TABLE ',TABLE_NAME,' ENGINE=InnoDB;') 
FROM INFORMATION_SCHEMA.TABLES
WHERE ENGINE='MyISAM'
AND table_schema = 'mydatabase';

Работает как шарм.

Это даст вам список всех таблиц с запросами на изменение, которые вы можете запустить в пакете

23 голосов
/ 27 августа 2011

В приведенных ниже сценариях замените , и вашими конкретными данными.

Чтобы показать операторы, которые можно скопировать и вставить в сеанс клиента mysql, введите следующее:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \

Чтобы просто выполнить изменение, используйте это:

echo 'SHOW TABLES;' \
 | mysql -u <username> --password=<password> -D <schema> \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -u <username> --password=<password> -D <schema>

КРЕДИТ: Это вариант того, что было изложено в этой статье .

21 голосов
/ 01 апреля 2014

Одна строка:

 mysql -u root -p dbName -e 
 "show table status where Engine='MyISAM';" | awk 
 'NR>1 {print "ALTER TABLE "$1" ENGINE = InnoDB;"}'  | 
  mysql -u root -p dbName
20 голосов
/ 16 марта 2011

Используйте это как SQL-запрос в вашем phpMyAdmin

SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' engine=InnoDB;') 
FROM information_schema.tables 
WHERE engine = 'MyISAM';
17 голосов
/ 04 октября 2010

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

echo "SELECT concat('ALTER TABLE `',TABLE_NAME,'` ENGINE=InnoDB;')
FROM Information_schema.TABLES 
WHERE ENGINE != 'InnoDB' AND TABLE_TYPE='BASE TABLE' 
AND TABLE_SCHEMA='name-of-database'" | mysql > convert.sql

Возможно, вам потребуется указать имя пользователя и пароль, используя: mysql -u username -p В результате получается скрипт sql, который вы можете передатьобратно в mysql:

mysql name-of-database < convert.sql

Замените «имя базы данных» в приведенном выше операторе и командной строке.

10 голосов
/ 16 января 2017

Это очень просто, есть только ДВА шага, просто скопируйте и вставьте:

шаг 1.

  SET @DATABASE_NAME = 'name_of_your_db';
  SELECT  CONCAT('ALTER TABLE `', 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;

(скопировать и вставить все результаты в закладке sql)

шаг 2: (скопируйте весь результат во вкладку sql) и вставьте ниже в строке

НАЧАЛО СДЕЛКИ;

COMMIT;

например. НАЧАЛО СДЕЛКИ;

ALTER TABLE admin_files ENGINE = InnoDB;

COMMIT;

8 голосов
/ 30 апреля 2014

Это еще не было упомянуто, поэтому я напишу это для потомков:

Если вы мигрируете между серверами БД (или у вас есть другая причина, по которой вы сбросили бы и перезагрузили свой dta), выможно просто изменить вывод с mysqldump:

mysqldump --no-data DBNAME | sed 's/ENGINE=MyISAM/ENGINE=InnoDB/' > my_schema.sql;
mysqldump --no-create-info DBNAME > my_data.sql;

Затем загрузить его снова:

mysql DBNAME < my_schema.sql && mysql DBNAME < my_data.sql

(Кроме того, по моему ограниченному опыту, этот процесс может быть намного быстрее, чем изменениетаблицы «живут». Вероятно, это зависит от типа данных и индексов.)

7 голосов
/ 13 марта 2013

Вот способ сделать это для пользователей Django:

from django.core.management.base import BaseCommand
from django.db import connections


class Command(BaseCommand):

    def handle(self, database="default", *args, **options):

        cursor = connections[database].cursor()

        cursor.execute("SHOW TABLE STATUS");

        for row in cursor.fetchall():
            if row[1] != "InnoDB":
                print "Converting %s" % row[0],
                result = cursor.execute("ALTER TABLE %s ENGINE=INNODB" % row[0])
                print result

Добавьте это в свое приложение в папке управления / командах /. Затем вы можете преобразовать все свои таблицы с помощью команды manage.py:

python manage.py convert_to_innodb
...