【问题标题】:Repairing mysql myisam table using `Repair Table` vs myisamchk使用“修复表”与 myisamchk 修复 mysql myisam 表
【发布时间】:2013-10-23 21:20:02
【问题描述】:

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

【问题讨论】:

    标签: php mysql myisam repair


    【解决方案1】:

    您不必为了需要自动化而频繁地修复表格。您可能根本不应该使用 MyISAM。但如果你坚持,答案大多来自你链接到的页面:

    注意

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

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

    重要

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

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

    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 系统命名空间。

    【讨论】:

    • 那么你是说唯一的区别是我应该只在服务器离线时使用 myisamchk 吗?
    • 这是主要区别,尽管 myisamchk 有更多选择。您可能还会发现源代码信息量很大。或者,您可以将表文件复制到别处,修复它,然后将修复后的版本复制回来,使用 myisamchk...确保在将文件复制入或复制出时使用FLUSH TABLES WITH READ LOCK 刷新并锁定表。
    • 谢谢。除其他原因外,我想使用 sql 语法来执行此操作,这样我就可以在连接到我的数据库服务器而不是服务器本身的另一台服务器上运行代码。我正在使用检查表记录状态,然后根据需要进行修复。
    猜你喜欢
    • 2011-06-28
    • 2017-11-05
    • 1970-01-01
    • 1970-01-01
    • 2010-11-23
    • 1970-01-01
    • 1970-01-01
    • 2014-07-01
    • 2019-01-13
    相关资源
    最近更新 更多