当您运行 myisamchk 时,内存分配非常重要。 myisamchk 使用的内存不超过其与内存相关的变量设置的值。如果您要在非常大的表上使用 myisamchk,则应首先确定您希望它使用多少内存。默认值是仅使用大约 3MB 来执行修复。通过使用更大的值,您可以使 myisamchk 运行得更快。例如,如果您有超过 512MB 的可用 RAM,则可以使用以下选项(除了您可能指定的任何其他选项):
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=
选项运行 myisamchk 来指定位于具有更多空间的文件系统上的目录。dir_name
在执行修复操作时, 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
(请参见 第 6.6.4.5 节,“使用 myisamchk 获取表信息”)。row_pointer_length
和number_of_rows
值是表描述中的数据文件指针
和数据记录
值。要确定largest_key
值,请检查表描述中的键
行。Len
列指示每个键部分的字节数。对于多列索引,键的大小是所有键部分的Len
值的总和。
如果您在修复过程中遇到磁盘空间问题,可以尝试使用 --safe-recover
而不是 --recover
。