使用`Repair Table` vs myisamchk修复mysql myisam表

时间:2013-10-23 21:20:03

标签: php mysql myisam repair

我正在开发一个脚本,它将成为一个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代码,但我认为没有必要。我使用伪代码的原因是,在工作中我们使用自己的包装器进行数据库访问。

1 个答案:

答案 0 :(得分:2)

您不必经常修复表格,因此需要自动化。你根本不应该使用MyISAM。但如果你坚持,答案主要来自你链接到的页面:

  

注意

     

最好在执行表修复操作之前备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。

...当然,这也可能是问题的原因......这听起来像是另一次投票反对自动化这个过程。

  

重要

     

在运行myisamchk时,必须确保没有其他程序正在使用这些表。这样做的最有效方法是在运行myisamchk时关闭MySQL服务器,或锁定myisamchk正在使用的所有表。

因此,虽然修复表的两种方法来自共同的代码基础,但似乎应该使用REPAIR TABLE,除非服务器处于脱机状态。请注意,此命令也有选项。

http://dev.mysql.com/doc/refman/5.6/en/repair-table.html


更新:我几乎不想添加这个,因为它完全是轶事,但我一直怀疑修复MyISAM表可能并不总是找到一个可能出错的表,导致你认为它已经修复,因为它可以再次使用。对我来说,任何不能使用全面扩展修复的东西,似乎都冒了风险,如果你遇到问题,我最倾向于强制完全重建整个桌子。表:

ALTER TABLE t1 ENGINE=InnoDB;
ALTER TABLE t1 ENGINE=MyISAM;

这将完全删除前表的所有痕迹,并为您留下一个闪亮的新表。确保首先将innodb_file_per_table设置为1,否则您将为ibdata1系统命名空间分配磁盘空间,这不能轻易回收。