仅针对 MyISAM tables 在 mysql 中更改 table

Alter table in mysql only for MyISAM tables

我正在尝试将所有 mysql MyISAM 表转换为 InnoDB,而不选择已经在 InnoDB 中的表。

我有 6734 行(MyISAM 格式的表)使用此查询:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'MyISAM';

我有 11218 行(InnoDB 格式的表)使用此查询:

SELECT table_name FROM INFORMATION_SCHEMA.TABLES WHERE engine = 'InnoDB';

所以我想连接 MyISAM 中表的每个结果以仅作为子查询传递:

ALTER TABLE table_name ENGINE = InnoDB;

如何实现? select 子查询?我的目的是避免处理已经转换为innodb的,因为如果我制作如下脚本会花费更多时间:

for db in `echo "show databases"| mysql`;
do
echo $db

echo 'SHOW TABLES;' \
 | mysql -D $db \
 | awk '!/^Tables_in_/ {print "ALTER TABLE `"[=15=]"` ENGINE = InnoDB;"}' \
 | column -t \
 | mysql -D $db
echo 'finish';
done;

您可以直接在 SQL 中创建 ALTER 语句。如果您有更多要忽略的 SCHEMAS,您可以将它们添加到 IN 子句中。

SELECT
  CONCAT ('ALTER TABLE `',TABLE_SCHEMA, '`.`' ,TABLE_NAME,'` ENGINE = InnoDB;') as newsql
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'
  AND TABLE_SCHEMA NOT IN ('mysql')
  AND `ENGINE` = 'MYISAM';

与shell一起使用:

echo "SELECT CONCAT ('ALTER TABLE \`',TABLE_SCHEMA, '\`.\`' ,TABLE_NAME,'\` ENGINE = InnoDB;')  FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA NOT IN ('mysql') AND \`ENGINE\` = 'MYISAM';" |mysql --skip-column-names |mysql