文档首页
MySQL 9.0 参考手册
相关文档 下载本手册
PDF (US Ltr) - 40.0Mb
PDF (A4) - 40.1Mb
手册页 (TGZ) - 258.2Kb
手册页 (Zip) - 365.3Kb
信息 (Gzip) - 4.0Mb
信息 (Zip) - 4.0Mb


MySQL 9.0 参考手册  /  ...  /  myisamchk — MyISAM 表维护实用程序

6.6.4 myisamchk — MyISAM 表维护实用程序

myisamchk 实用程序获取有关数据库表的信息,或者检查、修复或优化它们。myisamchk 适用于 MyISAM 表(使用 .MYD.MYI 文件存储数据和索引的表)。

您还可以使用 CHECK TABLEREPAIR TABLE 语句来检查和修复 MyISAM 表。请参见 第 15.7.3.2 节,“CHECK TABLE 语句”第 15.7.3.5 节,“REPAIR TABLE 语句”

不支持对分区表使用 myisamchk

注意

最好在执行表修复操作之前备份表;在某些情况下,该操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。

如下调用 myisamchk

myisamchk [options] tbl_name ...

options 指定您希望 myisamchk 执行的操作。这些选项将在以下各节中介绍。您还可以通过调用 myisamchk --help 获取选项列表。

如果没有选项,myisamchk 只会检查您的表作为默认操作。要获取更多信息或告诉 myisamchk 采取纠正措施,请按照以下说明指定选项。

tbl_name 是您要检查或修复的数据库表。如果您在数据库目录之外的某个位置运行 myisamchk,则必须指定数据库目录的路径,因为 myisamchk 不知道数据库的位置。事实上,myisamchk 实际上并不关心您正在处理的文件是否位于数据库目录中。您可以将与数据库表对应的文件复制到其他位置,并在那里对其执行恢复操作。

如果您愿意,可以在 myisamchk 命令行上命名多个表。您还可以通过命名其索引文件(扩展名为 .MYI 的文件)来指定表。这使您可以使用模式 *.MYI 指定目录中的所有表。例如,如果您在数据库目录中,则可以使用以下命令检查该目录中的所有 MyISAM

myisamchk *.MYI

如果您不在数据库目录中,则可以通过指定目录的路径来检查其中的所有表

myisamchk /path/to/database_dir/*.MYI

您甚至可以通过使用 MySQL 数据目录的路径指定通配符来检查所有数据库中的所有表

myisamchk /path/to/datadir/*/*.MYI

快速检查所有 MyISAM 表的推荐方法是

myisamchk --silent --fast /path/to/datadir/*/*.MYI

如果要检查所有 MyISAM 表并修复所有已损坏的表,可以使用以下命令

myisamchk --silent --force --fast --update-state \
          --key_buffer_size=64M --myisam_sort_buffer_size=64M \
          --read_buffer_size=1M --write_buffer_size=1M \
          /path/to/datadir/*/*.MYI

此命令假定您有超过 64MB 的可用空间。有关使用 myisamchk 进行内存分配的更多信息,请参见 第 6.6.4.6 节,“myisamchk 内存使用”

有关使用 myisamchk 的更多信息,请参见 第 9.6 节,“MyISAM 表维护和故障恢复”

重要

必须确保在运行 myisamchk 时没有其他程序正在使用这些表。 最有效的方法是在运行 myisamchk 时关闭 MySQL 服务器,或者锁定 myisamchk 正在使用的所有表。

否则,当您运行 myisamchk 时,它可能会显示以下错误消息

warning: clients are using or haven't closed the table properly

这意味着您正在尝试检查一个已由另一个程序(例如 mysqld 服务器)更新的表,该程序尚未关闭该文件或已在未正确关闭该文件的情况下终止,这有时会导致一个或多个 MyISAM 表损坏。

如果 mysqld 正在运行,则必须使用 FLUSH TABLES 强制它刷新仍在内存中缓冲的任何表修改。然后,您应该确保在运行 myisamchk 时没有人使用这些表

