`
Taoo
  • 浏览: 291454 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

mysql 数据表修复

 
阅读更多
由于断电原因,
mysql数据表损坏,
运气比较好,损坏的并不严重,
通过简单修复 (myisamchk -r -q)就解决啦。

主要参照链接:
http://www.chinahtml.com/0610/mysql-11619183797660.html



教你用Myisamchk进行崩溃恢复MySQL
发表时间:2006-10-27内容来源:网页教学网作者:佚名

由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:

mysqld进程在一个写入当中被杀死;计算机的意外关闭(例如,如果计算机掉电);一个硬件错误。

这章描述如何检查和处理在MySQL数据库中的数据损坏。如果你的表损坏很多,你应该尝试找出其原因!见G.1 调试一个MySQL服务器。

在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的:

文件 用途

“tbl_name.frm” 表定义(表格)文件
“tbl_name.MYD” 数据文件
“tbl_name.MYI” 索引文件

这3个文件的每一个文件类型可能遭受不同形式的损坏,但是问题最常发生在数据文件和索引文件。

myisamchk通过一行一行地创建一个“.MYD”(数据 )文件的副本来工作,它通过由删除老的“.MYD 文件并且重命名新文件到原来的文件名结束修复阶段。如果你使用--quick,myisamchk不创建一个临时“.MYD”文件,只是假定“.MYD”文件是正确的并且仅创建一个新的索引文件,不接触“.MYD”文件,这是安全的,因为myisamchk自动检测“.MYD”文件是否损坏并且在这种情况下,放弃修复。你也可以给myisamchk两个--quick选项。在这种情况下,myisamchk不会在一些错误上(象重复键)放弃,相反试图通过修改“.MYD”文件解决它们。通常,只有在你在太少的空闲磁盘空间上实施一个正常修复,使用两个--quick选项才有用。在这种情况下,你应该至少在运行myisamchk前做一个备份。

一、怎样检查表的错误

为了检查一张表,使用下列命令:

myisamchk tbl_name

这能找出所有错误的99.99%。它不能找出的是仅仅涉及数据文件的损坏(这很不常见)。如果你想要检查一张表,你通常应该没有选项地运行myisamchk或用-s或--silent选项的任何一个。

myisamchk -e tbl_name

它做一个完全彻底的数据检查(-e意思是“扩展检查”)。它对每一行做每个键的读检查以证实他们确实指向正确的行。这在一个有很多键的大表上可能花很长时间。myisamchk通常将在它发现第一个错误以后停止。如果你想要获得更多的信息,你能增加--verbose(-v)选项。这使得myisamchk继续一直到最多20个错误。在一般使用中,一个简单的myisamchk(没有除表名以外的参数)就足够了。

myisamchk -e -i tbl_name

象前面的命令一样,但是-i选项告诉myisamchk还打印出一些统计信息。

二、怎样修复表

一张损坏的表的症状通常是查询意外中断并且你能看到例如这些错误:

“tbl_name.frm”被锁定不能改变。

不能找到文件“tbl_name.MYI”(Errcode :### )。

从表处理器的得到错误###(此时,错误135是一个例外)。

意外的文件结束。

记录文件被毁坏。

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

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

阶段1:检查你的表

运行

myisamchk *.MYI

或(myisamchk -e *.MYI,如果你有更多的时间)。使用-s(沉默)选项禁止不必要的信息。

你必须只修复那些myisamchk报告有一个错误的表。对这样的表,继续到阶段2。

如果在检查时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,到阶段3。

阶段2 :简单安全的修复

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

在继续前做数据文件的一个备份。

使用myisamchk -r tbl_name(-r意味着“恢复模式”)。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。

如果前面的步骤失败,使用myisamchk --safe-recover tbl_name。安全恢复模式使用一个老的恢复方法,处理常规恢复模式不行的少数情况(但是更慢)。

如果在修复时,你得到奇怪的错误(例如out of memory错误),或如果myisamchk崩溃,到阶段3。

阶段3 :困难的修理

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

把数据文件移更安全的地方。

使用表描述文件创建新的(空)数据和索引文件:

shell> mysql db_name
mysql> DELETE FROM tbl_name;
mysql> quit

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

回到阶段2。现在myisamchk -r -q应该工作了。(这不应该是一个无限循环)。

阶段4:非常困难的修复

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

从一个备份恢复描述文件并且回到阶段3。你也可以恢复索引文件并且回到阶段2。对后者,你应该用myisamchk -r启动。

如果你没有一个备份但是确切地知道表是怎样被创建的,在另一个数据库中创建表的一个拷贝。删除新的数据文件,然后从其他数据库将描述和索引文件移到破坏的数据库中。这给了你新的描述和索引文件,但是让数据文件独自留下来了。回到阶段2并且尝试重建索引文件。

三、表优化

为了组合成碎片的记录并且消除由于删除或更新记录而浪费的空间, 以恢复模式运行myisamchk:

shell> myisamchk -r tbl_name

你可以用SQL的OPTIMIZE TABLE语句使用的相同方式来优化一张表,OPTIMIZE TABLE比较容易,但是myisamchk更快。也没有在一个实用程序和服务器之间不必要的交互可能性,因为当你使用OPTIMIZE TABLE时,服务器做所有的工作。

myisamchk也有你可用来改进一个表的性能的很多其他选项:

-S, --sort-index  
-R index_num, --sort-records=index_num  
-a, --analyze

  对于选项完整的描述见myisamchk调用语法。


分享到:
评论

相关推荐

    MySQL数据库INNODB 表损坏修复处理过程

    MySQL报警,从库的数据库挂了,一直在不停的重启,打开错误日志,发现有张表坏了。innodb表损坏不能通过repair table 等修复myisam的命令操作。

    MYSQL数据库修复程序

    MySQL数据库修复程序,表查看,读取,表设计。SQL数据库内容读取。

    MySQL数据库表修复 MyISAM

    一:MySQL中MyISAM表损坏原因总结: 1、 服务器突然断电导致数据文件损坏;强制关机,没有先关闭mysql 服务;mysqld 进程在写表时被杀掉。 2、 磁盘损坏。 3、 服务器死机。 4、 mysql 本身的bug 。 二:MySQL中MyISAM...

    MYSQL数据库修复大师7.12

    软件简介: MYSQL数据库修复大师是一款功能强大的mysql数据修复工具 恢复被破坏的MySQL数据库(.myd, .myi),并且将找回的数据直接导入MySQL服务器中 支持目前最新mysql版本

    mysql 8 用户初始表(user)

    mysql8 用户初始表(user),可以用于账密码忘记,用户表被篡改等情况恢复用户信息(密码是:root)

    phpmyadmin显示MySQL数据表“使用中” 修复后依然无效的解决方法

    勾选之后进行“修复表”,出现错误提示不能被修复。 于是接着从“分析表”、“优化表”开始,均告失败。失败信息第一条:can’t create new temp file google解决方案:强制修复 myisamchk -r -f ****.MYI,问题依旧...

    MYSQL数据库表的修复教程

    MYSQL数据库表的修复教程。遇到这种原因一般是数据库服务器强行重启等导致,或者是因为mysql参数设置不正确导致。如果用备份恢复的话可能就要丢失好多的数据。所以要先找清原因然后进行修复

    mysql.sql只有数据表结构.zip

    mysql5.7数据库数据表,用于初始化和拯救数据,配合https://blog.csdn.net/u012442504/article/details/102513780,进行使用,效果绝佳,立竿见影,这个只有数据表结构,用于快速拯救数据库,修复官方的innodb_table...

    MYSQL数据库修复工具

    MYSQL数据库修复大师是一款功能强大的mysql数据修复工具 恢复被破坏的MySQL数据库(.myd, .myi),并且将找回的数据直接导入MySQL服务器中 支持目前最新mysql版本

    mysql修复数据表的命令方法

    MySQL之终端Terminal(dos界面)管理数据库、数据表、数据的基本操作MySQL中一些常用的数据表操作语句笔记MySQL中复制数据表中的数据到新表中的操作教程mysql 数据表中查找重复记录mysql 导入导出数据库、数据表的...

    MySQL数据库中部分数据损坏恢复过程

    本文将为大家介绍MySQL数据库中部分数据损坏恢复过程。

    Mysql8.0 数据库恢复工具

    本软件适合于操作系统崩溃后将mysql数据目录拷贝出进行恢复,在恢复前需要使用之前备份的数据库结构新建空库,然后将还原文件的数据恢复到新库,目前只能恢复InnoDB引擎、MyISAM引擎 表。

    MySQL数据表损坏的正确修复方案

    修复以损坏的MySQL数据表的实际操作在实际中是我们经常用到的,以下的文章主要是介绍正确修复以损坏的MySQL数据表的实际操作步骤,以下就是正文的介绍,希望会给你带来一些帮助在此方面。

    修复Mysql数据库错误

    进入论坛数据库,然后选择要修复的表(您损坏的是cdb_sessions 会员认证数据表),在页脚下拉框选择“修复”即可 如果您的服务器是独立主机强烈建议使用命令行方式进行修复: 修复前将mysql服务停止。 如果是Win主机,...

    mysql数据库备份和恢复工具

    mysql数据库备份和恢复工具以及源码 。

    MYSQL数据表损坏的原因分析和修复方法小结(推荐)

    1.表损坏的原因分析 以下原因是导致mysql 表毁坏的常见原因: 1、 服务器突然断电导致数据文件损坏。 2、 强制关机,没有先关闭mysql 服务。 3、 mysqld 进程在写表时被杀掉。 4、 使用myisamchk 的同时,mysqld 也...

    mysql.sql只有数据表结构的.zip

    mysql5.7数据库数据表,用于初始化和拯救数据,配合https://blog.csdn.net/u012442504/article/details/102513780,进行使用,效果绝佳,立竿见影,这个只有数据表结构,用于快速拯救数据库,修复官方的innodb_table...

Global site tag (gtag.js) - Google Analytics