我试图将所有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;
如何实现这一目标?选择子查询?我的目的是避免处理已经转换为innodb的因为如果我按照以下方式制作脚本需要花费更多的时间:
for db in `echo "show databases"| mysql`;
do
echo $db
echo 'SHOW TABLES;' \
| mysql -D $db \
| awk '!/^Tables_in_/ {print "ALTER TABLE `"$0"` ENGINE = InnoDB;"}' \
| column -t \
| mysql -D $db
echo 'finish';
done;
答案 0 :(得分:1)
您可以直接在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