mysql recovery = 4_强制MySQL InnoDB恢复参数innodb_force_recovery
強(qiáng)制InnoDB恢復(fù)
為了研究數(shù)據(jù)庫頁損壞,你能用SELECT … INTO OUTFILE從數(shù)據(jù)庫中轉(zhuǎn)儲(chǔ)表。通常,以這種方式獲得的大部分?jǐn)?shù)據(jù)是完整的。嚴(yán)重的損壞可能導(dǎo)致SELECT* FROM tbl_name語句或InnoDB的后臺(tái)操作崩潰或斷言,甚至造成InnoDB前滾恢復(fù)崩潰。 在這樣的情況下,可以使用innodb_force_recovery選項(xiàng)強(qiáng)制InnoDB存儲(chǔ)引擎啟動(dòng)同時(shí)阻止后臺(tái)操作運(yùn)行,這樣你就能轉(zhuǎn)儲(chǔ)表了。例如,你可以在重新啟動(dòng)服務(wù)器之前添加以下行到選項(xiàng)文件的[mysqld]部分:
[mysqld]
innodb_force_recovery = 1
警告
只有在緊急情況下將innodb_force_recovery設(shè)為大于0的值,你才能啟動(dòng)InnoDB并轉(zhuǎn)儲(chǔ)表。在進(jìn)行此操作之前,確保你有數(shù)據(jù)庫的備份副本,以備需要重建它。4及以上的值可以永久破壞數(shù)據(jù)文件。只有在數(shù)據(jù)庫的獨(dú)立物理副本的成功地測(cè)試了設(shè)置,才能在生產(chǎn)服務(wù)器實(shí)例使用4及以上的innodb_force_recovery設(shè)置。當(dāng)強(qiáng)制InnoDB恢復(fù),你應(yīng)該總是以innodb_force_recovery=1啟動(dòng),且僅在需要時(shí)增加值。
innodb_force_recovery默認(rèn)為0(沒有強(qiáng)制恢復(fù)的正常啟動(dòng))。對(duì)于innodb_force_recovery允許的非零值是1至6。較大值包括較小值的功能。例如,為3的值包括所有的值1和2的功能。
如果你能以innodb_force_recovery為3或更低值轉(zhuǎn)儲(chǔ)你的表,那么你是比較安全的,只有在損壞的個(gè)人頁的一些數(shù)據(jù)會(huì)丟失。4或更大的值被認(rèn)為是危險(xiǎn)的,因?yàn)閿?shù)據(jù)文件可以被永久地?fù)p壞。值6被認(rèn)為是嚴(yán)重的,數(shù)據(jù)庫頁被留在一個(gè)陳舊的狀態(tài),這反過來又可能帶給B-trees和其它數(shù)據(jù)庫結(jié)構(gòu)更多的損壞。
作為一個(gè)安全措施,InnoDB 在innodb_force_recovery大于0時(shí)阻止INSERT,UPDATE或DELETE操作。對(duì)于MySQL5.6.15,將innodb_force_recovery設(shè)為4或更高會(huì)讓InnoDB處于只讀模式。
1 (SRV_FORCE_IGNORE_CORRUPT)
即使服務(wù)器檢測(cè)到損壞的頁仍讓它運(yùn)行。試圖使SELECT* FROM tbl_name跳過損壞的索引記錄和頁,這樣有助于轉(zhuǎn)儲(chǔ)表。
2 (SRV_FORCE_NO_BACKGROUND)
阻止主線程和任何清除線程的運(yùn)行。如果崩潰會(huì)在清除操作中發(fā)生,該恢復(fù)值會(huì)阻止它。
3 (SRV_FORCE_NO_TRX_UNDO)
不要在崩潰恢復(fù)后運(yùn)行事務(wù)回滾。
4 (SRV_FORCE_NO_IBUF_MERGE)
阻止插入緩沖合并操作。如果它們會(huì)導(dǎo)致崩潰,不要做這些。不計(jì)算表統(tǒng)計(jì)。這個(gè)值可以永久損壞數(shù)據(jù)文件。使用這個(gè)值后,準(zhǔn)備號(hào)刪除并重建所有輔助索引。在MySQL5.6.15中,設(shè)置InnoDB為只讀。
5 (SRV_FORCE_NO_UNDO_LOG_SCAN)
在啟動(dòng)數(shù)據(jù)庫時(shí)不查看撤消日志:InnoDB將即使未完成的事務(wù)也作為已提交。這個(gè)值可以永久損壞數(shù)據(jù)文件。在MySQL5.6.15中,設(shè)置InnoDB為只讀。
6 (SRV_FORCE_NO_LOG_REDO)
不要通過恢復(fù)對(duì)重做日志進(jìn)行前滾。這個(gè)值可能永久損壞數(shù)據(jù)文件。數(shù)據(jù)庫頁被留在一個(gè)陳舊的狀態(tài),這反過來又可能帶給B-trees和其它數(shù)據(jù)庫結(jié)構(gòu)更多的損壞。在MySQL5.6.15中,設(shè)置InnoDB為只讀。
你可以從表中SELECT來轉(zhuǎn)儲(chǔ)它們。innodb_force_recovery的值為3或更低,你可以DROP或CREATE表。在MySQL 5.6.27中,DROP TABLE還受大于3的innodb_force_recovery值支持。
如果你知道一個(gè)給定表在回滾造成崩潰,你可以將其刪除。如果遇到所造成失敗的大規(guī)模導(dǎo)入的失控回滾或ALTER TABLE,你可以殺掉mysqld進(jìn)程,并設(shè)置innodb_force_recovery為3使數(shù)據(jù)庫啟動(dòng)而不回滾,然后DROP導(dǎo)致失控回滾的表。
如果表數(shù)據(jù)中的損壞阻止你轉(zhuǎn)儲(chǔ)整個(gè)表的內(nèi)容,帶ORDER BY?primary_key?DESC子句的查詢能夠轉(zhuǎn)儲(chǔ)損壞部分后的表的部分。
如果一個(gè)高innodb_force_recovery值需要啟動(dòng)InnoDB,可能有被破壞的數(shù)據(jù)結(jié)構(gòu),可能導(dǎo)致復(fù)雜查詢(含有WHERE,ORDER BY或其他子句的查詢)失敗。在這種情況下,你可能只能運(yùn)行基本的SELECT* FROM t查詢。
總結(jié)
以上是生活随笔為你收集整理的mysql recovery = 4_强制MySQL InnoDB恢复参数innodb_force_recovery的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从美国火到中国,ChatGPT 版微软必
- 下一篇: generator mysql插件_my