但是,避免此问题的最简单方法是使用 CHECK TABLE 而不是 myisamchk 来检查表。请参阅第 15.7.3.2 节“CHECK TABLE 语句”

myisamchk 支持以下选项,这些选项可以在命令行或选项文件的 [myisamchk] 组中指定。有关 MySQL 程序使用的选项文件的信息,请参阅第 6.2.2.2 节“使用选项文件”

表 6.17 myisamchk 选项

选项名称 描述
--analyze 分析键值的分布
--backup 将 .MYD 文件备份为 file_name-time.BAK
--block-search 查找给定偏移量处的块所属的记录
--character-sets-dir 可以找到字符集的目录
--check 检查表是否有错误
--check-only-changed 仅检查自上次检查后已更改的表
--correct-checksum 更正表的校验和信息
--data-file-length 数据文件的最大长度(在数据文件已满时重新创建数据文件时)
--debug 写入调试日志
--decode_bits Decode_bits
--defaults-extra-file 除了常用的选项文件外,还要读取指定的选项文件
--defaults-file 仅读取指定的选项文件
--defaults-group-suffix 选项组后缀值
--description 打印有关该表的一些描述性信息
--extend-check 执行非常彻底的表检查或修复,尝试从数据文件中恢复每一行
--fast 仅检查未正确关闭的表
--force 如果 myisamchk 在表中发现任何错误,则自动执行修复操作
--force 覆盖旧的临时文件。与 -r 或 -o 选项一起使用
--ft_max_word_len FULLTEXT 索引的最大字长
--ft_min_word_len FULLTEXT 索引的最小字长
--ft_stopword_file 使用此文件中的停用词,而不是内置列表
--HELP 显示帮助消息并退出
--help 显示帮助消息并退出
--information 打印有关正在检查的表的统计信息
--key_buffer_size 用于 MyISAM 表的索引块的缓冲区大小
--keys-used 一个位值,指示要更新哪些索引
--max-record-length 如果 myisamchk 无法分配内存来保存大于给定长度的行,则跳过这些行
--medium-check 执行比 --extend-check 操作更快的检查
--myisam_block_size 用于 MyISAM 索引页的块大小
--myisam_sort_buffer_size 在执行 REPAIR 时或使用 CREATE INDEX 或 ALTER TABLE 创建索引时对索引进行排序时分配的缓冲区
--no-defaults 不读取选项文件
--parallel-recover 使用与 -r 和 -n 相同的技术,但使用不同的线程并行创建所有键(测试版)
--print-defaults 打印默认选项
--quick 通过不修改数据文件来实现更快的修复
--read_buffer_size 执行顺序扫描的每个线程都会为其扫描的每个表分配一个此大小的缓冲区
--read-only 不要将表标记为已检查
--recover 执行修复,可以修复几乎所有问题,但非唯一唯一键除外
--safe-recover 使用旧的恢复方法进行修复,该方法按顺序读取所有行,并根据找到的行更新所有索引树
--set-auto-increment 强制新记录的 AUTO_INCREMENT 编号从给定值开始
--set-collation 指定用于对表索引进行排序的排序规则
--silent 静默模式
--sort_buffer_size 在执行 REPAIR 时或使用 CREATE INDEX 或 ALTER TABLE 创建索引时对索引进行排序时分配的缓冲区
--sort-index 按从高到低的顺序对索引树块进行排序
--sort_key_blocks sort_key_blocks
--sort-records 根据特定索引对记录进行排序
--sort-recover 强制 myisamchk 使用排序来解析键,即使临时文件非常大
--stats_method 指定 MyISAM 索引统计信息收集代码应如何处理 NULL
--tmpdir 用于存储临时文件的目录
--unpack 解压缩使用 myisampack 打包的表
--update-state 在 .MYI 文件中存储信息,以指示表的检查时间以及表是否崩溃
--verbose 详细模式
--version 显示版本信息并退出
--wait 等待锁定的表解锁,而不是终止
--write_buffer_size 写入缓冲区大小