Innodb恢復--innodb_force_recovery

    Innodb事務型存儲引擎,通過redo,undo,double write這些特性保證數據的完整,針對硬件故障,內核bug,突然斷電的事件,需要手動對Innodb進行恢復;

    可以將Innodb page 損壞分爲幾類,data page 損壞,secondary_index page 損壞, root index 損壞,data dictionary 損壞,恢復的難度依次增加;與朋友一起恢復innodb的時候,重新認識了下innodb_force_recovery;

    最初對innodb_force_recovery 的認識只是錯誤的停留在 它只針對無法啓動的時候使用,1-6的參數,對損壞數據只在啓動的時候不去檢查;後來才明白啓用該參數後,MySQL redo only 就是爲了保證對應參數裏面的值,不啓用後臺thread的任何檢查直至設置innodb_force_recovery=0纔可以,同時跟大家分享下, check table 的結果對於innodb 是不可信的(明明error log報page錯誤,但檢測結果仍是ok) (以下內容多參考官網)

    innodb_force_recovery 在使用的時候,能儘量從1-6依次遞增,=3的時候,已經包括 =1 和=2的處理情況,一般 = 1-3的時候,數據的完整性相對來說還是可以保證的(除了已經損壞的部分),>=4 的時候可能造成 page處於一種相對“過時”(obsolete state),(如果不進行重建損壞的表),可能造成B-trees and other database structures 的損壞,>0 的時候,INSERT,UPDATE,DELETE這些操作都是禁止的,下面介紹下各個參數的具體含義:

        1 (SRV_FORCE_IGNORE_CORRUPT):

         強制忽略corrupt page並自動跳過,期間可以dump table;

        2 (SRV_FORCE_NO_BACKGROUND):

        在前置忽略corrupt page 的基礎上(包含=1的作用),阻塞 master thread 和 任何的 purge thread 運行(有效防止在purge的時候發生MySQL crash)

        3 (SRV_FORCE_NO_TRX_UNDO):

        在忽略 corrupt page,阻塞 purge thread的基礎上,不進行 transaction rollback;

    4 (SRV_FORCE_NO_IBUF_MERGE):

    在忽略 corrupt page,阻塞 purge thread,禁止 transaction rollback 基礎上,禁止 merge  insert buffer,對 table statistics 不進行更新;(這樣會損壞 data file,等恢復後最好重建所有的secondary index);

        5 (SRV_FORCE_NO_UNDO_LOG_SCAN):

        在忽略 corrupt page ,阻塞purge thread,禁止 transaction rollback,禁止merge insert buffer,停止 table statistic 的基礎上,在啓動 MySQL的時候,不在掃描 undo logs,對待incomplete transactions as committed;

        6 (SRV_FORCE_NO_LOG_REDO):

        在以上所有的基礎上,redo log 不進行前滾(roll-forward)

        這裏再次提醒下,對Innodb_force_recovery的賦值最好是依次遞增(除非自己做過嚴格測試)

         

        

    

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章