• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • myisamchk是MyISAM数据表维护实用程序

    myisamchk的程序获取有关数据库表或检查,修理,或将其提供更优的信息。myisamchk的作品与MyISAM表(有表.MYD.MYI文件存储数据和索引)。

    您也可以使用CHECK TABLE and REPAIR TABLE语句检查和修复MyISAM表。请参见“ CHECK TABLE语句”和“ REPAIR TABLE语句”。

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

    警告

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

    像这样调用myisamchk

    shell>myisamchk [options] tbl_name ...
    

    options你想要的指定myisamchk的做。以下各节将对它们进行描述。您还可以通过调用myisamchk --help来获得选项列表。

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

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

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

    shell>myisamchk *.MYI
    

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

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

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

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

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

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

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

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

    有关使用myisamchk的更多信息,请参见“ MyISAM表维护和崩溃恢复”。

    重要

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

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

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

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

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

    但是,避免此问题的最简单方法是使用myisamchkCHECK TABLE代替检查表。请参见“ CHECK TABLE语句”。

    myisamchk支持以下选项,可以在命令行或[myisamchk]选项文件的组中指定这些选项。

    此后的各节介绍仅与特定操作有关的选项,例如表检查或修复。

    myisamchk一般选项

    • --help-?

      显示帮助消息并退出。选项按操作类型分组。

    • --HELP-H

      显示帮助消息并退出。选项显示在单个列表中。

    • --debug=debug_options-#debug_options

      编写调试日志。典型的debug_options字符串是。默认值为。d:t:o,file_named:t:o,/tmp/myisamchk.trace

      仅当MySQL是使用构建的时,此选项才可用WITH_DEBUG。Oracle提供的MySQL版本二进制文件不是使用此选项构建的。

    • --defaults-extra-file=file_name

      在全局选项文件之后但在用户选项文件之前(在Unix上)读取此选项文件。如果该文件不存在或无法访问,则发生错误。file_name如果给出为相对路径名而不是完整路径名,则相对于当前目录解释。

      有关此选项和其他选项文件选项的更多信息,请参见“影响选项文件处理的命令行选项”。

    • --defaults-file=file_name

      仅使用给定的选项文件。如果该文件不存在或无法访问,则发生错误。file_name如果给出为相对路径名而不是完整路径名,则相对于当前目录解释。

      有关此选项和其他选项文件选项的更多信息,请参见“影响选项文件处理的命令行选项”。

    • --defaults-group-suffix=str

      不仅阅读常规选项组,而且阅读具有常规名称和后缀的组str。例如,myisamchk通常会读取该[myisamchk]组。如果--defaults-group-suffix=_other给出选项,myisamchk也会读取该[myisamchk_other]组。

      有关此选项和其他选项文件选项的更多信息,请参见“影响选项文件处理的命令行选项”。

    • --no-defaults

      不要读取任何选项文件。如果由于从选项文件中读取未知选项而导致程序启动失败,--no-defaults则可以使用该选项来防止读取它们。

      唯一的例外是,.mylogin.cnf在所有情况下都会读取该文件(如果存在)。这样,即使--no-defaults使用密码,也可以通过比命令行更安全的方式指定密码。(.mylogin.cnfmysql_config_editor实用程序创建。请参见“mysql_config_editor-MySQL配置实用程序”。)

      有关此选项和其他选项文件选项的更多信息,请参见“影响选项文件处理的命令行选项”。

    • --print-defaults

      打印程序名称及其从选项文件中获取的所有选项。

      有关此选项和其他选项文件选项的更多信息,请参见“影响选项文件处理的命令行选项”。

    • --silent-s

      静音模式。仅在发生错误时才写输出。您可以使用-s两次(-ss)使myisamchk非常安静。

    • --verbose-v

      详细模式。打印有关程序功能的更多信息。可以与-d和一起使用-e。使用-v多次(-vv-vvv)可获得更多输出。

    • --version-V

      显示版本信息并退出。

    • --wait-w

      如果表已锁定,则不要终止于错误,而要等到表被解锁后再继续。如果在禁用外部锁定的情况下运行mysqld,则只能由另一个myisamchk命令锁定该表。

    您还可以使用语法设置以下变量:--var_name=value

    变量默认值
    decode_bits9
    ft_max_word_len版本相关
    ft_min_word_len4
    ft_stopword_file内置列表
    key_buffer_size523264
    myisam_block_size1024
    myisam_sort_key_blocks16
    read_buffer_size262136
    sort_buffer_size2097144
    sort_key_blocks16
    stats_methodnulls_unequal
    write_buffer_size262136

    可以使用myisamchk --help检查可能的myisamchk变量及其默认值:

    myisam_sort_buffer_size通过对键进行排序来修复键时使用,这是使用时的正常情况--recoversort_buffer_size是已弃用的同义词myisam_sort_buffer_size

    key_buffer_size当您使用来检查表时,--extend-check或者通过将键逐行插入表中来修复键时(例如进行普通插入时),可以使用。在以下情况下,将通过密钥缓冲区进行修复:

    • 您使用--safe-recover
    • 对密钥进行排序所需的临时文件将比直接创建密钥文件时大两倍。这是常有的事,当你有大的键值CHARVARCHARTEXT列,因为排序操作需要存储完整的键值因为它的收益。如果您有很多临时空间,并且可以通过排序强制myisamchk进行修复,则可以使用该--sort-recover选项。

    与使用排序相比,通过键缓冲区进行修复所需的磁盘空间要少得多,但速度也要慢得多。

    如果要更快地修复,请将key_buffer_sizemyisam_sort_buffer_size变量设置为可用内存的25%左右。您可以将两个变量都设置为较大的值,因为一次只能使用其中一个。

    myisam_block_size是用于索引块的大小。

    stats_method给定选项NULL时,影响如何处理值以进行索引统计信息收集--analyze。它的作用类似于myisam_stats_method系统变量。欲了解更多信息,请参阅的描述myisam_stats_method在“服务器系统变量”和第8.3.8,“InnoDB和MyISAM索引统计集合”。

    ft_min_word_lenft_max_word_len指出表格FULLTEXT索引的最小和最大字长MyISAMft_stopword_file命名停用词文件。这些需要在以下情况下设置。

    如果使用myisamchk来执行修改表索引的操作(例如修复或分析),则FULLTEXT除非使用其他特殊说明,否则将使用最小和最大字长以及停用词文件的默认全文参数值来重建索引。这可能会导致查询失败。

    发生问题是因为这些参数仅由服务器知道。它们不存储在MyISAM索引文件中。为了避免这个问题,如果你已经修改了最小或最大字长或服务器停止字文件,指定相同ft_min_word_lenft_max_word_lenft_stopword_filemyisamchk的,你使用的mysqld。例如,如果将最小字长设置为3,则可以使用myisamchk修复表,如下所示:

    shell>myisamchk --recover --ft_min_word_len=3 tbl_name.MYI
    

    为确保myisamchk和服务器对全文参数使用相同的值,可以将每个参数都放在选项文件的[mysqld][myisamchk]部分中:

    [mysqld]
    ft_min_word_len=3
    
    [myisamchk]
    ft_min_word_len=3
    

    到使用替代myisamchk的是使用REPAIR TABLEANALYZE TABLEOPTIMIZE TABLE,或ALTER TABLE。这些语句由服务器执行,服务器知道要使用的适当的全文参数值。

    myisamchk检查选项

    myisamchk支持以下用于表检查操作的选项:

    • --check-c

      检查表中的错误。如果未指定显式选择操作类型的选项,则这是默认操作。

    • --check-only-changed-C

      仅检查自上次检查以来已更改的表。

    • --extend-check-e

      非常彻底地检查桌子。如果表具有许多索引,这将非常慢。此选项仅应在极端情况下使用。通常,myisamchkmyisamchk --medium-check应该能够确定表中是否存在任何错误。

      如果您正在使用--extend-check并且有足够的内存,请将key_buffer_size变量设置为较大的值将有助于修复操作更快地运行。

      另请参阅表修复选项下对此选项的描述。

      有关输出格式的说明,请参见“使用myisamchk获取表信息”。

    • --fast-F

      仅检查尚未正确关闭的表。

    • --force-f

      如果myisamchk在表中发现任何错误,则自动执行修复操作。修复类型与--recover-r选项指定的修复类型相同。

    • --information-i

      打印有关已检查表的信息统计信息。

    • --medium-check-m

      进行比--extend-check操作更快的检查。这样只会发现所有错误的99.99%,在大多数情况下应该足够了。

    • --read-only-T

      请勿将表格标记为已选中。如果您使用myisamchk来检查某个不使用锁定的其他应用程序正在使用的表(例如在禁用外部锁定的情况下运行mysqld时),则此功能很有用。

    • --update-state-U

      将信息存储在.MYI文件中以指示何时检查了表以及表是否崩溃。应该--check-only-changed使用此选项以充分利用该选项,但是如果mysqld服务器正在使用该表并且您在禁用外部锁定的情况下运行该表,则不应使用此选项。

    myisamchk修复选项

    myisamchk支持以下用于表修复操作的选项(当提供诸如--recover或的选项时执行的操作--safe-recover):

    • --backup-B

      .MYD文件备份为file_name-time.BAK

    • --character-sets-dir=dir_name

      字符集的安装目录。请参见“字符集配置”。

    • --correct-checksum

      更正表的校验和信息。

    • --data-file-length=len-D len

      数据文件的最大长度(当“ full ”时重新创建数据文件时)。

    • --extend-check-e

      进行修复,尝试从数据文件中恢复所有可能的行。通常,这还会发现很多垃圾行。除非您绝望,否则不要使用此选项。

      另请参阅表检查选项下对此选项的描述。

      有关输出格式的说明,请参见“使用myisamchk获取表信息”。

    • --force-f

      覆盖旧的中间文件(名称如的文件tbl_name.TMD)而不是中止。

    • --keys-used=val-k val

      对于myisamchk,选项值是一个位值,指示要更新的索引。选项值的每个二进制位对应于一个表索引,其中第一个索引为位0。选项值0禁用对所有索引的更新,该更新可用于更快地插入。可以使用myisamchk -r重新激活已停用的索引。

    • --no-symlinks-l

      不要遵循符号链接。通常,myisamchk修复符号链接指向的表。从MySQL 4.0开始,此选项不存在,因为从4.0开始的版本不会在修复操作期间删除符号链接。

    • --max-record-length=len

      如果myisamchk无法分配内存来容纳行,请跳过大于给定长度的行。

    • --parallel-recover-p

      使用同样的技术-r-n,而是创建并行的所有按键,使用不同的线程。这是Beta质量代码。使用风险自负!

    • --quick-q

      通过仅修改索引文件而不是数据文件来实现更快的修复。您可以指定两次该选项,以在密钥重复的情况下强制myisamchk修改原始数据文件。

    • --recover-r

      进行修复可以解决几乎所有问题,但唯一键不是唯一的(这是MyISAM表中极不可能发生的错误)。如果要恢复表,可以选择先尝试。--safe-recover仅当myisamchk报告无法使用表恢复表时,才应尝试--recover。(在极少数情况下--recover失败,数据文件将保持不变。)

      如果您有很多内存,则应增加的值myisam_sort_buffer_size

    • --safe-recover-o

      使用旧的恢复方法进行修复,该方法将按顺序读取所有行,并根据找到的行更新所有索引树。这比慢了一个数量级--recover,但是可以处理一些非常不可能的情况--recover。这种恢复方法还比使用更少的磁盘空间--recover。通常,您应该首先使用进行修复--recover,然后--safe-recover仅在--recover失败时进行修复。

      如果您有很多内存,则应增加的值key_buffer_size

    • --set-collation=name

      指定用于排序表索引的排序规则。字符集名称由排序规则名称的第一部分隐含。

    • --sort-recover-n

      强制myisamchk使用排序来解析密钥,即使临时文件很大。

    • --tmpdir=dir_name-t dir_name

      用于存储临时文件的目录的路径。如果未设置,myisamchk将使用TMPDIR环境变量的值。--tmpdir可以设置为目录路径列表,这些目录路径以循环方式连续用于创建临时文件。目录名称之间的分隔符是:Unix上的冒号()和;Windows上的分号()。

    • --unpack-u

      打开装有myisampack的桌子的包装。

    其他myisamchk选项

    myisamchk支持对表检查和修复以外的其他操作选项:

    • --analyze-

      分析键值的分布。通过使联接优化器更好地选择联接表的顺序和应使用的索引,可以提高联接性能。要获取有关密钥分发的信息,请使用myisamchk --description --verbosetbl_name命令或语句。SHOW INDEX FROM tbl_name

    • --block-search=offset-b offset

      查找给定偏移量的块所属的记录。

    • --description-d

      打印有关表的一些描述性信息。--verbose一次或两次指定选项会产生其他信息。请参见“使用myisamchk获取表信息”。

    • --set-auto-increment[=value]-A[value]

      强制AUTO_INCREMENT为新记录编号从给定值开始(或更高,如果存在的记录具有AUTO_INCREMENT如此大的值)。如果value未指定,则AUTO_INCREMENT新记录的编号以表中当前的最大值加1开头。

    • --sort-index-S

      按从高到低的顺序对索引树块进行排序。这样可以优化查找,并使使用索引的表扫描更快。

    • --sort-records=N-R N

      根据特定索引对记录进行排序。这使您的数据更加本地化,并可能加快基于范围的索引SELECTORDER BY使用该索引的操作。(第一次使用此选项对表进行排序时,它可能会非常慢。)要确定表的索引号,请使用SHOW INDEX,以myisamchk看到它们的顺序显示表的索引。索引从1开始编号。

      如果键没有打包(PACK_KEYS=0),则它们具有相同的长度,因此,当myisamchk对记录进行排序和移动时,它只会覆盖索引中的记录偏移量。如果键已打包(PACK_KEYS=1),则myisamchk必须先将键块拆包,然后重新创建索引并再次打包键块。(在这种情况下,重新创建索引比更新每个索引的偏移量要快。)

    使用myisamchk获取表信息

    要获取有关MyISAM表的描述或统计信息,请使用此处显示的命令。这些命令的输出将在本节稍后说明。

    • myisamchk -d tbl_name

      以“ describe mode ”运行myisamchk来生成表的描述。如果在禁用外部锁定的情况下启动MySQL服务器,myisamchk可能会报告表在运行时更新的错误。但是,由于myisamchk不会以描述方式更改表,因此没有破坏数据的风险。

    • myisamchk -dv tbl_name

      添加将以详细模式-v运行myisamchk,以便产生有关该表的更多信息。-v第二次添加会产生更多信息。

    • myisamchk -eis tbl_name

      仅显示表格中最重要的信息。此操作很慢,因为它必须读取整个表。

    • myisamchk -eiv tbl_name

      就像-eis,但是告诉您正在做什么。

    所述tbl_name参数可以是任一的名称MyISAM表或它的索引文件的名称,如在“myisamchk的- MyISAM表的维护工具”。tbl_name可以给出多个参数。

    假设一个名为表person的结构如下。(MAX_ROWS包括table选项,以便在稍后显示的myisamchk的示例输出中,某些值更小并且更容易适应输出格式。)

    CREATE TABLE person
    (
    id INT NOT NULL AUTO_INCREMENT,
    last_name VARCHAR(20) NOT NULL,
    first_name VARCHAR(20) NOT NULL,
    birth DATE,
    death DATE,
    PRIMARY KEY (id),
    INDEX (last_name, first_name),
    INDEX (birth)
    ) MAX_ROWS = 1000000 ENGINE=MYISAM;
    

    还假设该表具有以下数据和索引文件大小:

    -rw-rw----  1 mysql  mysql  9347072 Aug 19 11:47 person.MYD
    -rw-rw----  1 mysql  mysql  6066176 Aug 19 11:47 person.MYI
    

    myisamchk -dvv输出示例:

    MyISAM file:         person
    Record format:       Packed
    Character set:       utf8mb4_0900_ai_ci (255)
    File-version:        1
    Creation time:       2017-03-30 21:21:30
    Status:              checked,analyzed,optimized keys,sorted index pages
    Auto increment key:              1  Last value:                306688
    Data records:               306688  Deleted blocks:                 0
    Datafile parts:             306688  Deleted data:                   0
    Datafile pointer (bytes):        4  Keyfile pointer (bytes):        3
    Datafile length:           9347072  Keyfile length:           6066176
    Max datafile length:    4294967294  Max keyfile length:   17179868159
    Recordlength:                   54
    
    table description:
    Key Start Len Index   Type                     Rec/key         Root  Blocksize
    1   2     4   unique  long                           1                    1024
    2   6     80  multip. varchar prefix                 0                    1024
    87    80          varchar                        0
    3   168   3   multip. uint24 NULL                    0                    1024
    
    Field Start Length Nullpos Nullbit Type
    1     1     1                                                         
    2     2     4                      no zeros                           
    3     6     81                     varchar                            
    4     87    81                     varchar                            
    5     168   3      1       1       no zeros                           
    6     171   3      1       2       no zeros
    

    myisamchk产生的信息类型的说明在此处给出。“密钥文件”是指索引文件。“记录”和“行”同义,“字段”和“列”同义。”

    表描述的初始部分包含以下值:

    • MyISAM file

      MyISAM(索引)文件的名称。

    • Record format

      用于存储表行的格式。前面的示例使用Fixed length。其他可能的值为CompressedPacked。(Packed对应于SHOW TABLE STATUS报告为Dynamic。)

    • Chararacter set

      表的默认字符集。

    • File-version

      MyISAM格式版本。总是1。

    • Creation time

      创建数据文件的时间。

    • Recover time

      上次重建索引/数据文件的时间。

    • Status

      表状态标志。可能的值是crashedopenchanged nalyzedoptimized keys,和sorted index pages

    • Auto increment keyLast value

      与表的AUTO_INCREMENT列关联的键号,以及该列的最新生成的值。如果没有这样的列,则不会出现这些字段。

    • Data records

      表中的行数。

    • Deleted blocks

      多少个已删除的块仍具有保留空间。您可以优化表以最小化此空间。请参见“ MyISAM表优化”。

    • Datafile parts

      对于动态行格式,这表示有多少个数据块。对于没有零散行的优化表,这与相同Data records

    • Deleted dat

      有多少字节的未回收删除数据。您可以优化表以最小化此空间。请参见“ MyISAM表优化”。

    • Datafile pointer

      数据文件指针的大小,以字节为单位。通常为2、3、4或5个字节。大多数表使用2个字节进行管理,但这尚不能通过MySQL进行控制。对于固定表,这是行地址。对于动态表,这是一个字节地址。

    • Keyfile pointer

      索引文件指针的大小,以字节为单位。通常为1、2或3个字节。大多数表管理2个字节,但这是MySQL自动计算的。它始终是一个块地址。

    • Max datafile length

      表数据文件可以变为多长时间(以字节为单位)。

    • Max keyfile length

      表索引文件可以变成多长时间(以字节为单位)。

    • Recordlength

      每行占用多少空间,以字节为单位。

    table description输出的一部分包括表中所有键的列表。对于每个键,myisamchk显示一些底层信息:

    • Key

      此项的号码。仅在键的第一列中显示此值。如果缺少此值,则该行对应于多列键的第二列或更高列。对于示例中显示的表,table description第二个索引有两行。这表明它是一个由两部分组成的多部分索引。

    • Start

      索引的该部分在行中的何处开始。

    • Len

      这部分索引有多长时间。对于压缩数字,该数字应始终为列的全长。对于字符串,它可能短于索引列的全长,因为您可以索引字符串列的前缀。多部分键的总长度是Len所有键部分的值之和。

    • Index

      键值是否可以在索引中多次存在。可能的值是uniquemultip.(多个)。

    • Type

      索引的此部分具有什么数据类型。这是一个MyISAM与可能的值的数据类型packedstrippedempty

    • Root

      根索引块的地址。

    • Blocksize

      每个索引块的大小。默认情况下,它是1024,但是当从源构建MySQL时,该值可以在编译时更改。

    • Rec/key

      这是优化器使用的统计值。它告诉该索引每个值有多少行。唯一索引的值始终为1。可以使用myisamchk -将表加载(或大大更改)后进行更新。如果根本不更新,则默认值为30。

    输出的最后一部分提供有关每一列的信息:

    • Field

      列号。

    • Start

      表格行中列的字节位置。

    • Length

      列的长度(以字节为单位)。

    • NullposNullbit

      对于可以为的列NULLMyISAMNULL值作为标志存储在字节中。取决于有多少个可空列,可以有一个或多个字节用于此目的。的NullposNullbit值时,如果非空,指示哪些字节和位包含标志,指示该列是否为NULL

      NULL字段1的行中显示了用于存储标志的位置和字节数。这就是为什么表只有六Field列,却有六行的原因person

    • Type

      数据类型。该值可以包含以下任何描述符:

      • constant

        所有行具有相同的值。

      • no endspace

        不要存储末端空间。

      • no endspace, not_always

        不要存储所有空格,也不要对所有值进行空格压缩。

      • no endspace, no empty

        不要存储末端空间。不要存储空值。

      • table-lookup

        该列已转换为ENUM

      • zerofill(N)

        N值中的最高有效字节始终为0,并且不存储。

      • no zeros

        不要存储零。

      • lways zero

        零值使用一位存储。

    • Huff tree

      与列关联的霍夫曼树的编号。

    • Bits

      霍夫曼树中使用的位数。

    Huff treeBits如果表已经被压缩与显示领域的myisampack。有关此信息的示例,请参见“myisampack-生成压缩的只读MyISAM表”。

    myisamchk -eiv输出示例:

    Checking MyISAM file: person
    Data records:  306688   Deleted blocks:       0
    - check file-size
    - check record delete-chain
    No recordlinks
    - check key delete-chain
    block_size 1024:
    - check index reference
    - check data record references index: 1
    Key:  1:  Keyblocks used:  98%  Packed:    0%  Max levels:  3
    - check data record references index: 2
    Key:  2:  Keyblocks used:  99%  Packed:   97%  Max levels:  3
    - check data record references index: 3
    Key:  3:  Keyblocks used:  98%  Packed:  -14%  Max levels:  3
    Total:    Keyblocks used:  98%  Packed:   89%
    
    - check records and index references*** LOTS OF ROW NUMBERS DELETED ***
    
    Records:            306688  M.recordlength:       25  Packed:            83%
    Recordspace used:       97% Empty space:           2% Blocks/Record:   1.00
    Record blocks:      306688  Delete blocks:         0
    Record data:       7934464  Deleted data:          0
    Lost space:         256512  Linkdata:        1156096
    
    User time 43.08, System time 1.68
    Maximum resident set size 0, Integral resident set size 0
    Non-physical pagefaults 0, Physical pagefaults 0, Swaps 0
    Blocks in 0 out 7, Messages in 0 out 0, Signals 0
    Voluntary context switches 0, Involuntary context switches 0
    Maximum memory usage: 1046926 bytes (1023k)
    

    myisamchk -eiv输出包括以下信息:

    • Data records

      表中的行数。

    • Deleted blocks

      多少个已删除的块仍具有保留空间。您可以优化表以最小化此空间。请参见“ MyISAM表优化”。

    • Key

      密钥号。

    • Keyblocks used

      使用了多少百分比的键块。当刚刚用myisamchk重组表时,该值非常高(非常接近理论最大值)。

    • Packed

      MySQL尝试打包具有通用后缀的键值。这只能用于CHARVARCHAR列上的索引。对于具有最左部分相似的长索引字符串,这可以大大减少使用的空间。在前面的示例中,第二个密钥的长度为40个字节,并且空间减少了97%。

    • Max levels

      此键的B树有多深。具有长键值的大表将获得较高的值。

    • Records

      表中有多少行。

    • M.recordlength

      平均行长。这是具有固定长度行的表的确切行长度,因为所有行的长度都相同。

    • Packed

      MySQL从字符串末尾去除空格。该Packed值表示通过执行此操作所节省的百分比。

    • Recordspace used

      使用了多少百分比的数据文件。

    • Empty space

      未使用数据文件的百分比。

    • Blocks/Record

      每行的平均块数(即,一个分散的行由多少个链接组成)。对于固定格式的表,该值始终为1.0。该值应保持尽可能接近1.0。如果太大,可以重新组织表。请参见“ MyISAM表优化”。

    • Recordblocks

      使用了多少个块(链接)。对于固定格式的表,这与行数相同。

    • Deleteblocks

      删除了多少个块(链接)。

    • Recorddat

      数据文件中使用了多少字节。

    • Deleted dat

      删除(未使用)数据文件中的多少个字节。

    • Lost space

      如果将一行更新为较短的长度,则会丢失一些空间。这是所有此类损失的总和,以字节为单位。

    • Linkdat

      使用动态表格式时,行片段与指针链接(每个指针4到7个字节)。Linkdat 是所有此类指针使用的存储量的总和。

    myisamchk内存使用情况

    运行myisamchk时,内存分配很重要。myisamchk使用的内存不超过其与内存相关的变量所设置的数量。如果要在非常大的表上使用myisamchk,则应首先确定要使用多少内存。默认设置是仅使用约3MB进行修复。通过使用较大的值,可以使myisamchk更快地运行。例如,如果您有超过512MB的可用RAM,则可以使用这些选项(除了可能指定的其他选项之外):

    shell>myisamchk --myisam_sort_buffer_size=256M \
    --key_buffer_size=512M \
    --read_buffer_size=64M \
    --write_buffer_size=64M ...
    

    --myisam_sort_buffer_size=16M对于大多数情况,使用可能就足够了。

    请注意,myisamchk在中使用临时文件TMPDIR。如果TMPDIR指向内存文件系统,则很容易发生内存不足错误。如果发生这种情况,请运行带有选项的myisamchk,以指定位于具有更多空间的文件系统上的目录。--tmpdir=dir_name

    执行修复操作时,myisamchk还需要大量磁盘空间:

    • 数据文件(原始文件和副本)的大小增加一倍。如果使用进行维修,则不需要此空间--quick。在这种情况下,仅重新创建索引文件。该空间必须与原始数据文件在同一文件系统上可用,因为副本是在与原始数据相同的目录中创建的。
    • 用于替换旧索引文件的新索引文件的空间。在修复操作开始时,旧的索引文件将被截断,因此您通常会忽略此空间。此空间必须与原始数据文件在同一文件系统上可用。
    • 当使用--recover或时--sort-recover(而不是使用时--safe-recover),您需要磁盘上的空间用于排序。该空间在临时目录(由TMPDIR或指定)中分配。以下公式得出所需的空间量:--tmpdir=dir_name

      (largest_key 	+ row_pointer_length) * number_of_rows * 2
      

      您可以row_pointer_length使用myisamchk -dv tbl_name检查密钥和密钥的长度(请参见“使用myisamchk获取表信息”)。该row_pointer_lengthnumber_of_rows值是Datafile pointerData records值在表中说明。要确定该largest_key值,请检查Key表描述中的行。该Len列指示每个关键部分的字节数。对于多列索引,键大小是Len所有键部分的值之和。

    如果在修复过程中磁盘空间有问题,可以尝试使用--safe-recover代替--recover