亚洲免费日韩av一区,最近2019中文字幕大全视频10,体育生gay自慰网站,麻豆国产精品va在线观看不卡

搜索
Close this search box.

MYSQL數(shù)據(jù)庫中的表損壞怎么修復?mysql修復方法

作者:admin 發(fā)布日期:2015-09-07 17:05:21

MYSQL數(shù)據(jù)庫中的表損壞怎么修復?mysql修復方法

1.       表損壞的原因分析 

以下原因是導致mysql 表毀壞的常見原因:

1、 服務器突然斷電導致數(shù)據(jù)文件損壞。

2、 強制關機,沒有先關閉mysql 服務。

3、 mysqld 進程在寫表時被殺掉。

4、 使用myisamchk 的同時,mysqld 也在操作表。

5、 磁盤故障。

6、 服務器死機。

7、 mysql 本身的bug 。

 

2.       表損壞的癥狀 
一個損壞的表的典型癥狀如下:

1 、當在從表中選擇數(shù)據(jù)之時,你得到如下錯誤:

Incorrect key file for table: '...'. Try to repair it

2 、查詢不能在表中找到行或返回不完全的數(shù)據(jù)。

3 、Error: Table 'p' is marked as crashed and should be repaired 。

4 、打開表失?。?Can’t open file: ‘×××.MYI’ (errno: 145) 。

 

3.       預防 MySQL 表損壞 
可以采用以下手段預防m(xù)ysql 表損壞:

1 、定期使用myisamchk 檢查MyISAM 表(注意要關閉mysqld ),推薦使用check table 來檢查表(不用關閉mysqld )。

2 、在做過大量的更新或刪除操作后,推薦使用OPTIMIZE TABLE 來優(yōu)化表,這樣既減少了文件碎片,又減少了表損壞的概率。

3 、關閉服務器前,先關閉mysqld (正常關閉服務,不要使用kill -9 來殺進程)。

4 、使用ups 電源,避免出現(xiàn)突然斷電的情況。

5 、使用最新的穩(wěn)定發(fā)布版mysql ,減少mysql 本身的bug 導致表損壞。

6 、對于InnoDB 引擎,你可以使用innodb_tablespace_monitor 來檢查表空間文件內(nèi)文件空間管理的完整性。

7 、對磁盤做raid ,減少磁盤出錯并提高性能。

8 、數(shù)據(jù)庫服務器最好只跑mysqld 和必要的其他服務,不要跑其他業(yè)務服務,這樣減少死機導致表損壞的可能。

9 、不怕萬一,只怕意外,平時做好備份是預防表損壞的有效手段。
 

4.       MySQL 表損壞的修復 
MyISAM 表可以采用以下步驟進行修復 :

1、  使用 reapair table 或myisamchk 來修復。

2、  如果上面的方法修復無效,采用備份恢復表。

mysql數(shù)據(jù)庫損壞如何修復_mysql數(shù)據(jù)庫修復方法

 

具體可以參考如下做法

階段1 :檢查你的表

如果你有很多時間,運行myisamchk *.MYI 或myisamchk -e *.MYI 。使用-s (沉默)選項禁止不必要的信息。

如果mysqld 服務器處于宕機狀態(tài),應使用--update-state 選項來告訴myisamchk 將表標記為' 檢查過的' 。

你必須只修復那些myisamchk 報告有錯誤的表。對這樣的表,繼續(xù)到階段2 。

如果在檢查時,你得到奇怪的錯誤( 例如out of memory 錯誤) ,或如果myisamchk 崩潰,到階段3 。

階段2 :簡單安全的修復

注釋:如果想更快地進行修復,當運行myisamchk 時,你應將sort_buffer_size 和Key_buffer_size 變量的值設置為可用內(nèi)存的大約25% 。

首先,試試myisamchk -r -q tbl_name(-r -q 意味著“ 快速恢復模式”) 。這將試圖不接觸數(shù)據(jù)文件來修復索引文件。如果數(shù)據(jù)文件包含它應有的一切內(nèi)容和指向數(shù)據(jù)文件內(nèi)正確地點的刪除連接,這應該管用并且表可被修復。開始修復下一張表。否則,執(zhí)行下列過程:

在繼續(xù)前對數(shù)據(jù)文件進行備份。

使用myisamchk -r tbl_name(-r 意味著“ 恢復模式”) 。這將從數(shù)據(jù)文件中刪除不正確的記錄和已被刪除的記錄并重建索引文件。

如果前面的步驟失敗,使用myisamchk --safe-recover tbl_name 。安全恢復模式使用一個老的恢復方法,處理常規(guī)恢復模式不行的少數(shù)情況( 但是更慢) 。

如果在修復時,你得到奇怪的錯誤( 例如out of memory 錯誤) ,或如果myisamchk 崩潰,到階段3 。

階段3 :困難的修復

只有在索引文件的第一個16K 塊被破壞,或包含不正確的信息,或如果索引文件丟失,你才應該到這個階段。在這種情況下,需要創(chuàng)建一個新的索引文件。按如下步驟操做:

把數(shù)據(jù)文件移到安全的地方。

