文档首页
MySQL 8.4 参考手册
相关文档 下载本手册
PDF (US Ltr) - 39.9Mb
PDF (A4) - 40.0Mb
手册页 (TGZ) - 258.5Kb
手册页 (Zip) - 365.5Kb
Info (Gzip) - 4.0Mb
Info (Zip) - 4.0Mb


MySQL 8.4 参考手册  /  ...  /  myisamchk — MyISAM 表维护工具

6.6.4 myisamchk — MyISAM 表维护工具

The myisamchk 实用程序获取有关数据库表的的信息,或者检查、修复或优化它们。 myisamchkMyISAM 表(存储数据和索引的表具有 .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 相同的技术,但并行创建所有键,使用不同的线程(beta 版)
--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 写缓冲区大小