更简单的方法将InnoDB的所有表转换为MyISAM

以前我用这个:

USE dbname; ALTER TABLE tablename ENGINE=MYISAM; 

我正在寻找更简单的方式来转换数据库中的所有表,而不是逐个写每个表名

我不知道有什么办法在MySQL本身做到这一点,但一个简单的shell脚本将完成这项工作:

 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来编写脚本并执行它:

这会将数据库dbname每个InnoDB表转换为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} 

如果你不想把表转换成从机,只需把SET SQL_LOG_BIN=0; 作为第一行。 这样,您就可以在主/从设置中testing转换,只需先转换从机,然后再转换主机。

这会将数据库dbname每个InnoDB表转换为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} 

试一试 !!!

对于那些仍然有这个问题,你可以按照这种方式来做到这一点,我在网站上find了这个答案。 它帮助我很多:

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

用你自己的值更新usernamedb_name值。

Afet执行脚本时,会保存一个文件名为: alter.sql打开文件并在phpmyadminmysql命令行上执行内容。

干杯!

我更喜欢这种types的东西。 这是最被接受的答案的单线版本。

如果您在~/.my.cnf设置了您的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