天天看點

mysql修複表,索引

REPAIR [LOCAL |NO_WRITE_TO_BINLOG] TABLE   tbl_name[,tbl_name]... [QUICK] [EXTENDED] [USE_FRM]

REPAIRTABLE用于修複被破壞的表。預設情況下,REPAIR TABLE與myisamchk--recovertbl_name具有相同的效果。REPAIRTABLE對MyISAM和ARCHIVE表起作用。請參見15.1節,“MyISAM存儲引擎”,15.8節,“ARCHIVE存儲引擎”。

通常,您基本上不必運作此語句。但是,如果災難發生,REPAIRTABLE很有可能從MyISAM表中找回所有資料。如果您的表經常被破壞,您應該盡力找到原因,以避免使用REPAIRTALBE。請參見A.4.2節,“如果MySQL依然崩潰,應作些什麼”。同時也見15.1.4節,“MyISAM表方面的問題”。

本語句會傳回一個含有以下列的表:

Table 表名稱
Op 進行修複
Msg_type 狀态、錯誤、資訊或警告之一
Msg_text 消息

對于每個被修複的表,REPAIRTABLE語句會産生多行的資訊。上一行含有一個Msg_type狀态值。Msg_test通常應為OK。如果您沒有得到OK,您應該嘗試使用myisamchk--safe-recover修複表,因為REPAIR TABLE尚不會執行所有的myisamchk選項。我們計劃在将來使它的靈活性更強。

如果給定了QUICK,則REPAIRTABLE會嘗試隻修複索引樹。這種類型的修複與使用myisamchk--recover --quick相似。

如果您使用EXTENDED,則MySQL會一行一行地建立索引行,代替使用分類一次建立一個索引。這種類型的修複與使用myisamchk--safe-recover相似。

對于REPAIR TABLE,還有一種USE_FRM模式可以利用。如果.MYI索引檔案缺失或标題被破壞,則使用此模式。在這種模式下,MySQL可以使用來自.frm檔案重新建立.MYI檔案。這種修複不能使用myisamchk來完成。注釋:隻能在您不能使用正常REPAIR模式是,才能使用此模式。.MYI标題包含重要的表中繼資料(特别是,目前的AUTO_INCREMENT值和Delete連結)。這些中繼資料在REPAIR...USE_FRM中丢失。如果表被壓縮,則不能使用USE_FRM。因為本資訊也存儲在.MYI檔案中。

REPAIRTABLE語句被寫入二進制日志中,除非使用了自選的NO_WRITE_TO_BINLOG關鍵詞(或其别名LOCAL)。

警告:如果在REPAIRTABLE運作過程中,伺服器停機,則在重新啟動之後,在執行其它操作之前,您必須立刻對表再執行一個REPAIRTABLE語句。(通過制作一個備份來啟動是一個好辦法。)再最不利情況下,您可以有一個新的幹淨的索引檔案,不含有關資料檔案的資訊。然後,您執行的下一個操作會覆寫資料檔案。這很少發生,但是是有可能的。

mysql repair table-Can’t open file:‘[Table]mytable.MYI’.

  

也許很多人遇到過類似Can’t open file:‘[Table]mytable.MYI’ 這樣的錯誤資訊,卻不知道怎麼解決他,下面我們做個介紹:

多數情況下,資料庫被破壞隻是指索引檔案受到了破壞,真正的資料被破壞掉的情況非常少。大多數形式的資料庫破壞的的修複相當簡單。

和前面的校驗一樣,修複的方式也有三種。

下面講的方法隻對MyISAM格式的表有效。其他類型的損壞需要從備份中恢複。

  1,REPAIR TABLE SQLstatement(mysql服務必須處于運作狀态)。

  2,指令mysqlcheck(mysql服務可以處于運作狀态)。

  3,指令myisamchk(必須停掉mysql服務,或者所操作的表處于不活動狀态)。

在修複表的時候,最好先作一下備份。是以你需要兩倍于原始表大小的硬碟空間。請確定在進行修複前你的硬碟空間還沒有用完。

