运行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
指向内存文件系统,很容易发生内存不足错误。如果发生这种情况,请运行myisamchk并
指定一个位于具有更多空间的文件系统上的目录。
--tmpdir=
dir_name
在执行修复操作时,myisamchk 也需要大量的磁盘空间:
数据文件大小的两倍(原始文件和副本)。如果您使用 ; 进行修复,则不需要此空间
--quick
;在这种情况下,仅重新创建索引文件。此空间必须在与原始数据文件相同的文件系统上可用,因为副本是在与原始文件相同的目录中创建的。用于替换旧索引文件的新索引文件的空间。旧索引文件在修复操作开始时被截断,所以您通常会忽略这个空间。此空间必须在与原始数据文件相同的文件系统上可用。
使用
--recover
or--sort-recover
(而不是使用--safe-recover
)时,您需要磁盘空间进行排序。此空间分配在临时目录中(由TMPDIR
或 指定)。以下公式得出所需的空间量:--tmpdir=
dir_name
(largest_key + row_pointer_length) * number_of_rows * 2
row_pointer_length
您可以使用 myisamchk -dvtbl_name
检查键和的长度 (请参阅 第 4.6.3.5 节,“使用 myisamchk 获取表信息”)。row_pointer_length
和number_of_rows
值就是表说明中的 和Datafile pointer
值Data records
。要确定该largest_key
值,请检查Key
表描述中的行。该Len
列指示每个密钥部分的字节数。对于多列索引,键大小是Len
所有键部分的值的总和。
如果您在修复过程中遇到磁盘空间问题,您可以尝试
--safe-recover
代替
--recover
.