當您執行 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
值是資料表描述中的Datafile pointer
和Data records
值。若要判斷largest_key
值,請檢查資料表描述中的Key
行。Len
欄位會指示每個索引鍵部分的位元組數。對於多欄索引,索引鍵大小是所有索引鍵部分的Len
值總和。
如果您在修復期間遇到磁碟空間問題,您可以嘗試使用 --safe-recover
而不是 --recover
。