The myisamchk 实用程序获取有关数据库表的的信息,或者检查、修复或优化它们。 myisamchk 与 MyISAM
表(存储数据和索引的表具有 .MYD
和 .MYI
文件)一起使用。
您也可以使用 CHECK TABLE
和 REPAIR 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 | 写缓冲区大小 |