使用“修复表”与myisamchk修复mysql myisam表


Repairing mysql myisam table using `Repair Table` vs myisamchk

我正在开发一个脚本,该脚本将是一个cronjob,它将查看数据库中的表并修复任何需要它的表。它们是 mysql 数据库中的 myisam 表。我的问题,是否有任何理由在命令行上使用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代码,但我认为没有必要。我使用伪代码的原因是,在工作中我们使用自己的包装器进行数据库访问。

您不必经常修复表,以至于需要自动化。 你可能根本不应该使用MyISAM。但如果你坚持,答案大多来自你链接到的页面:

谨慎

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

。当然,这也可能是问题的原始原因......在我看来,这听起来像是反对自动化此过程的又一次投票。

重要

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

因此,虽然修复表的两种方法来自一个共同的代码库,但除非服务器离线,否则 eou 似乎应该使用 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 系统命名空间,该命名空间不容易回收。