[英]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.