使用表描述文件創(chuàng)建新的( 空) 數(shù)據(jù)文件和索引文件:

shell> mysql db_name

mysql> SET AUTOCOMMIT=1;

mysql> TRUNCATE TABLE tbl_name;

mysql> quit

如果你的MySQL 版本沒有TRUNCATE TABLE ,則使用DELETE FROM tbl_name 。

將老的數(shù)據(jù)文件拷貝到新創(chuàng)建的數(shù)據(jù)文件之中。(不要只是將老文件移回新文件之中;你要保留一個副本以防某些東西出錯。)

回到階段2 ?,F(xiàn)在myisamchk -r -q 應該工作了。(這不應該是一個無限循環(huán))。

你還可以使用REPAIR TABLE tbl_name USE_FRM ,將自動執(zhí)行整個程序。

階段4 :非常困難的修復

只有.frm 描述文件也破壞了,你才應該到達這個階段。這應該從未發(fā)生過,因為在表被創(chuàng)建以后,描述文件就不再改變了。

從一個備份恢復描述文件然后回到階段3 。你也可以恢復索引文件然后回到階段2 。對后者,你應該用myisamchk -r 啟動。

如果你沒有進行備份但是確切地知道表是怎樣創(chuàng)建的,在另一個數(shù)據(jù)庫中創(chuàng)建表的一個拷貝。刪除新的數(shù)據(jù)文件,然后從其他數(shù)據(jù)庫將描述文件和索引文件移到破壞的數(shù)據(jù)庫中。這樣提供了新的描述和索引文件,但是讓.MYD 數(shù)據(jù)文件獨自留下來了?;氐诫A段2 并且嘗試重建索引文件。
 

InnoDB 表可以采用下面的方法修復:

如果數(shù)據(jù)庫頁被破壞,你可能想要用SELECT INTO OUTFILE 從從數(shù)據(jù)庫轉(zhuǎn)儲你的表,通常以這種方法獲取的大多數(shù)數(shù)據(jù)是完好的。即使這樣,損壞可能導致SELECT * FROM tbl_name 或者InnoDB 后臺操作崩潰或斷言,或者甚至使得InnoDB 前滾恢復崩潰。 盡管如此,你可以用它來強制InnoDB 存儲引擎啟動同時阻止后臺操作運行,以便你能轉(zhuǎn)儲你的表。例如:你可以在重啟服務器之前,在選項文件的[mysqld] 節(jié)添加如下的行: 
    [mysqld]innodb_force_recovery = 4innodb_force_recovery 被允許的非零值如下。一個更大的數(shù)字包含所有更小數(shù)字的預防措施。如果你能夠用一個多數(shù)是4 的選項值來轉(zhuǎn)儲你的表,那么你是比較安全的,只有一些在損壞的單獨頁面上的數(shù)據(jù)會丟失。一個為6 的值更夸張,因為數(shù)據(jù)庫頁被留在一個陳舊的狀態(tài),這個狀態(tài)反過來可以引發(fā)對B 樹和其它數(shù)據(jù)庫結(jié)構的更多破壞。 
    1 (SRV_FORCE_IGNORE_CORRUPT) 
即使服務器檢測到一個損壞的頁,也讓服務器運行著;試著讓SELECT * FROM tbl_name 跳過損壞的索引記錄和頁,這樣有助于轉(zhuǎn)儲表。

2 (SRV_FORCE_NO_BACKGROUND) 
阻止主線程運行,如果崩潰可能在凈化操作過程中發(fā)生,這將阻止它。 
    3 (SRV_FORCE_NO_TRX_UNDO) 
恢復后不運行事務回滾。 
    4 (SRV_FORCE_NO_IBUF_MERGE) 
也阻止插入緩沖合并操作。如果你可能會導致一個崩潰。最好不要做這些操作,不要計算表統(tǒng)計表。 
    5 (SRV_FORCE_NO_UNDO_LOG_SCAN) 
啟動數(shù)據(jù)庫之時不查看未完成日志:InnoDB 把未完成的事務視為已提交的。 
    6 (SRV_FORCE_NO_LOG_REDO) 
不要在恢復連接中做日志前滾。 
    數(shù)據(jù)庫不能另外地帶著這些選項中被允許的選項來使用。作為一個安全措施,當innodb_force_recovery 被設置為大于0 的值時,InnoDB 阻止用戶執(zhí)行INSERT, UPDATE 或DELETE 操作. 
    即使強制恢復被使用,你也可以DROP 或CREATE 表。如果你知道一個給定的表正在導致回滾崩潰,你可以移除它。你也可以用這個來停止由失敗的大宗導入或失敗的ALTER TABLE 導致的失控回滾。你可以殺掉mysqld 進程,然后設置innodb_force_recovery 為3 ,使得數(shù)據(jù)庫被掛起而不需要回滾,然后舍棄導致失控回滾的表。


上一篇:iPhone6s要來了:各代iPhone多圖懷舊欣賞(多圖)

下一篇:iPhone 7頻頻曝光:機身太薄了!

熱門閱讀

你丟失數(shù)據(jù)了嗎!

我們有能力從各種數(shù)字存儲設備中恢復您的數(shù)據(jù)

Scroll to Top