如何修复MYISAM表?

如何修复MyISAM表?

译自:http://dev.mysql.com/doc/refman/5.0/en/myisam-repair.html 

你可以使用CHECK TABLE和REPAIR TABLE命令来检查和修复MYISAM表。

表损坏的症状包括查询不可预料的退出和明显的错误,如下:

l tbl_name.frm被锁定导致不能改变

l 无法找到tbl_name.MYI文件

l 未知的文件结束

l 记录文件崩溃

l 从表句柄得到的错误nnn

为获得更多的错误信息,运行perror nnn,在这里nnn是错误码。下面的例子如何使用perror来找到表的最常见错误码所代表的意义:

shell> perror 126 127 132 134 135 136 141 144 145

MySQL error code 126 = Index file is crashed

MySQL error code 127 = Record-file is crashed

MySQL error code 132 = Old database file

MySQL error code 134 = Record was already deleted (or record file crashed)

MySQL error code 135 = No more room in record file

MySQL error code 136 = No more room in index file

MySQL error code 141 = Duplicate unique key or constraint on write or update

MySQL error code 144 = Table is crashed and last repair failed

MySQL error code 145 = Table was marked as crashed and should be repaired

注意:135错误(记录文件没有空间)和错误136(索引文件没有空间)是不能被简易修复而修复的错误。这样的话你必须使用ALERT TABLE来增加MAX_ROWSAVG_ROW_LENGTH选项:

ALTER TABLE tbl_name MAX_ROWS=xxx AVG_ROW_LENGTH=yyy;

如果你不知道当前表的选项值,使用SHOW CREATE TABLE

对于其他的错误,你必须修复你的表。Myisamchk可以检测和修复遇到的大多数问题。

修复过程涉及四个步骤,在这里做一下说明。在开始修复之前,你必须将当前目录改变到数据库目录并检查表文件的权限。在UNIX系统中,运行mysqld的用户要确定这些文件可读。如果你需要修改这些文件,你要确定他们是否可写。

这一节是介绍了当你检查表失败或者要使用myisamchk提供的扩展特征的情况下的方法。

myisamchk可设置为提高性能而控制内存分配的变量。

如果你要通过命令行来修复表,首先,你必须停止mysqld服务。注意当你在远程服务器上使用mysqladmin shutdown的时候,mysqld服务在mysqladmin返回之后的一小段时间内任仍然可用,直到所有的命令处理已经停止并且所有索引已被写到磁盘上。

第一步:检查表

运行myisamchk *.MYI,如果你有更多的时间你还可以运行myisam -e *.MYI。使用-s(slient)选项来压缩不必要的信息。

如果mysqld服务被停止,你可以使用--update-state选项来告诉myisamchk来标记表被检查过。

myisamchk声明你需要修复的表为同一个错误。对于这些表,处理转向第二步。

在检查过程中,如果你获得未知的错误(如内存不足的错误)或者myisamchk崩溃,转向第三步。

第二步:简易修复表

首先,尝试myisamchk -r -q tbl_name(-r -q代表快速恢复模式)。这是修复索引文件而不接触数据文件。在数据文件中,它包含了一切在正确目录下的数据文件里面的删除连接点,这应该是正常的,数据表会被修复。开始修复下一个数据表。否则使用下面的步骤:

1.确保在继续修复之前备份数据文件。

2.使用myisamchk -r tbl_name(-r代表恢复模式)。这将删除错误的行、从数据文件中删除这些错误的行以及重构索引文件。

3.如果上一步失败,使用myisamchk --safe-recover tbl_name。安全恢复模式使用旧的恢复模式来处理一些常规模式不能处理的情况。

注意:如果你要恢复操作运行更快,在运行myisamchk的时候,你应该设置sort_buffer_size的值以及key_buffer_size变量的值,每个值都应是你可用内存的25%左右。

在检查过程中,如果你获得未知的错误(如内存不足的错误)或者myisamchk崩溃,转向第三步。

第三步:困难修复

仅仅在索引文件的开始的16KB大小的块被破坏或者包含错误信息或者索引文件丢失的时候,你应该进行第三步。这种情况下,必须创建新的索引文件。按照下面说的做:

1.将数据文件移动到安全的地方。

2.使用表说明文件来创建新的数据和索引文件。

  shell> mysql db_name

  mysql> SET autocommit=1;

  mysql> TRUNCATE TABLE tbl_name;

  mysql> quit

3.将旧的数据文件复制到新建的数据文件里(不要仅仅将旧的文件放回新文件里,你要继续保留一份拷贝,以免发生错误)。

  重要提示:如果你正在使用复制,你应该停止执行之前的步骤,因为它涉及到文件系统,而MySQL不会记录这些。

返回第二步,myisamchk -r -q应该工作正常(这样的话这就是最后一步)。

你可以使用REPAIR TABLE tbl_name USE_FRM SQL命令,这个命令自动的执行整个步骤。在应用和服务之间不可能没有的无用的交互,因为当你使用REPAIR TABLE的时候服务器不会做所有的工作。

第四步:更困难修复

仅仅在.frm描述文件也有冲突的时候你才会进行这一步。这应该从来都不会发生因为描述文件在表创建之后不会改变。

1.用一个备份文件重存描述文件并返回第三步。你可以重存索引文件并返回第二步。在后一种情况下,你应该启动myisamchk -r。

2.如果你没有备份但是清楚的知道怎么创建表,你可以创建在另一个数据库中创建这个表的拷贝。移除新的数据文件,再把.frm描述文件和.MYI索引文件从另一个数据库移动到你崩溃的数据库里。这会给你新的描述和索引文件,而仅仅剩下.MYD数据文件。返回第二步并尝试重构索引文件。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值