繁体   English   中英

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

[英]Repairing mysql myisam table using `Repair Table` vs myisamchk

我正在编写一个脚本,它将是一个cronjob,它将查看数据库中的表并修复任何需要它的表。 它们是mysql数据库中的myisam表。 我的问题是,有没有理由在命令行和REPAIR TABLE查询语法中使用myisamchk语法?

在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正在使用的所有表。

因此,虽然修复表的两种方法来自共同的代码基础,但似乎应该使用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系统命名空间分配磁盘空间,这不能轻易回收。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM