使用 myisamchk 恢复崩溃的mysql数据库

发布时间:2021-01-10编辑:脚本学堂
mysql存储数据的文件格式已经被广泛应用,但总有外部情况可以导致数据库表被破坏:比如 mysqld进程在一个写入当中被杀死,或者计算机的由于掉电或其他原因意外关闭等。

    mysql存储数据的文件格式已经被广泛应用,但总有外部情况可以导致数据库表被破坏:比如 mysqld进程在一个写入当中被杀死,或者计算机的由于掉电或其他原因意外关闭等。
    在执行崩溃恢复时,理解在一个数据库中的每一个表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 -r tbl_name (-r意味着“恢复模式”)。这将从数据文件中删除不正确的记录和已被删除的记录并重建索引文件。

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

如果你用--skip-locking运行mysqld(它在一些系统上是缺省的,如linux),当mysqld正在使用同一个表时,你不能可靠地使用myisamchk检查一张表。如果你能肯定在你运行myisamchk时没有人通过mysqld正在存取表,在你开始检查表之前,你仅需做mysqladmin flush-tables。如果你不能保证, 那么当你检查表时,你必须停掉mysqld。如果你在mysqld正在更新表时运行myisamchk,你可能得到一个表已破坏的警告,即使它没有。

如果你没使用--skip-locking,你能在任何时间使用myisamchk检查表。当你这样时,所有试图更新表的客户在继续前将等到myisamchk就绪。
如果你使用myisamchk修复或优化表,你必须总是保证mysqld服务器不在使用表(如果你正在使用--skip-locking,这也适用)。如果你不停掉mysqld,在你运行myisamchk前,你至少应该做一个mysqladmin flush-tables。

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
如果表被锁定,等待。
对--set-variable(-O)选项,可能的变量是:
key_buffer_size 当前值: 16776192
read_buffer_size 当前值: 262136
write_buffer_size 当前值: 262136
sort_buffer_size 当前值: 2097144
sort_key_blocks 当前值: 16
decode_bits 当前值: 9

myisamchk内存使用
当你运行myisamchk时,内存分配很重要。myisamchk使用不超过你用-O选项指定的内存量。如果你想在很大的文件上使用myisamchk,你首先应该确定你想要它使用多少内存。缺省仅使用大约 3M 来修复。通过使用更大的值,你能使myisamchk更快地操作。例如,如果你有多于32M内存,你能使用例如这些选项(除了任何你可能指定的选项):
shell> myisamchk -O sort=16M -O key=16M -O read=1M -O write=1M ...
使用-O sort=16M应该可能对大多数情形就足够了。
必须明白,myisamchk使用在TMPDIR里面的临时文件。如果TMPDIR指向一个内存文件系统,你可能很容易得到内存溢出的错误。如果它发生,设定TMPDIR指向有更多空间的某个目录并且重启myisamchk。
 
表优化
为了组合成碎片的记录并且消除由于删除或更新记录而浪费的空间, 以恢复模式运行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

大多数情况下,也可使用命令OPTIMIZE TABLES优化并修复表,但是这不如myisamchk快或可靠(在真正的致命错误的情况下)。
另一方面,OPTIMIZE TABLE较易使用并且你不必须关心清空表。