mysql崩潰后啟動 innodb_force_recovery


https://dev.mysql.com/doc/refman/5.7/en/forcing-innodb-recovery.html

線上測試服務器做主從備份,結果從服務器異常崩潰啟動,導致數據庫壞掉了。然后從服務器的數據庫無法啟動。我們需要先把數據庫起來。

innodb_force_recovery是用來強制回復innodb數據庫的,有6個有效配置。默認是0,大於0表示對應的恢復等級,0表示不啟用強制恢復。

4或者更高的數字會永久的修改當前的文件內容。建議在恢復之前做好備份。當強制恢復是,最好是從1開始,然后不斷增加數字。

更高的數字包含低數字的功能,比如3包含所有1和2的功能。

如果使用3或者更低的數字,那么你只會丟失一小部分錯誤的數據。如果使用4或者更高的數字,是非常危險的,因為數據文件會被永久的污染。6表示極端的,因為這種模式下數據頁被認為是過時的,這樣反過來可能對B樹和數據結構造成更大的損壞。

作為安全考慮,InnoDB會禁止INSERT, UPDATE, or DELETE操作在innodb_force_recovery大於0的時候。對於4或者更高的等級會設置為只讀模式。

  • 1 (SRV_FORCE_IGNORE_CORRUPT)

是服務器運行直到檢測出錯誤的頁。嘗試使SELECT * FROM tbl_name跳到正確的索引位置和頁。對於dump表很有用。

  • 2 (SRV_FORCE_NO_BACKGROUND)

禁止master線程和清理線程運行。如果一個未預料的退出來自於清理操作,這個模式會禁止它。

  • 3 (SRV_FORCE_NO_TRX_UNDO)

不運行事務回滾在恢復崩潰的時候

  • 4 (SRV_FORCE_NO_IBUF_MERGE)

禁止插入緩沖合並操作。如果發生崩潰,就不執行這些操作。不計算表的統計。這個數值會永久修改數據文件。用了這個數值后,需要刪除所有的二級索引並且重新創建。設置InnoDB為只讀模式。

  • 5 (SRV_FORCE_NO_UNDO_LOG_SCAN)

不查看undo日志:InnoDB把所有未完成的事務當作已經提交。這個數值會永久修改數據文件。設置InnoDB為只讀模式。

  • 6 (SRV_FORCE_NO_LOG_REDO)

不執行redo日志和回滾操作在恢復模式下鏈接時。這個數值會永久修改數據文件。使數據也為廢棄狀態,會反過來損壞更多的B樹和數據結構。設置InnoDB只讀。

你可以SELECT from tables然后dump它們。使用3或者更小的數值,可以DROP或CREATE表。在MySQL 5.7.17版本后DROP TABLE也同樣在高於3的等級上支持。作為MySQL 5.7.18,DROP TABLE不允許在高於4的等級上使用。

如果你知道,給定的表,因為一個未知的錯誤退出了回滾,你可以刪除它。如果你遇到了大規模的因為導入或者修改表而導致的回滾錯誤,你可以停止mysqld的進程,然后把innodb_force_recovery設置為3,使得數據庫起來,而不回滾,然后刪除導致回滾失敗的表格。

如果錯誤出現在表格的數據中,禁止你dump整個表的內容,可以使用ORDER BY primary_key DESC查詢,導出從錯誤到現在的數據。

如果啟動更高的數值,可能導致一些復雜的查詢語句失敗,比如(queries containing WHERE, ORDER BY, or other clauses)。這時候,你只能使用SELECT * FROM t基礎的查詢語句了


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM