当前位置: 网站首页 > 技术专题 > 数据库专题 >

MySQL数据库损坏的恢复操作过程总结本篇

时间:2010-03-28 22:33  来源:唯实中国   点 击:
导读』:My SQL数据库数据恢复..
关键字:My SQL数据库数据恢复

此文档是一位高手Hewei的原创实践总结,过程真是精彩,最后修复损坏数据库取得圆满效果,值得收藏的一篇好文章。

  前几天因为mysql数据库部分数据损坏原因,我尝试了下恢复数据,之后整理以下文档,供各位参考,以备各位同事以后如有类似问题,可以少走些弯路,尽快解决问题。

  环境:windows2003

  数据库:mysql

  损坏数据文件名:function_products

  将数据库内容物理文件直接导入到mysqldata下,每只表各3个文件,依次分别为:.frm .MYD .MYI

  首先我第一想到的是去网上搜索,寻找类似的工具,试图通过工具来恢复已损坏的文件,于是我在GOOGLE上查找,找到一款名为MySQLRecovery的工具,安装后我用其进行恢复,只可惜效果太不理想,几十M大的数据文件,恢复之后它提示我竟然只有几十K。

  我又想到了mysql下应有自己本身的修复程序等,于是想通过其来进行恢复,在网上查找了资料,提示:由于临时断电,使用kill -9中止MySQL服务进程,或者是mysql正在高速运转时进行强制备份操作时等,所有的这些都可能会毁坏MySQL的数据文件。如果在被干扰时,服务正在改变文件,文件可能会留下错误的或不一致的状态。因为这样的毁坏有时是不容易被发现的,当你发现这个错误时可能是很久以后的事了。

  于是,当你发现这个问题时,也许所有的备份都有同样的错误。

  我想我现在碰到的问题可能是这个问题,因为备份的数据也是有部分损坏的数据,所以导致不能完全运行,意识到myisamchk程序对用来检查和修改的MySQL数据文件的访问应该是唯一的。如果MySQL服务正在使用某一文件,并对myisamchk正在检查的文件进行修改,myisamchk会误以为发生了错误,并会试图进行修复–这将导致MySQL服务的崩溃!这样,要避免这种情况的发生,通常我们需要在工作时关闭MySQL服务。作为选择,你也可以暂时关闭服务以制作一个文件的拷贝,然后在这个拷贝上工作。当你做完了以后,重新关闭服务并使用新的文件取代原来的文件(也许你还需要使用期间的变更日志)。
  MySQL数据目录不是太难理解的。每一个数据库对应一个子目录,每个子目录中包含了对应于这个数据库中的数据表的文件。每一个数据表对应三个文件,它们和表名相同,但是具有不同的扩展名。tblName.frm文件是表的定义,它保存了表中包含的数据列的内容和类型。tblName.MYD文件包含了表中的数据。tblName.MYI文件包含了表的索引(例如,它可能包含lookup表以帮助提高对表的主键列的查询)。

  要检查一个表的错误,只需要运行myisamchk(在MySQL的bin目录下)并提供文件的位置和表名,或者是表的索引文件名:

  % myisamchk /usr/local/mysql/var/dbName/tblName

  % myisamchk /usr/local/mysql/var/dbName/tblName.MYI

  上面的两个命令都可以执行对指定表的检查。要检查数据库中所有的表,可以使用通配符:

  % myisamchk /usr/local/mysql/var/dbName/*.MYI

  要检查所有数据库中的所有表,可以使用两个通配符:

  % myisamchk /usr/local/mysql/var/*/*.MYI

  如果不带任何选项,myisamchk将对表文件执行普通的检查。如果你对一个表有怀疑,但是普通的检查不能发现任何错误,你可以执行更彻底的检查(但是也更慢!),这需要使用–extend-check选项:

  % myisamchk –extend-check /path/to/tblName

  对错误的检查是没有破坏性的,这意味着你不必担心执行对你的数据文件的检查会使已经存在的问题变得更糟。另一方面,修复选项,虽然通常也是安全的,但是它对你的数据文件的更改是无法撤消的。因为这个原因,我们强烈推荐你试图修复一个被破坏的表文件时首先做个备份,并确保在制作这个备份之前你的MySQL服务是关闭的。

  我在win2003下通过命令提示符,输入:

  注:此为记录我当时操作的全部过程

  D:Documents and SettingsAdministrator>c:

  C:>cd mysql

  C:mysql>cd data

  C:mysqldata>cd hw_enterprice

  C:mysqldatahw_enterprice>myisamchk function_products.frm

  ‘myisamchk’ 不是内部或外部命令,也不是可运行的程序或批处理文件。

  C:mysqldatahw_enterprice>cd

  C:>cd mysql

  C:mysql>cd bin

  注:查看myisamchk的帮助信息 

