我如何为数据库中的每个表运行以下内容:
ALTER table [table_name] type=innodb;
我不想为每个表手动运行它,而是运行它为数据库中的所有表。 顺便说一句:如果你好奇,为什么我运行这个: http : //bugs.mysql.com/bug.php? id = 1341 & http : //bugs.mysql.com/bug.php? id=1287
假设你的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
当然,用您的数据库名称replacedatabase_name。
至于你的主要问题。 这听起来好像你想让你的innodb表变大后回收空间。 就像bug说的那样,处理这个问题的唯一方法就是使用mysqldump来导出所有内容。 删除文件,然后恢复。
正如该文章所指出的。 你可以启用innodb_file_per_table
选项,你的服务器的my.cnf会使每个文件作为一个单独的文件存在。 这样回收空间可以通过删除/恢复问题表而不是一切。
关于Zoredache的答案(这对我来说非常有用,谢谢):– skip-column-names应该用来删除标题。
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
我不知道你正在使用哪种语言,但你可以运行:
show table status from `DATABASE`;
然后遍历结果集,为每个查询生成一个查询。