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

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

以前,我用的是这个:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

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

答案1

我不知道在 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

答案2

您可以使用 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}

如果您不想将表的转换复制到从服务器,只需将其SET SQL_LOG_BIN=0;作为第一行即可。这样,您就可以在主/从服务器设置中测试转换,方法是先转换从服务器,然后再转换主服务器。

这会将数据库中的每个 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}

试一试 !!!

答案3

对于那些仍然遇到此问题的人,您可以按照以下方法进行操作,我在一个网站上找到了这个答案。它对我有很大帮助:

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 上执行内容。phpmyadminmysql

干杯!

答案4

对于这种事情,我更喜欢单行答案。这是最受接受的答案的单行版本。

如果您已在 中设置 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

相关内容