我正在开发一个脚本,它将成为一个cronjob,它将查看数据库中的表并修复任何需要它的表。它们是mysql数据库中的myisam表。我的问题是,有没有理由在命令行vs myisamchk
查询语法上使用REPAIR TABLE
语法?
在myisam文档页面上, http://dev.mysql.com/doc/refman/5.0/en/myisamchk.html, 他们提供这种方法来修复所有需要它的表
myisamchk --silent --force --fast --update-state \
--key_buffer_size=64M --sort_buffer_size=64M \
--read_buffer_size=1M --write_buffer_size=1M \
/path/to/datadir/*/*.MYI
会产生与使用
不同的结果 REPAIR TABLE tablename
在我的所有桌子上?我会用PHP以编程方式进行,最后得到像(伪代码)
这样的东西$tables=query("SELECT table from information_schema.tables where table_schema='myDBName'");
foreach($tables as $table)
{
$result=query("REPAIR TABLE ".$table);
}
尽管对这种做法的实用性有任何意见,但实际的最终结果是否会有所不同?谢谢。
如果需要,我可以提供工作(非伪)PHP代码,但我认为没有必要。我使用伪代码的原因是,在工作中我们使用自己的包装器进行数据库访问。
答案 0 :(得分:2)
您不必经常修复表格,因此需要自动化。你根本不应该使用MyISAM。但如果你坚持,答案主要来自你链接到的页面:
注意
最好在执行表修复操作之前备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。
...当然,这也可能是问题的原因......这听起来像是另一次投票反对自动化这个过程。
重要
在运行myisamchk时,必须确保没有其他程序正在使用这些表。这样做的最有效方法是在运行myisamchk时关闭MySQL服务器,或锁定myisamchk正在使用的所有表。
因此,虽然修复表的两种方法来自共同的代码基础,但似乎应该使用REPAIR TABLE
,除非服务器处于脱机状态。请注意,此命令也有选项。
http://dev.mysql.com/doc/refman/5.6/en/repair-table.html
ALTER TABLE t1 ENGINE=InnoDB;
ALTER TABLE t1 ENGINE=MyISAM;
这将完全删除前表的所有痕迹,并为您留下一个闪亮的新表。确保首先将innodb_file_per_table
设置为1,否则您将为ibdata1系统命名空间分配磁盘空间,这不能轻易回收。