由MySQL用来存储数据的文件格式以已经被广泛地测试过,但是总是有外部情况可以导致数据库表被破坏:
1.mysqld进程在一个写入当中被杀死。
2.计算机的意外关闭(例如,如果计算机掉电)。
3.一个硬件错误
例如:
Table ‘./数据库名/表名’ is marked as crashed and should be repaired
在执行崩溃恢复时,理解在一个数据库中的每一个表tbl_name对应的在数据库目录中的3个文件是很重要的:
文件 用途
“tbl_name.frm” 表定义(表格)文件
“tbl_name.MYD” 数据文件
“tbl_name.MYI” 索引文件
这3个文件的每一个文件类型可能遭受不同形式的损坏,但是问题最常发生在数据文件和索引文件。
怎样检查表的错误
为了检查一张表,使用下列命令:
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还打印出一些统计信息。
myisamchk支持下列参数:
-a, -analyze
分析键值的分布。这通过让联结优化器更好地选择表应该以什么次序联结和应该使用哪个键来改进联结性能。
-#, -debug=debug_options
输出调试记录文件。debug_options字符串经常是’d:t:o,filename’。
-d, -description
打印出关于表的一些信息。
-e, -extend-check
非常彻底地检查表。这仅在极端情况下是必要的。通常,myisamchk应该找出所有错误,即使没有改选项。
-f, -force
覆盖老的临时文件。如果你在检查表时使用-f (运行myisamchk没有-r),myisamchk在检查期间将自动为出现一个错误的表用-r重启。
-help
显示一条帮助消息并且退出。
-i, -information
打印有关被检查的表的信息统计。
-k #, -keys-used=#
与-r一起使用。告诉ISAM表处理器仅更新头#个索引。较高编号的索引被撤销。这能用来使插入变得更快!撤销的索引能通过使用myisamchk -r被重新激活。
-l, -no-symlinks
在修复时,不跟随符号连接。通常myisamchk修复一个符号连接所指的表。
-q, -quick
与-r一起使用使得一个修复更快。通常,原来的数据文件没被接触;你能指定第二个-q强制使用原来的数据文件。
-r, -recover
恢复模式。可以修复几乎所有一切,除非唯一的键不是唯一。
-o, -safe-recover
恢复模式。使用一个老的恢复方法;这比-r慢些,但是能处理一-r不能处理的情况。
-O var=option, -set-variable var=option
设置一个变量的值。可能的变量列在下面。
-s, -silent
沉默模式。当错误发生时,仅写输出。你能使用-s两次(-ss)非常沉默地做myisamchk。
-S, -sort-index
以从高到低的顺序排序索引树块。这将优化搜寻并且将使按键值的表扫描更快。
-R index_num, -sort-records=index_num
根 据一个索引排序记录。这使你的数据更局部化并且可以加快在该键上的SELECT和ORDER BY的范围搜索。(第一次做排序可能很慢!) 为了找出一张表的索引编号,使用SHOW INDEX,它以myisamchk看见他们的相同顺序显示一张表的索引。索引从1开始编号。
-u, -unpack
解开一个用myisampack压缩的表。
-v, -verbose
冗长模式。打印更多的信息。这能与-d和-e一起使用。为了更冗长,使用-v多次(-vv, -vvv)!
-V, -version
打印myisamchk版本并退出。
-w, -wait
如果表被锁定,等待。
myisamchk用法
注意:使用myisamchk前,要确保mysqld没有在访问要检查的表。最好停止mysqld。
1 执行myisamchk -update-state -s /path/to/*.myi,检查有哪些索引文件出了问题(可能会花费比较长的时间)。
update-state选项只有在停止mysqld的时候使用,-s表示忽略一些正常的表列出的信息,只列出错误。
2 对于每一个损坏的表,尝试myisamchk -r -q /path/to/table_name。这是快速修复模式,会自动检查索引表和数据表是否能够一致。如果一致,则可以修复。
3 如果快速修复模式失败,考虑:myisamchk -r /path/to/table_name,会删除不一致的数据和索引,并重新构建索引。
4 如果3失败,考虑:myisamchk -safe-recover /path/to/table_name