对数据库中的所有表进行“ALTER table”

对数据库中的所有表进行“ALTER table”

如何对数据库中的每个表运行以下命令:

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`;

然后循环遍历结果集,为每个结果集生成一个查询。

相关内容