我正在开发一个脚本,该脚本将是一个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 系统命名空间,该命名空间不容易回收。