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 pointer
和Data records
值。要确定 largest_key
*值,请检查 table 描述中的Key
行。 Len
列指示每个关键部分的字节数。对于多列索引,键大小是所有键部分的Len
值的总和。
如果在修复过程中磁盘空间有问题,可以尝试--safe-recover而不是--recover。