2016年2月3日 星期三

MySQL 資料表修復方法 – 使用 myisamchk 工具

轉載自落腳齋 http://www.wuclass.com/blog/mysql-tools-myisamchk/

今天 server 裡原先 run 得好好的網路相簿軟體 Coppermine Photo Gallery 突然出了問題,更怪異的是只有超簡短錯誤訊息『Fatal error:』,認真查了一下,原來是資料庫的 cpg_sessions 資料表出現了編號 145 的 crash 問題,得修復才行。
cpg error message screenshot
上網 google 了一下,在動態網站製作指南網站上找到教學文件,依其說明,順利使用 myisamchk 命令修復資料表。怕日後找不到此網頁,所以將教學借貼於此。



修復方式

  1. stop mysql
  2. 找到 mysql 安裝目錄的 bin/myisamchk 工具,在命令行中輸入
    myisamchk -c -r /mysql 資料庫存放路徑/db name/db_table_name.MYI
  3. myisamchk 工具會修復資料表的索引
  4. start mysql

問題分析

錯誤產生原因,有網友說是頻繁查詢和更新dede_archives表造成的索引錯誤,因為我的頁面沒有靜態生成,而是動態頁面,因此比較同意 這種說法。還有說法為是MYSQL資料庫因為某種原因而受到了損壞,如:資料庫伺服器突發性的斷電、在提在資料庫表提供服務時對表的原文件進行某種操作都 有可能導致MYSQL資料庫表被損壞而無法讀取資料。總之就是因為某些不可測的問題造成表的損壞。

問題解決辦法

當試圖修復一個被破壞的資料表問題時,有三種修復類型。如果你得到一個錯誤資訊指出一個暫存檔案不能建立,刪除資訊所指出的檔並再試一次:這通常是上一次修復操作遺留下來的。
這三種修復方法如下所示:
% myisamchk –recover –quick /path/to/tblName
% myisamchk –recover /path/to/tblName
% myisamchk –safe-recover /path/to/tblName
第一種是最快的,用來修復最普通的問題;而最後一種是最慢的,用來修復一些其他方法所不能修復的問題。

檢查和修復MySQL資料檔案

如果上面的方法無法修復一個被損壞的表,在你放棄之前,你還可以試試下面這兩個技巧:
如果你懷疑資料表的索引檔(*.MYI)發生了不可修復的錯誤,甚至是丟失了這個檔,你可以使用資料檔案(*.MYD)和資料格式檔(*.frm)重新產生。首先製作一個資料檔案(tblName.MYD)的拷貝,重新啟動 MySQL 服務,使用下面的命令刪除表的內容:
mysql> DELETE FROM tblName;
在刪除資料表內容的同時,會建立一個新的索引檔。退出登錄並重新關閉 MySQL 服務,然後用你剛才保存的資料檔案(tblName.MYD)覆蓋新的(空)資料檔案,最後使用 myisamchk 執行標準的修復(上面的第二種方法),根據資料表的資料內容和資料表的格式檔重新產生索引資料。
如果資料表的格式檔(tblName.frm)丟失了或者是發生了不可修復的錯誤,但是你清楚如何使用相對應的 CREATE TABLE 語句來重新產生這個資料表,則可以重新建立一個新的 .frm 檔並和資料檔案和索引檔(如果索引檔有問題,使用上面的方法重建一個新的)一 起使用。首先製作一個資料和索引檔的拷貝,然後刪除原來的檔(刪除資料目錄下有關這個表的所有記錄)。
啟動 MySQL 服務並使用當初的 CREATE TABLE 檔建立一個新的資料表。新的 .frm 檔應該可以正常工作了,但是最好還是執行一下標準的修復(上面的第二種方法)。

myisamchk工具介紹

調用myisamchk的方法:
shell> myisamchk [options] tbl_name …
options 指定 myisamchk 的動作,還可以通過調用 myisamchk –help 得到選項列表。
tbl_name是你想要檢查或修復的資料庫表。如果你不在資料庫目錄的某處運行myisamchk,你必須指定資料庫目錄的路徑,因為 myisamchk不知道你的資料庫位於哪兒。實際上,myisamchk不在乎你正在操作的檔是否位於一個資料庫目錄;你可以將對應於資料庫表的檔 拷貝到別處並且在那裏執行恢復操作。
如果你願意,可以用myisamchk命令行命名幾個表。還可以通過命名索引檔(用“ .MYI”尾碼)來指定一個表。它允許你通過使用模式“*.MYI”指定在一個目錄所有的表。例如,如果你在資料庫目錄,可以這樣在目錄下檢查所有的MyISAM表:
shell> myisamchk *.MYI
如果你不在資料庫目錄下,可通過指定到目錄的路徑檢查所有在那裏的表:
shell> myisamchk /path/to/database_dir/*.MYI
可以通過為MySQL資料目錄的路徑指定一個通配符來檢查所有的資料庫中的所有表:
shell> myisamchk /path/to/datadir/*/*.MYI
推薦的快速檢查所有MyISAM表的方式是:
shell> myisamchk –silent –fast /path/to/datadir/*/*.MYI
如果你想要檢查所有MyISAM表並修復任何破壞的表,可以使用下面的命令:
myisamchk –silent –force –fast –update-state -O key_buffer=64M -O sort_buffer=64M
-O read_buffer=1M -O write_buffer=1M
/path/to/datadir/*/*.MYI
該命令假定你有大於64MB的自由記憶體。關於用myisamchk分配記憶體的詳細資訊,參見5.9.5.5節,“myisamchk記憶體使用”。
當你運行myisamchk時,必須確保其他程式不使用表。否則,當你運行myisamchk時,會顯示下面的錯誤消息:
warning: clients are using or haven’t closed the table properly
這說明你正嘗試檢查正被另一個還沒有關閉檔或已經終止而沒有正確地關閉檔的程式(例如mysqld伺服器)更新的表。
如果mysqld正在運行,你必須通過FLUSH TABLES強制清空仍然在記憶體中的任何表修改。當你運行myisamchk時,必須確保其他程式不使用表。避免該問題的最容易的方法是使用CHECK TABLE而不用myisamchk來檢查表。

沒有留言:

張貼留言