本节的讨论描述如何使用myisamchk在MyISAM
表(扩展.MYI
而且.MYD
).
你也可以使用检查表
而且修理表
对帐单进行检查和修理MyISAM
表。看到第13.7.3.2节,“CHECK TABLE语句”,第13.7.3.5节,“REPAIR TABLE语句”.
表损坏的症状包括意外中止的查询和可观察到的错误,例如:
找不到文件
(Errcode:tbl_name
.MYInnn
)未预期的文件结束
记录文件崩溃
有错误
nnn
从表处理程序
要获取有关错误的更多信息,请运行perrornnn
,在那里nnn
是错误号。下面的示例演示如何使用perror找出表中显示问题的最常见错误编号的含义:
壳> perror 126 127 132 134 135 136 141 144 145 MySQL错误代码126 =索引文件是坠毁MySQL错误代码127 =记录文件是坠毁MySQL错误代码132 =老MySQL数据库文件错误代码134 =记录已经删除(或记录文件坠毁)MySQL错误代码135 =没有更多的空间在记录文件MySQL错误代码136 =没有更多的空间索引文件MySQL错误代码141 =复制唯一键或限制编写或更新MySQL错误代码144 =表最后修复失败坠毁MySQL错误码145 =表被标记为崩溃,应该修复
注意,错误135(记录文件中没有更多的空间)和错误136(索引文件中没有更多的空间)都不是可以通过简单修复修复的错误。在这种情况下,您必须使用ALTER TABLE
增加MAX_ROWS
而且AVG_ROW_LENGTH
表选项值:
ALTER TABLEtbl_nameMAX_ROWS =xxxAVG_ROW_LENGTH =多;
如果不知道当前表选项值,请使用显示创建表
.
对于其他错误,必须修复表。myisamchk通常可以检测和修复发生的大多数问题。
修复过程包括三个阶段,在这里描述。在开始之前,应该将位置更改为数据库目录,并检查表文件的权限。在Unix上,确保用户可读mysqld作为(和您,因为您需要访问您正在检查的文件)运行。如果您需要修改文件,那么它们也必须是可写的。
此部分用于表检查失败的情况(如第7.6.2节,“如何检查MyISAM表的错误”),或者您想使用扩展功能myisamchk提供了。
的myisamchk用于表维护的选项在章节4.6.4,“myisamchk - MyISAM表维护工具”.myisamchk还有一些变量,您可以设置它们来控制可能提高性能的内存分配。看到第4.6.4.6节,“myisamchk内存使用情况”.
如果要从命令行修复表,必须首先停止mysqld服务器。当你这样做的时候请注意mysqladmin关闭在远程服务器上,mysqld之后服务器仍可用一段时间mysqladmin返回,直到所有语句处理停止并将所有索引更改刷新到磁盘。
第1阶段:检查您的表
运行myisamchk *。MYI或myisamchk - e *。MYI如果你有更多的时间。使用- s
(静音)选项,抑制不必要的信息。
如果mysqld服务器已停止,您应该使用——update-state
选项告诉myisamchk把表标为”检查。”
你只需要修理那些表myisamchk宣布一个错误。对于这样的表,请进入第2阶段。
如果在检查(例如内存不足
错误),或者如果myisamchk崩溃,转到第3阶段。
第二阶段:容易安全维修
首先,尝试myisamchk - r - qtbl_name
(- r - q
意味着”快速恢复模式”).这将尝试修复索引文件而不触及数据文件。如果数据文件包含了它应该包含的所有内容,并且删除链接指向数据文件中的正确位置,那么这应该可以工作,并且表是固定的。开始修理下一张桌子。否则,请执行以下步骤:
在继续之前,对数据文件进行备份。
使用myisamchk - r
tbl_name
(- r
意味着”恢复模式”).这将从数据文件中删除不正确的行和已删除的行,并重构索引文件。如果上述步骤失败,请使用myisamchk——safe-recover
tbl_name
.安全恢复模式使用一种旧的恢复方法,可以处理常规恢复模式无法处理(但速度较慢)的一些情况。
的值,如果您希望修复操作更快地进行,则应该设置sort_buffer_size
而且key_buffer_size
每个变量在运行时占用可用内存的25%左右myisamchk.
如果在修复时出现意外错误(例如内存不足
错误),或者如果myisamchk崩溃,转到第3阶段。
第三阶段:修复困难
只有当索引文件中的第一个16KB块被销毁或包含不正确的信息,或者索引文件丢失时,才应该达到这个阶段。在这种情况下,有必要创建一个新的索引文件。请按以下方法进行:
将数据文件移到安全的地方。
使用表描述文件创建新的(空)数据和索引文件:
壳> mysqldb_name
mysql >设置自动提交= 1;mysql >截断表tbl_name;mysql >退出
将旧的数据文件复制回新创建的数据文件。(不要只是将旧文件移回到新文件中。你需要保留一份副本,以防出现问题。)
如果您正在使用复制,您应该在执行上述过程之前停止它,因为它涉及到文件系统操作,而这些操作不会被MySQL记录。
回到第二阶段。myisamchk - r - q应该工作。(这不应该是一个无休止的循环。)
你也可以使用修理表
SQL语句,自动执行整个过程。实用程序和服务器之间也不可能发生不必要的交互,因为当您使用时,服务器会完成所有的工作tbl_name
USE_FRM修理表
.看到第13.7.3.5节,“REPAIR TABLE语句”.