日期:2013-06-06  浏览次数:20608 次

    理想的情况是,MySQL从初次安装以来一直平稳地运转。但有时确实会由于各种缘由而出现问题,其范围可以从电源断电到硬件毛病到不正常地关闭MySQL服务器(如用kill -9 终止服务器或机器崩溃)。诸如这样的情况大部分都超出您的控制范围,它们会导致数据库表的毁坏,尤其是在对表进行修正且未完全写入时所惹起的。
    本章的重点是检测和处理表的问题,而不论问题是如何惹起的。对于表的检查和修复,MySQL管理员最好的朋友是myisamchk 和isamchk 实用程序。这两个程序有好几个功用,我们丫诘?章讨论了怎样使用它们执行索引键的分布分析和索引的释放与激活。还可以使用它们检查表和修复有问题的表。这使您能在表变坏之前(使表不能使用之前)修正毛病。
    myisamchk 和isamchk 提供的全部选项的清单在附录E 中。有关其他的背景,请参阅MySQL参考指南的“维护MySQL安装”一章。

    表的毛病检测和修正的普通过程如下:
    1) 检查出错的表。如果该表检查通过,则完成任务,否则必须修复它。
    2) 在开始修复之前对表文件进行拷贝,以防万一。
    3) 试着修复表。
    4) 如果修复操作失败,从数据库备份和更新日志中恢复此表。
    上述过程的最后一步假定您曾经执行了数据库备份并允许更新日志无效。如果不是这样的话,系统将有危险。参考第11章查找一下怎样使用mysqlaump 和怎样开启更新日志。您肯定不想不可挽回地丢失一个表,因此,应努力地做备份。
    在使用myisamchk 或isamchk 检查或修复表之前,应该满足一些初步需求:
    建立常规的数据库备份过程并允许更新日志,以防事情越来越糟使表的毁坏不能修复。笔者好像在以前提示过这一点?
    在开始试验之前应先细心肠阅读本章的内容。尤其是不应该在阅读“避免与MySQL服务器交互作用”之前进行操作,由于它将讨论当您试图在一个表上执行检查或修复过程时服务器正在使用这个表所惹起的问题。它还讨论怎样在服务器运转时防止那些问题发生。
    当运转表检查或修复时,您应该被注册在运转mysql的账号下,由于您需求对表文件读写访问。
    

myisamchk 和isamchk 的调用语法

    MySQL的myisamchk 和isamchk 实用程序很类似,多数时候它们可以用同样的方式使用。它们之间的次要区别是它们所使用的表的类型。对于MyISAM 表,使用my i s a m c h k,而对于ISAM 表,则使用i s a m c h k。您可以通过表的索引文件的扩展名来通知表使用哪种存储格式。扩展名“. M Y I”表明是一个MyISAM 表,而“. I S M”表明是ISAM 表。
    为了使用任一个实用程序,应指明您所要检查或修复的表,以及指明要执行的操作类型的选项:
    % myisamchk options tbl_name...
    % isamchk options tbl_name...
    tbl_name 参数可以是表名也可以是该表的索引文件名。如果指定多个表,可以很容易地使用文件名模式来拾取目录中所有相应的文件:
    % myisamchk options *.MYI
    % isamchk options *.ISM
    不会由于通知了错误的程序来检查某个表而使该表毁坏,但是除了发布一条警告音讯外此程序不做任何事情。例如,下面的第一条语句将检查当前目录中的所有MyISAM 表,而第二条语句只显示一条警告音讯:
    % myisamchk *.MYI 正确
    % myisamchk *.ISM 不正确─文件类型错
    不论是myisamchk 还是isamchk 都不对表所在的位置做任何判断,因此,应该或者在包含表文件的目录中运转程序,或者指定表的路径名。这允许您将表文件拷贝到另一个目录中并用该拷贝进行操作。

检查表

    myisamchk 和isamchk 提供了表检查方法,这些方法在彻底检查表的程度方面有差异。通常用标准方法就足够了。如果标准检查报告没有发现错误而您仍然怀疑有毁坏(或许由于查询没有正常地任务),可能要执行更彻底的检查。要想用任意一个实用程序执行标准的表检查,则不用带任何选项直接调用即可:
    % myisamchk tbl_name
    % isamchk tbl_name
    为了执行扩充检查,使用--extend-check 选项。该选项非常慢,但检查极为彻底。对于该表的数据文件中的每个记录,索引文件中的每个索引的相关键都被检查以确保它真正指向正确的记录。myisamchk 还有一个两头选项- - m e d i um - c h e c k,它不如扩展检查彻底,但速度快。
    如果对于--extend-check 检查不报告错误,则可以肯定表是好的。如果您仍然感觉表有问题,那缘由肯定在其他地方。应重新检查任何好像有问题的查询以验证查询是正确书写的。如果您认为问题可能是MySQL服务器的缘由,应考虑整理一份毛病报告或升级到新的版本上。
    如果myisamchk 或isamchk 报告表有错误,使用下节中的说明修复它们。

修复表

    表的修复是一项可怕的任务,如果具体问题非常独特则更难进行。然而,有一些常规的指点思想和过程,可以遵照它们来添加修正表的机会。通常,开始时可以用最快的修复方法,看看能否能修正毛病。如果发现不行的话,可以逐渐升级到更彻底的(但更慢的)修复方法上,直到毛病被修复或您不能继续升级为止(实际上,大多数问题不用更大规模的和更慢的方法就能修正)。如果表不能修复,则从备份中恢复该表。有关使用备份文件和更新日志进行恢复的指点在已第11章中给出。
    1. 执行标准的表修复
    为了修复一个表,执行下列步骤:
    1) 试着用--recover 选项修正表,但也可以用--quick 选项试图只依据索引文件的内容进行恢复。这样将不触及数据文件:
    % myisamchk --recover --quick tbl_name
    % isamchk --recover --quick tbl_name
    2) 如果问题仍存在,再试一下上一步的命令,但忽略--quick 选项,以允许my i s a m c h k或isamchk 前进并修正数据文件:
    % myisamchk --recover tbl_name
    % isamchk --recover tbl_name
    3) 如果还不任务,试一试--safe-recover 修复方法。这种方法比普通的恢复方法要慢,但能够修正-recover 方法不能修正的几个问题:
   &nbs