Назад | Перейти на главную страницу

Более простой способ конвертировать все таблицы из InnoDB в MyISAM

Раньше я использовал это:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

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

Я не знаю, как сделать это в самом 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

Вы можете использовать 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}

Попробуйте !!!

Для тех, у кого все еще есть эта проблема, вы можете сделать это следующим образом, я нашел этот ответ на веб-сайте. Это мне очень помогает:

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 командная строка.

Ура!

Я предпочитаю однострочники для таких вещей. Это однострочная версия наиболее распространенного ответа.

Это работает, если у вас установлены имя пользователя и пароль 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