C:mysqlbin>myisamchkmyisamchkVer2.6forWin95/Win98ati32ByMonty,foryourprofessionaluseThissoftwarecomeswithNOWARRANTY:seethePUBLICfordetails.Description,checkandrepairofISAMtables.UsedwithoutoptionsalltablesonthecommandwillbecheckedforerrorsUsage:myisamchk[OPTIONS]tables[.MYI]Globaloptions:-#,–debug=…Outputdebuglog.Oftenthisis‘d:t:o,filename’-?,–helpDisplaythishelpandexit.-O,–set-variablevar=optionChangethevalueofavariable.Pleasenotethatthisoptionisdeprecated;youcansetvariablesdirectlywith‘–variable-name=value’.-t,–tmpdir=pathPathfortemporaryfiles-s,–silentOnlyprinterrors.Onecanusetwo-stomakemyisamchkverysilent-v,–verbosePrintmoreinformation.Thiscanbeusedwith–descriptionand–check.Usemany-vformoreverbosity!-V,–versionPrintversionandexit.-w,–waitWaitiftableislocked.Checkoptions(checkisthedefaultactionformyisamchk):-c,–checkChecktableforerrors-e,–extend-checkCheckthetableVERYthroughly.Onlyusethisinextremecasesasmyisamchkshouldnormallybeabletofindoutifthetableisokevenwithoutthisswitch-F,–fastCheckonlytablesthathaven’tbeenclosedproperly-C,–check-only-changedCheckonlytablesthathavechangedsincelastcheck-f,–forceRestartwith‘-r’ifthereareanyerrorsinthetable.Stateswillbeupdatedaswith‘–update-state’-i,–informationPrintstatisticsinformationabouttablethatischecked-m,–medium-checkFasterthanextend-check,butonlyfinds99.99%ofallerrors.Shouldbegoodenoughformostcases-U–update-stateMarktablesascrashedifyoufindanyerrors-T,–read-onlyDon’tmarktableascheckedRepairoptions(Whenusing‘-r’or‘-o’)-B,–backupMakeabackupofthe.MYDfileas‘filename-time.BAK’–correct-checksumCorrectchecksuminformationfortable.-D,–data-file-length=#Maxlengthofdatafile(whenrecreatingdatafilewhenit’sfull)-e,–extend-checkTrytorecovereverypossiblerowfromthedatafileNormallythiswillalsofindalotofgarbagerows;Don’tusethisoptionifyouarenottotallydesperate.-f,–forceOverwriteoldtemporaryfiles.-k,–keys-used=#TellMyISAMtoupdateonlysomespecifickeys.#isabitmaskofwhichkeystouse.Thiscanbeusedtogetfasterinserts!-r,–recoverCanfixalmostanythingexceptuniquekeysthataren’tunique.-n,–sort-recoverForcesrecoveringwithsortingevenifthetemporaryfilewouldbeverybig.-p,–parallel-recoverUsesthesametechniqueas‘-r’and‘-n’,butcreatesallthekeysinparallel,indifferentthreads.THISISALPHACODE.USEATYOUROWNRISK!-o,–safe-recoverUsesoldrecoverymethod;Slowerthan‘-r’butcanhandleacoupleofcaseswhere‘-r’reportsthatitcan’tfixthedatafile.–character-sets-dir=…Directorywherecharactersetsare–set-character-set=nameChangethecharactersetusedbytheindex-q,–quickFasterrepairbynotmodifyingthedatafile.Onecangiveasecond‘-q’toforcemyisamchktomodifytheoriginaldatafileincaseofduplicatekeys-u,–unpackUnpackfilepackedwithmyisampack.Otheractions:-a,–analyzeAnalyzedistributionofkeys.WillmakesomejoinsinMySQLfaster.Youcancheckthecalculateddistributionbyusing‘–description–verbosetable_name’.-d,–descriptionPrintssomeinformationabouttable.-A,–set-auto-increment[=value]Forceauto_incrementtostartatthisorhighervalueIfnovalueisgiven,thensetsthenextauto_incrementvaluetothehighestusedvaluefortheautokey+1.-S,–sort-indexSortindexblocks.Thisspeedsup‘read-next’inapplications-R,–sort-records=#Sortrecordsaccordingtoanindex.ThismakesyourdatamuchmorelocalizedandmayspeedupthingsC:mysqlbin>myisamchkc:mysqldatahw_enterpricefunction_products.frmmyisamchk:error:‘c:mysqldatahw_enterpricefunction_products.frm’isnotaMyISAM-tableC:mysqlbin>myisamchkc:mysqldatahw_enterpricefunction_products.myiCheckingMyISAMfile:c:mysqldatahw_enterpricefunction_products.myiDatarecords:85207deletedblocks:39myisamchk:warning:Tableismarkedascrashedmyisamchk:warning:1clientsisusingorhasn’tclosedthetableproperly-checkfile-size-checkkeydelete-chain-checkrecorddelete-chainmyisamchk:error:recorddelete-link-chaincorrupted-checkindexreference-checkdatarecordreferencesindex:1-checkdatarecordreferencesindex:2-checkdatarecordreferencesindex:3-checkrecordlinksmyisamchk:error:Wrongbytesec:0-195-171atlinkstart:841908MyISAM-table‘c:mysqldatahw_enterpricefunction_products.myi’iscorruptedFixitusingswitch“-r”or“-o”继续进行操作:C:mysqlbin>myisamchk–recover–quickc:mysqldatahw_enterpricefunction_products.myi-checkkeydelete-chain-checkrecorddelete-chainmyisamchk:error:recorddelete-link-chaincorruptedmyisamchk:error:Quick-recoveraborted;Runrecoverywithoutswitch‘q’UpdatingMyISAMfile:c:mysqldatahw_enterpricefunction_products.myiMyISAM-table‘c:mysqldatahw_enterpricefunction_products.myi’isnotfixedbecauseoferrorsTryfixingitbyusingthe–safe-recover(-o)orthe–force(-f)option系统提示我使用–safe-recover(-o)orthe–force(-f)option进行修复操作,于是C:mysqlbin>myisamchk–safe-recoverc:mysqldatahw_enterpricefunction_products.myi-recovering(withkeycache)MyISAM-table‘c:mysqldatahw_enterpricefunction_products.myi’Datarecords:85207Wrongbytesec:0-195-171at841908;SkippedDatarecords:85215

很强大!
(0)
0%
烂透了!
(0)
0%
编辑:danny

分享与收藏:
您可能感兴趣的文章

数据恢复

热门技术文章

硬盘常见问题