该 myisamchk 实用程序获取数据库表的信息或检查、修复或优化它们。 myisamchk 工作与 MyISAM
表(具有 .MYD
和 .MYI
文件以存储数据和索引)。
您也可以使用 CHECK TABLE
和 REPAIR TABLE
语句来检查和修复 MyISAM
表。请参阅 第 15.7.3.2 节,“CHECK TABLE 语句” 和 第 15.7.3.5 节,“REPAIR TABLE 语句”。
不支持使用 myisamchk 与分区表。
在执行表修复操作之前,建议备份表;在某些情况下,操作可能会导致数据丢失。可能的原因包括但不限于文件系统错误。
Invoke myisamchk 如下:
myisamchk [options] tbl_name ...
该 options
指定您想让 myisamchk 执行的操作。它们在以下部分中描述。您也可以通过 invoke 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 时没有其他程序使用这些表。最有效的方法是关闭 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.19 myisamchk 选项
Option Name | Description |
---|---|
--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 | 用于排序索引时的缓冲区大小 |
--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 | 写缓冲区大小 |