如何对数据库中的每个表运行以下命令:
ALTER table [table_name] type=innodb;
我不想手动为每个表运行它,而是想为数据库中的所有表运行它。顺便说一句:如果您好奇我为什么要运行它:http://bugs.mysql.com/bug.php?id=1341 &http://bugs.mysql.com/bug.php?id=1287
答案1
假设您已在 my.cnf 上设置了您的凭据和连接信息,那么像这样的命令可能会执行您想要的操作。
mysql --batch --skip-column-names --execute \
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;")
from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql
将 database_name 替换为您的数据库名称。
至于你的主要问题。听起来你想在让 innodb 表变大后回收空间。就像 bug 所说的那样,处理这个问题的唯一安全方法是使用 mysqldump 导出所有内容。删除文件然后恢复。
正如该文章所述。您可以启用innodb_file_per_table
服务器的 my.cnf 选项,使每个文件作为单独的文件存在。这样,可以通过删除/恢复问题表而不是所有内容来回收空间。
答案2
关于 Zoredache 的回答(这对我非常有用,谢谢):--跳过列名称应用于删除标题。
mysql --batch --skip-column-names -e \
'select concat("alter table ",TABLE_SCHEMA,".",TABLE_NAME," type=innodb;")
from information_schema.TABLES where TABLE_SCHEMA="database_name"' | mysql
答案3
我不知道您使用哪种语言,但您可能只需运行:
show table status from `DATABASE`;
然后循环遍历结果集,为每个结果集生成一个查询。