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


13

以前,我使用以下方法:

USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;

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


1
怎么简单?在我看来,这很简单。
Zoredache

5
学习使用脚本来实现您的目标。
汤姆·奥康纳

Answers:


11

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

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}

如果您不希望将表的转换复制到从站,只需将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}

试试看 !!!


从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

更新资料 usernamedb_name用您自己的值和值。

执行完脚本后,它将以以下名称保存文件:alter.sql 打开文件并在您的计算机上执行内容phpmyadminmysql命令行。

干杯!


-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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.