1>   用”repair table”方式修複

 

 文法:repair table 表名 [選項]

   

  選項如下:

    QUICK 用在資料表還沒被修改的情況下,速度最快

    EXTENDED 試圖去恢複每個資料行,會産生一些垃圾資料行,萬般無奈的情況下用

    USE_FRM 用在.MYI檔案丢失或者頭部受到破壞的情況下。利用.frm的定義來重建索引

    多數情況下,簡單得用”repair tabletablename”不加選項就可以搞定問題。但是當.MYI檔案丢失或者頭部受到破壞時,這樣的方式不管用,例如:

  For example:

    mysql> REPAIRTABLE mytable;

    +————————-+——–+———-+—————————————————————————————+

    | Table              | Op   | Msg_type   | Msg_text               |

    +————————-+——–+———-+—————————————————————————————+

    | sports_results.mytable   |repair    |error    | Can’t find file: ‘mytable.MYI’ (errno: 2) |

    +————————-+——–+———-+—————————————————————————————+

  

  修複失敗的原因時索引檔案丢失或者其頭部遭到了破壞,為了利用相關定義檔案來修複,需要用USE_FRM選項。例如:

    mysql> REPAIRTABLE mytable USE_FRM;

    +————————-+——–+———-+————————————————————————————+

    | Table           | Op   | Msg_type  |Msg_text                                       |

    +————————-+——–+———-+————————————————————————————+

    | sports_results.mytable   |repair   |warning     | Number of rowschanged from 0 to 2 |

    | sports_results.mytable   |repair   | status     | OK                                            |

    +————————-+——–+———-+————————————————————————————+

    我們可以看到Msg_test表項的輸出資訊”ok”,表名已經成功修複受損表。

2>   用mysql内建指令mysqlcheck來修複

  當mysql服務在運作時,也可以用mysql内建指令mysqlcheck來修複。

  

  文法:mysqlcheck -r 資料庫名 表名 -uuser-ppass

  Command: %mysqlcheck -rsports_results mytable -uuser -ppass

  Result:   sports_results.mytableOK

  

  利用mysqlcheck可以一次性修複多個表。隻要在資料庫名後列出相應表名即可(用空格隔開)。或者資料庫名後不加表名,将會修複資料庫中的所有表,例如:

  Command: %mysqlcheck -rsports_results mytable events -uuser -ppass

  Result:   sports_results.mytableOK

  Result:   sports_results.events OK

  Command: %mysqlcheck -r sports_results -uuser -ppass

    

  Result:   sports_results.mytableOK

  Result:   sports_results.events OK

3>用myisamchk修複

  用這種方式時,mysql服務必須停掉,或者所操作的表處于不活動狀态(選項skip-external-locking沒被使用)。記着一定要在相關.MYI檔案的路徑下或者自己定義其路徑。

  

  文法:myisamchk [選項] [表名]

  

  下面是其選項和描述

    –backup, -B 在進行修複前作相關表得備份

    –correct-checksum 糾正校驗和

    –data-file-length=#, -D # 重建表時,指定資料檔案得最大長度

    –extend-check, -e 試圖去恢複每個資料行,會産生一些垃圾資料行,萬般無奈的情況下用

    –force, -f 當遇到檔案名相同的.TMD檔案時,将其覆寫掉。

    keys-used=#, -k # 指定所用的keys可加快處理速度,每個二進制位代表一個key.第一個key為0

    –recover, -r 最常用的選項,大多數破壞都可以通過它來修複。

        如果你的記憶體足夠大,可以增大參數sort_buffer_size的值來加快恢複的速度。但是遇到唯一鍵由于破壞而不唯一的表時,這種方式不管用。

    

    –safe-recover -o最徹底的修複方式,但是比-r方式慢,一般在-r修複失敗後才使用。

        這種方式讀出所有的行,并以行為基礎來重建索引。它的硬碟空間需求比-r方式稍微小一點,因為它沒建立分類緩存。你可以增加key_buffer_size的值來加快修複的速度。

    –sort-recover, -n mysql用它類分類索引,盡管結果是臨時檔案會非常大

    –character-sets-dir=… 包含字元集設定的目錄

    –set-character-set=name 為索引定義一個新的字元集

    –tmpdir=path, -t 如果你不想用環境變量TMPDIR的值的話,可以自定義臨時檔案的存放位置

    –quick, -q 最快的修複方式,當資料檔案沒有被修改時用,當存在多鍵時,第二個-q将會修改 資料檔案

    –unpack, -u 解開被myisampack打包的檔案

    myisamchk應用的一個例子

      % myisamchk -r mytable

      - recovering (with keycache) MyISAM-table‘mytable.MYI’

      Data records: 0