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的賦值最好是依次遞增(除非自己做過嚴格測試)