Myisamchk 内存使用
运行myisamchk时,内存分配很重要。myisamchk使用的内存不超过其内存相关变量设置的值。如果你要在非常大的表上使用myisamchk,你应该首先决定你想要它使用多少内存。默认情况下,只使用大约3MB进行修复。通过使用更大的值,你可以让myisamchk运行得更快。例如,如果你有超过512MB的可用RAM,你可以使用以下选项(除了你可能需要指定的任何其他选项):
myisamchk --myisam_sort_buffer_size=256M \n --key_buffer_size=512M \n --read_buffer_size=64M \n --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。row_pointer_length和number_of_rows值是表描述中的Datafile指针和Data记录值。要确定largest_key值,请检查表描述中的Key行。Len列表示每个键部分的字节数。对于多列索引,键大小是所有键部分Len值的总和。
如果在修复过程中遇到磁盘空间问题,可以尝试使用–safe-recover而不是–recover。