如何使用 myisamchk 修复损坏的 MySQL 表
MyISAM 是 MySQL 数据库的默认存储引擎,MyISAM 表很容易损坏。在本文中,我将解释如何使用 myisamchk 来识别和修复 MyISAM 中的表损坏。在 MySQL 下创建表时,会创建三个不同的文件:*.frm文件用于存储表格式,*.MYD (MyData) 文件用于存储数据,*. MYI (MyIndex) 文件用于存储索引。我更喜欢使用 InnoDB 作为更大数据库的存储引擎,因为它类似于 Oracle 并提供提交、回滚选项。
我从使用 MySQL 数据库的生产 bugzilla 应用程序中收到以下错误。从错误信息中可以看出,attach_data 表已损坏,需要修复。损坏的表可以使用 myisamchk 修复,如下所述。
undef error - DBD::mysql::db selectrow_array failed: Table 'attach_data' is
marked as crashed and should be repaired [for Statement "SELECT LENGTH(thedata)
FROM attach_data WHERE id = ?"] at Bugzilla/Attachment.pm line 344
Bugzilla::Attachment::datasize('Bugzilla::Attachment=HASH(0x9df119c)') called
1. 使用 myisamchk 识别所有损坏的表
# myisamchk /var/lib/mysql/bugs/*.MYI >> /tmp/myisamchk_log.txt
myisamchk: error: Wrong bytesec: 0-0-0 at linkstart: 18361936
MyISAM-table 'attach_data.MYI' is corrupted
Fix it using switch "-r" or "-o"
myisamchk: warning: 1 client is using or hasn't closed the table properly
MyISAM-table 'groups.MYI' is usable but should be fixed
myisamchk: warning: 1 client is using or hasn't closed the table properly
MyISAM-table 'profiles.MYI' is usable but should be fixed
当您将 myisamchk 的输出重定向到临时文件时,它只会在屏幕上显示损坏的表名。/tmp/myisamchk_log.txt 文件将包含所有表的信息,包括好的表,如下所示:
Checking MyISAM file: user_group_map.MYI
Data records: 182 Deleted blocks: 0
- check file-size
- check record delete-chain
- check key delete-chain
- check index reference
- check data record references index: 1
2.使用myisamchk修复损坏的表
执行如下所示的 myisamchk,使用 -r 选项修复上述步骤中发现的损坏表。
# myisamchk -r profiles.MYI
- recovering (with sort) MyISAM-table 'profiles.MYI'
Data records: 80
- Fixing index 1
- Fixing index 2
您可能会收到错误消息:如果您的应用程序和其他表仍在使用这些表,则客户端正在使用或未正确关闭该表。为避免出现此错误消息,请在执行修复之前关闭 mysqld,如果您有能力关闭数据库一段时间。如果没有,请使用 FLUSH TABLES 强制 mysqld 刷新仍在内存中的任何表修改。
3. 对整个MySQL数据库进行检查和修复
# myisamchk --silent --force --fast --update-state /var/lib/mysql/bugs/*.MYI
myisamchk: MyISAM file /var/lib/mysql/bugs/groups.MYI
myisamchk: warning: 1 client is using or hasn't closed the table properly
myisamchk: MyISAM file /var/lib/mysql/bugs/profiles.MYI
myisamchk: warning: 1 client is using or hasn't closed the table properly
- -s, --silent 选项:仅打印错误。您可以使用两个 -s 使 myisamchk 非常安静。
- -f, --force 选项:如果表中有任何错误,则使用修复选项 -r 自动重新启动 myisamchk。
- -F, --fast 选项:只检查没有正确关闭的表。
- -U --update-state 选项:当发现任何错误时,将表标记为崩溃。
4. 为大型 MySQL 数据库分配额外的内存
对于大型数据库,恢复表可能需要几个小时。根据系统上可用的 RAM,在执行 myisamchk 时增加内存参数,如下所示:
# myisamchk --silent --force --fast --update-state \
--key_buffer_size=512M --sort_buffer_size=512M \
--read_buffer_size=4M --write_buffer_size=4M \
/var/lib/mysql/bugs/*.MYI
5. 使用 myisamchk 获取一个表的信息
您还可以使用 myisamchk 获取有关表的详细信息,如下所示。
# myisamchk -dvv profiles.MYI
MyISAM file: profiles.MYI
Record format: Packed
Character set: latin1_swedish_ci (8)
File-version: 1
Creation time: 2007-08-16 18:46:59
Status: open,changed,analyzed,optimized keys,sorted index pages
Auto increment key: 1 Last value: 88
Data records: 88 Deleted blocks: 0
Datafile parts: 118 Deleted data: 0
Datafile pointer (bytes): 4 Keyfile pointer (bytes): 4
Datafile length: 6292 Keyfile length: 6144
Max datafile length: 4294967294 Max keyfile length: 4398046510079
Recordlength: 2124
table description:
Key Start Len Index Type Rec/key Root Blocksize
1 2 3 unique int24 1 1024 1024
2 5 765 unique char packed stripped 1 2048 4096
Field Start Length Nullpos Nullbit Type
1 1 1
2 2 3 no zeros
3 5 765 no endspace
6.所有myisamchk选项
执行以下命令以了解 myisamchk 的所有可用选项。
# myisamchk --help
以下是一些可以与 myisamchk 一起使用的关键选项。
全局选项:
- -s, --silent只打印错误。可以使用两个 -s 使 myisamchk 非常安静。
- -v, --verbose打印更多信息。这可以与--description 和--check 一起使用。使用 many -v 以获得更详细的信息。
- -V, --version打印版本并退出。
- -w, --wait等待表被锁定。
检查选项(检查是 myisamchk 的默认操作):
- -c, --check检查表是否有错误。
- -e, --extend-check非常彻底地检查表。仅在极端情况下使用此选项,因为即使没有此开关,myisamchk 通常也应该能够确定表是否正常。
- -F, --fast只检查没有正确关闭的表。
- -C, --check-only-changed只检查自上次检查以来发生变化的表。
- -f, --force如果表中有任何错误,请使用“-r”重新启动。状态将像“--update-state”一样更新。
- -i, --information打印有关已检查表的统计信息。
- -m, --medium-check比extend -check快,但只能找到99.99% 的错误。对于大多数情况应该足够好。
- -U --update-state如果发现任何错误,则将表标记为崩溃。
- -T, --read-only不要将表标记为已检查。
修复选项(使用“-r”或“-o”时):
- -B, --backup将 .MYD 文件备份为“filename-time.BAK”。
- --correct-checksum正确的表校验和信息。
- -e, --extend-check尝试从数据文件中恢复每个可能的行。通常这也会发现很多垃圾行;如果您不是完全绝望,请不要使用此选项。
- -f, --force覆盖旧的临时文件。
- -r, --recover几乎可以修复除不唯一的唯一键之外的任何内容。
- -n, --sort-recover即使临时文件非常大,也强制进行排序恢复。
- -p, --parallel-recover使用与“-r”和“-n”相同的技术,但在不同线程中并行创建所有键。
- -o, --safe-recover使用旧的恢复方法;比“-r”慢,但可以处理“-r”报告无法修复数据文件的几种情况。
- -q, --quick通过不修改数据文件更快地修复。可以给出第二个“-q”来强制 myisamchk 在重复键的情况下修改原始数据文件。注意:无法使用此选项修复数据文件损坏的表。
- -u, --unpack解压用 myisampack 打包的文件。
其他行为:
- -a, --analyze分析密钥的分布。将使 MySQL 中的一些连接更快。您可以使用“--description --verbose table_name”检查计算的分布。
- -d, --description打印有关表的一些信息。
- 点赞
- 收藏
- 关注作者
评论(0)