mysql数据库下破坏数据的恢复操纵其进程总结
核心提示:前几天由于mysql数据库部份数据破坏缘由,我尝试了下恢复数据,以后整理以下文档,供各位参考,以备各位同事以后如有类似题目,可以少走些弯路,尽快解决题目。
此文档是1位高手同事Hewei的原创实践总结,过***是出色,最后修复破坏数据库取得美满效果,值得收躲的1篇好文章。
前几天由于mysql数据库部份数据破坏缘由,我尝试了下恢复数据,以后整理以下文档,供各位参考,以备各位同事以后如有类似题目,可以少走些弯路,尽快解决题目。
环境:windows2003
数据库:mysql
破坏数据文件名:function_products
将数据库内容物理文件直接导进到mysql\data下,每只表各3个文件,顺次分别为:.frm .MYD .MYI
首先我第1想到的是往网上搜索,寻觅类似的工具,试图通过工具来恢复已破坏的文件,因而我在GOOGLE上查找,找到1款名为MySQLRecovery的工具,安装后我用其进行恢复,只惋惜效果太不理想,几10M大的数据文件,恢复以后它提示我居然只有几10K。
我又想到了mysql下应有自己本身的修复程序等,因而想通过其来进行恢复,在网上查找了资料,提示:由于临时断电,使用kill ⑼中断MySQL服务进程,或是mysql正在高速运转时进行强迫备份操纵时等,所有的这些都可能会损坏MySQL的数据文件。假设在被干扰时,服务正在改变文件,文件可能会留下毛病的或不1致的状态。由于这样的损坏有时是不轻易被发现的,当你发现这个毛病时多是很久以后的事了。
因而,当你发现这个题目时,或许所有的备份都有一样的毛病。
我想我现在碰到的题目多是这个题目,由于备份的数据也是有部份破坏的数据,所以导致不能完全运行,意想到myisamchk程序对用来检查和修改的MySQL数据文件的访问应当是唯1的。假设MySQL服务正在使用某1文件,并对myisamchk正在检查的文件进行修改,myisamchk会误以为产生了毛病,并会试图进行修复–这将导致MySQL服务的崩溃!这样,要避免这类情况的产生,通常我们需要在工作时封闭MySQL服务。作为选择,你也能够暂时封闭服务以制作1个文件的拷贝,然后在这个拷贝上工作。当你做完了以后,重新封闭服务并使用新的文件取代原来的文件(或许你还需要使用期间的变更日志)。
MySQL数据目录不是太难理解的。每1个数据库对应1个子目录,每个子目录中包括了对应于这个数据库中的数据表的文件。每1个数据表对应3个文件,它们和表名相同,但是具有不同的扩大名。tblName.frm文件是表的定义,它保存了表中包括的数据列的内容和类型。tblName.MYD文件包括了表中的数据。tblName.MYI文件包括了表的索引(例如,它可能包括lookup表以帮助进步对表的主键列的查询)。
要检查1个表的毛病,只需要运行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将对表文件履行普通的检查。假设你对1个表有怀疑,但是普通的检查不能发现任何毛病,你可以履行更完全的检查(但是也更慢!),这需要使用–extend-check选项:
% myisamchk –extend-check /path/to/tblName
对毛病的检查是没有破坏性的,这意味着你没必要担心履行对你的数据文件的检查会使已存在的题目变得更糟。另1方面,修复选项,固然通常也是安全的,但是它对你的数据文件的更改是没法撤消的。由于这个缘由,我们强烈推荐你试图修复1个被破坏的表文件时首先做个备份,并确保在制作这个备份之前你的MySQL服务是封闭的。
我在win2003下通过命令提示符,输进:
注:此为记录我当时操纵的全部进程
D:\Documents and Settings\Administrator>c:
C:\>cd mysql
C:\mysql>cd data
C:\mysql\data>cd hw_enterprice
C:\mysql\data\hw_enterprice>myisamchk function_products.frm
‘myisamchk’ 不是内部或外部命令,也不是可运行的程序
或批处理文件。
C:\mysql\data\hw_enterprice>cd\
C:\>cd mysql
C:\mysql>cd bin
注:查看myisamchk的帮助信息
以下为援用的内容:
C:\mysql\bin>myisamchk myisamchk Ver 2.6 for Win95/Win98 at i32 By Monty, for your professional use This software comes with NO WARRANTY: see the PUBLIC for details. Description, check and repair of ISAM tables. Used without options all tables on the command will be checked for errors Usage: myisamchk [OPTIONS] tables[.MYI] Global options: -#, –debug=… Output debug log. Often this is ‘d:t:o,filename’ -?, –help Display this help and exit. -O, –set-variable var=option Change the value of a variable. Please note that this option is deprecated; you can set variables directly with ‘–variable-name=value’. -t, –tmpdir=path Path for temporary files -s, –silent Only print errors. One can use two -s to make myisamchk very silent -v, –verbose Print more information. This can be used with –description and –check. Use many -v for more verbosity! -V, –version Print version and exit. -w, –wait Wait if table is locked. Check options (check is the default action for myisamchk): -c, –check Check table for errors -e, –extend-check Check the table VERY throughly. Only use this in extreme cases as myisamchk should normally be able to find out if the table is ok even without this switch -F, –fast Check only tables that haven’t been closed properly -C, –check-only-changed Check only tables that have changed since last check -f, –force Restart with ‘-r’ if there are any errors in the table. States will be updated as with ‘–update-state’ -i, –information Print statistics information about table that is checked -m, –medium-check Faster than extend-check, but only finds 99.99% of all errors. Should be good enough for most cases -U –update-state Mark tables as crashed if you find any errors -T, –read-only Don’t mark table as checked Repair options (When using ‘-r’ or ‘-o’) -B, –backup Make a backup of the .MYD file as ‘filename-time.BAK’ –correct-checksum Correct checksum information for table. -D, –data-file-length=# Max length of data file (when recreating data file when it’s full) -e, –extend-check Try to recover every possible row from the data file Normally this will also find a lot of garbage rows; Don’t use this option if you are not totally desperate. -f, –force Overwrite old temporary files. -k, –keys-used=# Tell MyISAM to update only some specific keys. # is a bit mask of which keys to use. This can be used to get faster inserts! -r, –recover Can fix almost anything except unique keys that aren’t unique. -n, –sort-recover Forces recovering with sorting even if the temporary file would be very big. -p, –parallel-recover Uses the same technique as ‘-r’ and ‘-n’, but creates all the keys in parallel, in different threads. THIS IS ALPHA CODE. USE AT YOUR OWN RISK! -o, –safe-recover Uses old recovery method; Slower than ‘-r’ but can handle a couple of cases where ‘-r’ reports that it can’t fix the data file. –character-sets-dir=… Directory where character sets are –set-character-set=name Change the character set used by the index -q, –quick Faster repair by not modifying the data file. One can give a second ‘-q’ to force myisamchk to modify the original datafile in case of duplicate keys -u, –unpack Unpack file packed with myisampack. Other actions: -a, –analyze Analyze distribution of keys. Will make some joins in MySQL faster. You can check the calculated distribution by using ‘–description –verbose table_name’. -d, –description Prints some information about table. -A, –set-auto-increment[=value] Force auto_increment to start at this or higher value If no value is given, then sets the next auto_increment value to the highest used value for the auto key + 1. -S, –sort-index Sort index blocks. This speeds up ‘read-next’ in applications -R, –sort-records=# Sort records according to an index. This makes your data much more localized and may speed up things C:\mysql\bin>myisamchk c:\mysql\data\hw_enterprice\function_products.frm myisamchk: error: ‘c:\mysql\data\hw_enterprice\function_products.frm’ is not a M yISAM-table C:\mysql\bin>myisamchk c:\mysql\data\hw_enterprice\function_products.myi Checking MyISAM file: c:\mysql\data\hw_enterprice\function_products.myi Data records: 85207 Deleted blocks: 39 myisamchk: warning: Table is marked as crashed myisamchk: warning: 1 clients is using or hasn’t closed the table properly - check file-size - check key delete-chain - check record delete-chain myisamchk: error: record delete-link-chain corrupted - check index reference - check data record references index: 1 - check data record references index: 2 - check data record references index: 3 - check record links myisamchk: error: Wrong bytesec: 0⑴95⑴71 at linkstart: 841908 MyISAM-table ‘c:\mysql\data\hw_enterprice\function_products.myi’ is corrupted Fix it using switch “-r” or “-o” 继续进行操纵: C:\mysql\bin>myisamchk –recover –quick c:\mysql\data\hw_enterprice\function_p roducts.myi - check key delete-chain - check record delete-chain myisamchk: error: record delete-link-chain corrupted myisamchk: error: Quick-recover aborted; Run recovery without switch ‘q’ Updating MyISAM file: c:\mysql\data\hw_enterprice\function_products.myi MyISAM-table ‘c:\mysql\data\hw_enterprice\function_products.myi’ is not fixed be cause of errors Try fixing it by using the –safe-recover (-o) or the –force (-f) option 系统提示我使用–safe-recover (-o) or the –force (-f) option进行修复操纵,因而 C:\mysql\bin>myisamchk –safe-recover c:\mysql\data\hw_enterprice\function_prod ucts.myi - recovering (with keycache) MyISAM-table ‘c:\mysql\data\hw_enterprice\function_ products.myi’ Data records: 85207 Wrong bytesec: 0⑴95⑴71 at 841908; Skipped Data records: 85215
|
将修复后的物理文件复制到mysql\data下以后,通过phpMyAdmin进行访问,OK正常!
本次数据恢复操纵成功,数据已被正常恢复,总计85215条记录,其中数据恢复总计85207条。
总结本次经验及查找资料,以下:
当你试图修复1个被破坏的表的题目时,有3种修复类型。假设你得到1个毛病信息指出1个临时文件不能建立,删除信息所指出的文件并再试1次–这通常是上1次修复操纵遗留下来的。
这3种修复方法以下所示:
% myisamchk –recover –quick /path/to/tblName
% myisamchk –recover /path/to/tblName
% myisamchk –safe-recover /path/to/tblName
第1种是最快的,用来修复最普通的题目;而最后1种是最慢的,用来修复1些其它方法所不能修复的题目。
检查和修复MySQL数据文件
假设上面的方法没法修复1个被破坏的表,在你放弃之前,你还可以试试下面这两个技能:
假设你怀疑表的索引文件(*.MYI)产生了不可修复的毛病,乃至是丢失了这个文件,你可使用数据文件(*.MYD)和数据格式文件(*.frm)重新天生它。首先制作1个数据文件(tblName.MYD)的拷贝。重启你的MySQL服务并连接到这个服务上,使用下面的命令删除表的内容:
mysql> DELETE FROM tblName;
在删除表的内容的同时,会建立1个新的索引文件。退出登录并重新封闭服务,然后用你刚才保存的数据文件(tblName.MYD)覆盖新的(空)数据文件。最后,使用myisamchk履行标准的修复(上面的第2种方法),根据表的数据的内容和表的格式文件重新天生索引数据。
假设你的表的格式文件(tblName.frm)丢失了或是产生了不可修复的毛病,但是你清楚如何使用相应的CREATE TABLE语句来重新天生这张表,你可以重新天生1个新的.frm文件并和你的数据文件和索引文件(假设索引文件有题目,使用上面的方法重建1个新的)1起使用。首先制作1个数据和索引文件的拷贝,然后删除原来的文件(删除数据目录下有关这个表的所有记录)。
启动MySQL服务并使用当初的CREATE TABLE文件建立1个新的表。新的.frm文件应当可以正常工作了,但是最好你还是履行1下标准的修复(上面的第2种方法)。
假设有类似题目,建议自己先分析题目根源,查找资料,自己动手解决,不但可以多学更多知识技能,更重要的是,自己也在解决题目的同时得到了快乐。
http://www.fw8.net/TAG:
数据,
文件,
题目,
毛病,
索引