运行myisamchk时,内存分配很重要 。myisamchk使用的内存不超过其与内存相关的变量所设置的数量。如果要在非常大的表上使用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 指向内存文件系统,则很容易发生内存不足错误。如果发生这种情况,请运行带有 选项的myisamchk, 以指定位于具有更多空间的文件系统上的目录。 --tmpdir=*dir_name*
执行修复操作时,myisamchk 还需要大量磁盘空间:
-
数据文件(原始文件和副本)的大小增加一倍。如果使用进行维修,则不需要此空间
--quick。在这种情况下,仅重新创建索引文件。该空间必须与原始数据文件位于同一文件系统上,因为副本是在与原始数据相同的目录中创建的。 -
用于替换旧索引文件的新索引文件的空间。在修复操作开始时,旧的索引文件将被截断,因此您通常会忽略此空间。该空间必须与原始数据文件在同一文件系统上可用。
-
在使用
--recover或时--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_length*和 *number_of_rows值是Datafile pointer和Data records值在表中说明。要确定该largest_key*值,请检查Key表描述中的行。该Len列指示每个关键部分的字节数。对于多列索引,键大小是Len所有键部分的值之和。
如果在修复过程中磁盘空间有问题,可以尝试使用 --safe-recover代替 --recover。




