對于InnoDB引擎來說,擁有自動恢復(fù)機(jī)制。在通常情況下,當(dāng)服務(wù)器出現(xiàn)宕機(jī)時(shí),InnoDB是可以在重啟時(shí)自動修復(fù)錯(cuò)誤的。在某些情況下,因?yàn)槌霈F(xiàn)的異常情況也會導(dǎo)致其無法進(jìn)行修復(fù)。為此,可以通過設(shè)置“innidb_force_recovery”參數(shù),來進(jìn)行人工修復(fù)。該參數(shù)可以設(shè)置不同的值,對應(yīng)不同的修復(fù)級別。在默認(rèn)情況下,該參數(shù)的值為0,表示不啟用。如果對其改變的話,數(shù)據(jù)表就會處于只讀狀態(tài),而且只能執(zhí)行基本的Select等語句,不能附加Where,Order BY等參數(shù)。因?yàn)閿?shù)據(jù)表處于恢復(fù)狀態(tài),不能進(jìn)行插入刪除等修改操作。如果將其設(shè)置為1,例如“innodb_force_recovery=1”表示即使發(fā)現(xiàn)了損壞,也會讓服務(wù)繼續(xù)運(yùn)行,這對于數(shù)據(jù)的備份和轉(zhuǎn)存當(dāng)前的數(shù)據(jù)很有用。
這適用于數(shù)據(jù)本身沒有大的損壞,在可以正常讀取數(shù)據(jù)的情況下,將數(shù)據(jù)備份出來,通過重新創(chuàng)建同樣的數(shù)據(jù)庫,并將數(shù)據(jù)恢復(fù)進(jìn)來。該模式可以滿足一般情況下的數(shù)據(jù)恢復(fù)之用。如果將其設(shè)置為2,例如“innodb_force_recovery=2”,表示在主線程和任何清除線程運(yùn)行時(shí),可以防止因?yàn)榍宄僮鲗?dǎo)致服務(wù)器宕機(jī)的發(fā)生。根據(jù)以上分析,在InnoDB引擎運(yùn)行時(shí),會執(zhí)行各種循環(huán),在其中會執(zhí)行清除操作,將緩存中的數(shù)據(jù)寫入磁盤,同時(shí)可以校驗(yàn)磁盤文件(例如“ib_logfile”,“*.ibd”文件等日志,索引文件)的結(jié)構(gòu)的完整性,如果結(jié)構(gòu)出現(xiàn)損壞,就會導(dǎo)致清除操作發(fā)生問題,甚至導(dǎo)致數(shù)據(jù)庫崩潰。利用上述參數(shù)值,可以禁止執(zhí)行后臺循環(huán),來避免上述危險(xiǎn)的發(fā)生。
上述兩種模式,在一般情況下不會導(dǎo)致數(shù)據(jù)的丟失,而其余的模式就容易導(dǎo)致數(shù)據(jù)不完整性的發(fā)生。如果設(shè)置為3,例如“innodb_force_recovery=3”,表示恢復(fù)后不回滾事務(wù)。當(dāng)在當(dāng)前數(shù)據(jù)庫中進(jìn)行了一些事務(wù)性的操作,在事務(wù)沒有正常關(guān)閉的情況下,對于該模式來說,會強(qiáng)制性認(rèn)為事務(wù)已經(jīng)關(guān)閉,而且不會回滾未關(guān)閉的事務(wù),這很容易導(dǎo)致當(dāng)前數(shù)據(jù)庫中的數(shù)據(jù)發(fā)生錯(cuò)誤或者意外改變。如果設(shè)置為4,例如“innodb_force_recovery=4”,表示如果插入到緩沖區(qū)中的合并操作導(dǎo)致數(shù)據(jù)庫崩潰,則禁止執(zhí)行該操作。使用該模式,可能造成索引出現(xiàn)問題。解決方式是先導(dǎo)出數(shù)據(jù),之后重新用相同的數(shù)據(jù)庫恢復(fù)數(shù)據(jù),然后重建索引。
如果將其設(shè)置為5,例如“innodb_force_recovery=5”,表示啟動數(shù)據(jù)庫時(shí)忽略撤銷日志,InnoDB引擎將未完成的事務(wù)視作已完成,該模式不執(zhí)行Redo日志掃描和比對。如果設(shè)置為6,表示在啟動數(shù)據(jù)庫時(shí),忽略與恢復(fù)相關(guān)的前滾日志。即如果在宕機(jī)時(shí),“ib_logfile1”等日志文件中數(shù)據(jù)發(fā)生損壞,造成無法讀取日志或者讀取的是錯(cuò)誤的信息,使用該模式將其忽略。這樣,在重啟之后,一些需要重做的事務(wù)操作被忽略,可能會導(dǎo)致數(shù)據(jù)的丟失。因?yàn)樵谥刈鋈罩局写娣帕硕鄺l日志信息,如果其中某條日志信息出現(xiàn)損壞,那么所有的日志信息都會被拋棄,導(dǎo)致丟失相關(guān)的事務(wù)操作,自然會出現(xiàn)數(shù)據(jù)的丟失。