4.6.3.6 myisamchk 内存使用情况

运行myisamchk时,内存分配很重要。 myisamchk使用的内存不超过其与内存相关的变量所设置的数量。如果要在非常大的 table 上使用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指向内存文件系统,则很容易发生内存不足错误。如果发生这种情况,请使用--tmpdir=dir_name选项运行myisamchk以指定位于文件系统上具有更多空间的目录。

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

  • 数据文件(原始文件和副本)的大小增加一倍。如果使用--quick进行维修,则不需要此空间;在这种情况下,仅重新创建索引文件。 此空间必须与原始数据文件在同一文件系统上可用,因为副本是在与原始数据相同的目录中创建的。

  • 用于替换旧索引文件的新索引文件的空间。在修复操作开始时,旧的索引文件将被截断,因此您通常会忽略此空间。该空间必须与原始数据文件在同一文件系统上可用。

  • 在使用--recover--sort-recover时(但在使用--safe-recover时则不是),您需要磁盘空间用于排序。该空间在临时目录(由TMPDIR--tmpdir=dir_name指定)中分配。下面的公式得出所需的空间量:

(largest_key + row_pointer_length) * number_of_rows * 2

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

如果在修复过程中磁盘空间有问题,可以尝试--safe-recover而不是--recover