Mysql数据表修复

Standard

一到公司就收到老板发来的邮件,说网站数据库坏了有张表找不着了-_- 参考以下文章修复:

一张损坏的表的症状通常是查询意外中断并且你能看到例如这些错误:
* “tbl_name.frm”被锁定不能改变。
* 不能找到文件“tbl_name.MYI”(Errcode :### )。
* 从表处理器的得到错误###(此时,错误135是一个例外)。
* 意外的文件结束。
* 记录文件被毁坏。

在这些情况下,你必须修复表。myisamchk通常能检测并且修复出错的大部分东西。

修复过程包含最多4个阶段,在下面描述。在你开始前,你应该cd到数据库目录和检查表文件的权限,确保他们可被运行mysqld的Unix用户读取(和你,因为你需要存取你正在检查的文件)。如果它拒绝你修改文件,他们也必须是可被你写入的。

检查你的表
运行myisamchk *.MYI或(myisamchk -e *.MYI,如果你有更多的时间)。使用-s(沉默)选项禁止不必要的信息。
你必须只修复那些myisamchk报告有一个错误的表。对这样的表,继续到简单安全的修复
如果在检查时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,试试困难的修理

简单安全的修复
首先,试试myisamchk -r -q tbl_name(-r -q意味着“快速恢复模式”)。这将试图不接触数据文件来修复索引文件。如果数据文件包含它应有的一切和在数据文件指向正确地点的删除连接,这应该管用并且表可被修复。开始修理下一张表。否则,使用下列过程:

1. 在继续前做数据文件的一个备份。
2. 使用myisamchk -r tbl_name(-r意味着“恢复模式”)。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。
3. 如果前面的步骤失败,使用myisamchk –safe-recover tbl_name。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况(但是更慢)。

如果在修复时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,试试困难的修理

困难的修理

如果在索引文件的第一个16K块被破坏,或包含不正确的信息,或如果索引文件丢失,你只应该到这个阶段 。在这种情况下,创建一个新的索引文件是必要的。按如下这样做:

1. 把数据文件移更安全的地方。
2. 使用表描述文件创建新的(空)数据和索引文件:
shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit

3. 将老的数据文件拷贝到新创建的数据文件之中。(不要只是将老文件移回新文件之中;你要保留一个副本以防某些东西出错。)

回到简单安全的修复。现在myisamchk -r -q应该工作了。(这不应该是一个无限循环)。

非常困难的修复

只有描述文件也破坏了,你才应该到达这个阶段。这应该从未发生过,因为在表被创建以后,描述文件就不再改变了。

1. 从一个备份恢复描述文件并且回到困难的修理。你也可以恢复索引文件并且回到简单安全的修复。对后者,你应该用myisamchk -r启动。
2. 如果你没有一个备份但是确切地知道表是怎样被创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述和索引文件移到破坏的数据库中。这给了你新的描述和索引文件,但是让数据文件独自留下来了。回到简单安全的修复并且尝试重建索引文件。

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.