如果用--skip-external-locking運行mysqld(在某些系統上為 默認設置,例如Linux),當mysqld使用某個表時,你不能可靠地使用myisamchk來檢查相同的表。當你運行myisamchk時如果可以確保沒有人在通過mysqld訪問表,在開始檢查表前,你只需要運行mysqladmin flush-tables。如果你不能保證,則你檢查表時你必須停止mysqld。如果mysqld更新表時運行myisamchk,你可能會獲得表被破壞的警告,即使事實并非如此。
如果不使用--skip-external-locking,可以隨時使用myisamchk來檢查表。當檢查表時,所有嘗試更新表的客戶端將等待,直到myisamchk準備好可以繼續。
如果使用myisamchk來修復或優化表,必須確保mysqld服務器沒有在使用該表(如果你正使用--skip-external-locking選項也適用)。如果不關閉mysqld,在運行myisamchk之前至少應執行mysqladmin flush-tables。如果服務器和myisamchk同時訪問表,表可能會被破壞。
本節描述如何檢查和處理MySQL數據庫中的數據破壞。如果表經常被破壞,你應盡力找到原因。參見A.4.2節,“如果MySQL依然崩潰,應作些什么”。
關于MyISAM表怎樣會被破壞的解釋,參見15.1.4節,“MyISAM表方面的問題”。
在執行崩潰恢復時,理解在一個數據庫中的每一個MyISAM表tbl_name對應的在數據庫目錄中的3個文件是很重要的:
文件 |
目的 |
tbl_name.frm |
定義(格式)文件 |
tbl_name.MYD |
數據文件 |
tbl_name.MYI |
索引文件 |
這3類文件的每一類都可能遭受不同形式的損壞,但是問題最常發生在數據文件和索引文件。
myisamchk通過一行一行地創建一個“.MYD”數據文件的副本來工作,它通過刪除舊的“.MYD 文件并且重命名新文件到原來的文件名結束修復階段。如果你使用--quick,myisamchk不創建一個臨時“.MYD”文件,只是假定“.MYD”文件是正確的并且僅創建一個新的索引文件,不接觸“.MYD”文件,這是安全的,因為myisamchk自動檢測“.MYD”文件是否損壞并且在這種情況下,放棄修復。你也可以給myisamchk兩個--quick選項。在這種情況下,myisamchk不會在一些錯誤上(象重復鍵)放棄,相反試圖通過修改“.MYD”文件解決它們。通常,只有在太少的空閑磁盤空間上實施正常修復,使用兩個--quick選項時才有用。在這種情況下,你至少應該在運行myisamchk前做進行備份。