Простіший спосіб перетворення всіх таблиць з InnoDB в MyISAM


13

Раніше я використовую це:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

Я шукаю більш простий спосіб перетворення всіх таблиць у базу даних, а не записувати кожну назву таблиці по черзі


1
Простіше як? Це виглядає для мене досить просто.
Зоредаче

5
Навчіться використовувати сценарії для досягнення своїх цілей.
Том О'Коннор

Відповіді:


11

Я не знаю жодного способу зробити це в самому mysql, але простий скрипт оболонки зробить цю роботу:

TABLES=$(mysql -pXXXXXXX -uXXXXXXX --skip-column-names -B -D $DB -e 'show tables')
for T in $TABLES
do
    mysql -pXXXXX -uXXXXX -D $DB -e "ALTER TABLE $T ENGINE=MYISAM"
done

1
як відключити перевірку зовнішнього ключа?
realtebo

7

Ви можете використовувати MySQL для його скриптування та виконання:

Це перетворить кожну таблицю InnoDB у базі даних dbnameдо MyISAM

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Це перетворить кожну таблицю InnoDB в MyISAM

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" > ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Якщо ви не хочете, щоб перетворення таблиць було реплікувано у Slaves, просто поставте SET SQL_LOG_BIN=0;як перший рядок. Таким чином, ви можете перевірити перетворення в налаштуваннях Master / Slave, перетворивши спочатку тільки Slave, а потім Master.

Це перетворить кожну таблицю InnoDB в базі даних dbnameдо MyISAM, а не повториться на інші сервери

CONVERT_SCRIPT=Convert_dbname_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE table_schema='dbname' AND engine='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Це перетворить кожну таблицю InnoDB в MyISAM і не повториться на інші сервери

CONVERT_SCRIPT=Convert_InnoDB_to_MyISAM.sql
echo "SET SQL_LOG_BIN=0;" > ${CONVERT_SCRIPT}
mysql -u... -p... -AN -e"SELECT CONCAT('ALTER TABLE ',table_schema,'.',table_name,' ENGINE=MyISAM;') FROM information_schema.tables WHERE engine ='InnoDB';" >> ${CONVERT_SCRIPT}
mysql -u... -p... -A < ${CONVERT_SCRIPT}

Спробувати !!!


Переходячи з MyIsam2InnoDB в реальному світі, ви, мабуть, захочете SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; десь обійти no_zero_date, оскільки mysql 5.7 - Джерело stackoverflow.com/questions/9192027/…
Ентоні Гіббс

Переходячи з MyIsam2InnoDB в реальному світі, ви, мабуть, захочете SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='TRADITIONAL,ALLOW_INVALID_DATES'; десь обійти no_zero_date, оскільки mysql 5.7 - Джерело stackoverflow.com/questions/9192027/…
Ентоні Гіббс

0

Для тих, хто все ще має цю проблему, ви можете дотримуватися цього способу, я знайшов цю відповідь на веб-сайті. Це мені дуже допомагає:

shell> mysql -u username -p -e "SELECT concat('ALTER TABLE ', TABLE_NAME,' ENGINE=MYISAM;') FROM Information_schema.TABLES WHERE TABLE_SCHEMA = 'db_name' AND ENGINE = 'InnoDB' AND TABLE_TYPE = 'BASE TABLE'" | tail -n+2 >> alter.sql

Оновлення usernameта db_nameзначення за допомогою власних значень.

Якщо виконати сценарій, він збереже файл під назвою: alter.sql Відкрийте файл та виконайте вміст у вашому phpmyadminчи mysqlкомандному рядку.

Ура!


-1

Я віддаю перевагу однолінійці для такого типу матеріалів. Це однолінійна версія найбільш прийнятої відповіді.

Це працює, якщо у вас встановлено ім’я користувача та пароль MySQL ~/.my.cnf.

D=your_db; for t in $(mysql $D -B -e 'SHOW TABLES'); do mysql $D -e "ALTER TABLE $t ENGINE=MyISAM"; done
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.