4.6.3 myisamchk — MyISAMtable 维护 Util

myisamchkUtil 获取有关数据库 table 或检查,修复或优化它们的信息。 myisamchkMyISAMtable(具有.MYD.MYI文件用于存储数据和索引的 table)一起使用。

您还可以使用CHECK TABLEREPAIR TABLE语句检查和修复MyISAMtable。参见第 13.7.2.2 节“ CHECK TABLE 语句”第 13.7.2.5 节“ REPAIR TABLE 语句”

不支持将myisamchk与分区 table 一起使用。

Caution

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

像这样调用myisamchk

shell> myisamchk [options] tbl_name ...
  • options *指定您要myisamchk执行的操作。以下各节将对它们进行描述。您还可以通过调用myisamchk --help获得选项列 table。

没有任何选项,myisamchk只是将您的 table 作为默认操作进行检查。要获取更多信息或告诉myisamchk采取纠正措施,请按照以下讨论中的说明指定选项。

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

您可以根据需要在myisamchk命令行上命名多个 table。您也可以通过命名其索引文件(带有.MYI后缀的文件)来指定 table。这使您可以使用模式*.MYI指定目录中的所有 table。例如,如果您在数据库目录中,则可以像这样检查该目录中的所有MyISAMtable:

shell> myisamchk *.MYI

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

shell> myisamchk /path/to/database_dir/*.MYI

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

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

快速检查所有MyISAMtable 的推荐方法是:

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

如果要检查所有MyISAMtable 并修复损坏的 table,可以使用以下命令:

shell> 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进行内存分配的更多信息,请参见第 4.6.3.6 节“ myisamchk 内存使用情况”

有关使用myisamchk的其他信息,请参见第 7.6 节“ MyISAMtable 维护和崩溃恢复”

Important

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

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

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

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

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

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

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

table4.20 myisamchk 选项

Option NameDescription
--analyze分析关键值的分布
--backup将.MYD 文件备份为 file_name-time.BAK
--block-search查找给定偏移量的块属于的记录
--check检查 table 中的错误
--check-only-changed仅检查自上次检查以来已更改的 table
--correct-checksum更正 table 的校验和信息
--data-file-length数据文件的最大长度(当数据文件已满时重新创建时)
--debug编写调试日志
--decode_bitsDecode_bits
--defaults-extra-file除常规选项文件外,还读取命名的选项文件
--defaults-file只读命名的选项文件
--defaults-group-suffix选项组后缀值
--description打印有关 table 的一些描述性信息
--extend-check做非常彻底的 table 检查或修复,尝试从数据文件中恢复每个可能的行
--fast仅检查未正确关闭的 table
--force如果 myisamchk 在 table 中发现任何错误,则自动执行修复操作
--force覆盖旧的临时文件。与-r 或-o 选项一起使用
--ft_max_word_lenFULLTEXT 索引的最大字长
--ft_min_word_lenFULLTEXT 索引的最小字长
--ft_stopword_file使用此文件中的停用词而不是内置列 table
--HELP显示帮助信息并退出
--help显示帮助信息并退出
--information打印有关已检查 table 的信息统计信息
--key_buffer_size用于 MyISAMtable 的索引块的缓冲区大小
--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进行 Sequences 扫描的每个线程都会为其扫描的每个 table 分配此大小的缓冲区
--read-only不要将 table 格标记为已选中
--recover进行修复,可以解决几乎所有问题,但不是唯一的唯一键
--safe-recover使用旧的恢复方法进行修复,该方法按 Sequences 读取所有行并根据找到的行更新所有索引树
--set-auto-increment强制新记录的 AUTO_INCREMENT 编号从给定值开始
--set-collation指定排序 table 索引使用的排序规则
--silentSilent mode
--sort_buffer_size执行 REPAIR 或使用 CREATE INDEX 或 ALTER TABLE 创建索引时对索引进行排序时分配的缓冲区
--sort-index以高-低 Sequences 对索引树块进行排序
--sort_key_blockssort_key_blocks
--sort-records根据特定索引对记录进行排序
--sort-recover强制 myisamchk 使用排序来解析密钥,即使临时文件非常大
--stats_method指定 MyISAM 索引统计信息收集代码应如何处理 NULL
--tmpdir用于存储临时文件的目录
--unpack打开包装有 myisampack 的桌子的包装
--update-state将信息存储在.MYI 文件中,以指示何时检查了 table 以及 table 是否崩溃
--verboseVerbose mode
--version显示版本信息并退出
--write_buffer_size写缓冲区大小