如何使用 myisamchk 修复损坏的 MySQL 表

举报
Tiamo_T 发表于 2021/11/25 14:10:14 2021/11/25
【摘要】 MyISAM 是 MySQL 数据库的默认存储引擎,MyISAM 表很容易损坏。在本文中,我将解释如何使用 myisamchk 来识别和修复 MyISAM 中的表损坏。在 MySQL 下创建表时,会创建三个不同的文件:*.frm文件用于存储表格式,*.MYD (MyData) 文件用于存储数据,*. MYI (MyIndex) 文件用于存储索引。我更喜欢使用 InnoDB 作为更大数据库的存储引擎

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打印有关表的一些信息。
【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。