Mysql異常停止之后的恢復(fù)操作
點(diǎn)擊上方“IT那活兒”公眾號(hào),關(guān)注后了解更多內(nèi)容,不管IT什么活兒,干就完了!!!有次測(cè)試環(huán)境主機(jī)登陸不上,之后發(fā)現(xiàn)是現(xiàn)場(chǎng)斷電,導(dǎo)致虛擬機(jī)所在的物理機(jī)關(guān)機(jī)了。這樣的話虛擬機(jī)上跑的一些進(jìn)程沒(méi)有手動(dòng)停止就異常關(guān)閉了,可能會(huì)出現(xiàn)問(wèn)題。等物理機(jī)開(kāi)機(jī)登陸之后,看環(huán)境狀態(tài),果然mysql啟動(dòng)失敗了,在此記錄下此情況的解決方式。
2.1 直接啟動(dòng)mysql報(bào)如下錯(cuò)誤上網(wǎng)查看了一下報(bào)錯(cuò),主要有以下幾種可能導(dǎo)致報(bào)錯(cuò)的情況:
- 1)可能是/xxx/xxxx/xxxx/mysqld.pid文件沒(méi)有寫的權(quán)限。
- 2)可能進(jìn)程里已經(jīng)存在mysql進(jìn)程。
- 3)可能是第二次在機(jī)器上安裝mysql,之前環(huán)境的mysql-bin.index沒(méi)刪除影響了服務(wù)的啟動(dòng)。
- 4)my.cnf配置文件下,沒(méi)有指定datadir。
- 5)my.cnf配置文件下skip-federated沒(méi)有被注釋。
- 6)mysql啟動(dòng)目錄的所屬者和所屬組不對(duì)。
經(jīng)過(guò)一一核查發(fā)現(xiàn)這些情況我都不符合。2.2 在my.cnf中加innodb_force_recovery=x參數(shù),值填寫從1-6,直到庫(kù)能起來(lái)為止各參數(shù)意思如下,能填寫小數(shù)值庫(kù)能起來(lái)最好,否則有丟失數(shù)據(jù)的風(fēng)險(xiǎn)。
- 1)(SRV_FORCE_IGNORE_CORRUPT): 忽略檢查到的 corrupt 頁(yè)。盡管檢測(cè)到了損壞的 page 仍強(qiáng)制服務(wù)運(yùn)行。一般設(shè)置為該值即可,然后 dump 出庫(kù)表進(jìn)行重建。
- 2)(SRV_FORCE_NO_BACKGROUND): 阻止主線程的運(yùn)行,如主線程需要執(zhí)行 full purge 操作,會(huì)導(dǎo)致 crash。 阻止 master thread 和任何 purge thread 運(yùn)行。若 crash 發(fā)生在 purge 環(huán)節(jié)則使用該值。
- 3)(SRV_FORCE_NO_TRX_UNDO): 不執(zhí)行事務(wù)回滾操作。
- 4)(SRV_FORCE_NO_IBUF_MERGE): 不執(zhí)行插入緩沖的合并操作。如果可能導(dǎo)致崩潰則不要做這些操作。不要進(jìn)行統(tǒng)計(jì)操作。該值可能永久損壞數(shù)據(jù)文件。若使用了該值,則將來(lái)要?jiǎng)h除和重建輔助索引。
- 5)(SRV_FORCE_NO_UNDO_LOG_SCAN): 不查看重做日志,InnoDB 存儲(chǔ)引擎會(huì)將未提交的事務(wù)視為已提交。此時(shí) InnoDB 甚至把未完成的事務(wù)按照提交處理。該值可能永久性的損壞數(shù)據(jù)文件。
- 6)(SRV_FORCE_NO_LOG_REDO): 不執(zhí)行前滾的操作。恢復(fù)時(shí)不做 redo log roll-forward。使數(shù)據(jù)庫(kù)頁(yè)處于廢止?fàn)顟B(tài),繼而可能引起 B 樹(shù)或者其他數(shù)據(jù)庫(kù)結(jié)構(gòu)更多的損壞。
很慘的是我這里使用到6才將庫(kù)啟動(dòng)成功。2.3 啟動(dòng)之后查看mysql日志,發(fā)現(xiàn)庫(kù)可能已經(jīng)損壞2.4 只能選擇將庫(kù)的數(shù)據(jù)全量導(dǎo)出,mv掉data目錄之后再重新初始化注意:因?yàn)閘og_detail表已經(jīng)損壞,無(wú)法正常查看導(dǎo)出,只能跳過(guò)改存儲(chǔ)日志的表,導(dǎo)出表結(jié)構(gòu),后續(xù)在重新創(chuàng)建此表。Mv掉原存儲(chǔ)數(shù)據(jù)的data目錄,并且重新創(chuàng)建data目錄:配置my.cnf 將my.cnf中innodb_force_recovery 這行配置刪除或者配置為innodb_force_recovery=0,初始化mysql。2.6 重新導(dǎo)入之前備份的數(shù)據(jù),并根據(jù)之前損壞表的表結(jié)構(gòu)創(chuàng)建之前過(guò)濾掉的表2.7 核查下導(dǎo)入數(shù)據(jù)是否正常,若無(wú)問(wèn)題,只能用這樣的辦法解決異常停止導(dǎo)致的啟動(dòng)失敗了,否則直接刪掉ib_logfile0,ib_logfile1,可以將庫(kù)拉起,但是庫(kù)還是損壞狀態(tài)。本文作者:孫宇航(上海新炬中北團(tuán)隊(duì))
本文來(lái)源:“IT那活兒”公眾號(hào)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/129120.html