0

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

4

1 回答 1

2

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

警告

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

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

重要的

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

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

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 系统命名空间,这不容易回收。

于 2013-10-24T03:00:34.410 回答