Documentation Home

4.6.4.6 myisamchk 内存使用

运行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可能就足够了。

请注意myisamchkTMPDIR. 如果TMPDIR 指向内存文件系统,很容易发生内存不足错误。如果发生这种情况,请运行myisamchk并 指定一个位于具有更多空间的文件系统上的目录。 --tmpdir=dir_name

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

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

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

  • 使用--recoveror --sort-recover(而不是使用 --safe-recover)时,您需要磁盘空间进行排序。此空间分配在临时目录中(由TMPDIR 或 指定)。以下公式得出所需的空间量: --tmpdir=dir_name

    (largest_key + row_pointer_length) * number_of_rows * 2

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

如果您在修复过程中遇到磁盘空间问题,您可以尝试 --safe-recover代替 --recover.