本節說明如何檢查和處理 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 之前備份表格。