cew*_*gil 13 mysql innodb myisam
以前,我使用这个:
USE dbname;
ALTER TABLE tablename ENGINE=MYISAM;
Run Code Online (Sandbox Code Playgroud)
我正在寻找更简单的方法来转换数据库中的所有表,而不是一个一个地写每个表名
Ins*_*yte 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
Run Code Online (Sandbox Code Playgroud)
您可以使用 MySQL 编写脚本并执行它:
dbname为 MyISAMCONVERT_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}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
如果您不想将表的转换复制到 Slaves,只需放在SET SQL_LOG_BIN=0;第一行即可。这样,您可以通过先转换从站然后再转换主站来测试主/从设置中的转换。
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}
Run Code Online (Sandbox Code Playgroud)
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}
Run Code Online (Sandbox Code Playgroud)
试一试 !!!