本節說明如何檢查及處理 MySQL 資料庫中的資料損毀。如果您的表格經常損毀,您應該嘗試找出原因。請參閱第 B.3.3.3 節,「如果 MySQL 持續崩潰該怎麼辦」。
如需了解 MyISAM
表格可能如何損毀的說明,請參閱第 18.2.4 節,「MyISAM 表格問題」。
如果您在外部鎖定停用的情況下 (預設值) 執行 mysqld,當 mysqld 使用相同表格時,您就無法可靠地使用 myisamchk 來檢查表格。如果您可以確定在您執行 myisamchk 時,沒有人可以使用 mysqld 來存取表格,您只需要在開始檢查表格之前執行 mysqladmin flush-tables 即可。如果您無法保證這一點,您必須在檢查表格時停止 mysqld。如果您執行 myisamchk 來檢查 mysqld 同時更新的表格,即使表格沒有損毀,您也可能會收到表格損毀的警告。
如果伺服器在啟用外部鎖定的情況下執行,您可以隨時使用 myisamchk 來檢查表格。在這種情況下,如果伺服器嘗試更新 myisamchk 正在使用的表格,伺服器會等待 myisamchk 完成後才繼續。
如果您使用 myisamchk 來修復或最佳化表格,您必須始終確保 mysqld 伺服器沒有在使用該表格 (這也適用於外部鎖定停用的情況)。如果您沒有停止 mysqld,您至少應該在執行 myisamchk 之前執行 mysqladmin flush-tables。如果伺服器與 myisamchk 同時存取表格,您的表格可能會損毀。
在執行崩潰還原時,務必了解資料庫中的每個 MyISAM
表格 tbl_name
對應到資料庫目錄中以下表格顯示的三個檔案。
檔案 | 目的 |
---|---|
|
資料檔 |
|
索引檔 |
這三種檔案類型中的每種都可能以各種方式損毀,但問題最常發生在資料檔和索引檔中。
myisamchk 的運作方式是逐行建立 .MYD
資料檔的副本。它會移除舊的 .MYD
檔案,並將新檔案重新命名為原始檔案名稱,來結束修復階段。如果您使用 --quick
,myisamchk 不會建立暫時的 .MYD
檔案,而是假設 .MYD
檔案正確,並且只產生新的索引檔,而不觸碰 .MYD
檔案。這很安全,因為 myisamchk 會自動偵測 .MYD
檔案是否損毀,如果損毀則中止修復。您也可以指定 --quick
選項兩次來執行 myisamchk。在這種情況下,myisamchk 不會中止一些錯誤 (例如重複索引鍵錯誤),而是會嘗試透過修改 .MYD
檔案來解決這些錯誤。通常,只有當您的可用磁碟空間太少而無法執行正常修復時,使用兩個 --quick
選項才有用。在這種情況下,您至少應該在執行 myisamchk 之前備份表格。