劉秉春,王曉虹,王志文,馬玉想,肖永平
數(shù)據(jù)庫備份兩例故障的恢復(fù)與解決方法
劉秉春,王曉虹,王志文,馬玉想,肖永平
數(shù)據(jù)庫;故障;備份
數(shù)據(jù)庫系統(tǒng)的正常是“軍字一號”系統(tǒng)運(yùn)行的基礎(chǔ),當(dāng)用戶使用一個(gè)數(shù)據(jù)庫時(shí),數(shù)據(jù)庫中的數(shù)據(jù)必須是可靠的、正確的。但是,由于計(jì)算機(jī)系統(tǒng)的原因或是人為操作不當(dāng)會(huì)直接影響數(shù)據(jù)庫系統(tǒng)的安全性,甚至破壞數(shù)據(jù)庫,造成數(shù)據(jù)庫中全部或部分?jǐn)?shù)據(jù)丟失。筆者所在醫(yī)院最近由于數(shù)據(jù)庫備份問題和人為操作不當(dāng)出現(xiàn)2次故障,總結(jié)經(jīng)驗(yàn)教訓(xùn)如下。
1.1 數(shù)據(jù)庫熱備份沒有完成引起的故障可能是因?yàn)殚L期沒有DOWN機(jī),用戶登錄數(shù)過多造成數(shù)據(jù)庫死鎖,上午工作中客戶端數(shù)據(jù)庫無法登錄,發(fā)現(xiàn)服務(wù)器響應(yīng)速度慢,這時(shí)是工作高峰期,沒有查看數(shù)據(jù)庫狀態(tài)而直接重啟oracle服務(wù),可是發(fā)現(xiàn)數(shù)據(jù)庫無法啟動(dòng),查看“D:oracleadminorcldumporclALRT.LOG”文件,分析原因是熱備份還沒有結(jié)束,這時(shí)才想起在重啟服務(wù)時(shí)有一活動(dòng)窗口沒有運(yùn)行完畢而直接關(guān)閉了,導(dǎo)致還有“SQL>alter tablespace表空間end backup”這樣的語句沒有執(zhí)行完畢。這時(shí)沒有進(jìn)行其它操作,在命令提示符下輸入:Sqlmgrl>Startup;Database mounted;Ora-01113:file7needrecovery;Ora-01110:datafile7:’d:oracleoradataorclapacct.dbf’;Sqlmgrl>Recover database;Sqlmgrl>Alter database open resetlogs;之后數(shù)據(jù)庫啟動(dòng)正常。數(shù)據(jù)文件在備份時(shí)檢驗(yàn)點(diǎn)號(SCN)不變,而其他數(shù)據(jù)文件SCN發(fā)生改變,這樣數(shù)據(jù)文件中SCN不一致,導(dǎo)致數(shù)據(jù)庫無法正常啟動(dòng)。
1.2 人為操作不當(dāng)引起的故障最近醫(yī)院患者在出院結(jié)算時(shí)無法結(jié)帳,發(fā)現(xiàn)應(yīng)交費(fèi)用和實(shí)收費(fèi)用不一致,開始認(rèn)為是個(gè)別患者出現(xiàn)的情況,可是核算室反饋的是大部分結(jié)算患者存在這樣的問題。利用LogMiner進(jìn)行Oracle數(shù)據(jù)日志分析,發(fā)現(xiàn)在最后出現(xiàn)錯(cuò)誤情況時(shí)有一個(gè)誤操作。有很多下面這樣的語句:時(shí)間:2010-09-02-17:25:36語句update"INPBILL"."INP_BILL_DETAIL"set"AMOUNT"=39,"COSTS"=39,"CHA RGES"=39 where ROWID='AAAD5yAARAAAAUXAAO'。很多收費(fèi)項(xiàng)目統(tǒng)一變成了39元,原因是一次錯(cuò)誤提交,使inp_bill_items中所有Item_no為72的實(shí)收和應(yīng)收全為39;但由于是2 d前的操作,可是醫(yī)院的備份只保留了1 d的數(shù)據(jù),并且這次備份做了恢復(fù)性試驗(yàn),無法再進(jìn)行數(shù)據(jù)庫介質(zhì)恢復(fù)?;謴?fù)過程如下:首先查看備用服務(wù)器數(shù)據(jù)的時(shí)間,發(fā)現(xiàn)備用服務(wù)器和主服務(wù)器誤操作時(shí)間差18 d,備用服務(wù)器上數(shù)據(jù)存在的可以直接導(dǎo)入,所以主要問題是備用服務(wù)器上沒有的這段時(shí)間的數(shù)據(jù)恢復(fù)問題。藥品根據(jù)擺藥記錄drug_rec中的數(shù)據(jù)進(jìn)行恢復(fù),開始用2臺機(jī)器1臺查看錯(cuò)誤數(shù)據(jù),1臺提取擺藥記錄正確數(shù)據(jù),但這樣存在數(shù)萬條數(shù)據(jù),所需修改時(shí)間很長,經(jīng)過試驗(yàn)用PB做一數(shù)據(jù)窗口,提取inp_bill_items中這段時(shí)間內(nèi)錯(cuò)誤數(shù)據(jù),根據(jù)drug_rec中的記錄修改數(shù)量和費(fèi)用;非藥品記錄可以按每天的費(fèi)用清單來對照,但這樣每人每天對照不太現(xiàn)實(shí),可行的方法是把出問題的記錄根據(jù)價(jià)表修改相關(guān)費(fèi)用。主要語句如下:
總結(jié)這2次故障的經(jīng)驗(yàn)教訓(xùn),主要原因是熱備份數(shù)量太少,周期比較短,修改備份方案如下:
2.1 擴(kuò)大備份空間原來是雙機(jī)熱備,另加1臺普通計(jì)算機(jī),掛2個(gè)2TB硬盤,保證有足夠備份空間。
2.2 修改備份程序修改熱備份目的地于本機(jī)硬盤,加快備份時(shí)間。之后由本機(jī)硬盤拷貝到映射硬盤。alter tablespace tsp_...begin backup;host copy d:oracleoradataorcl....dbf E:orclbak;alter tablespace tsp_...end backup;alter system switch logfile;host copy d:oracleoradataorcllog*.dbf E:orclbak(本機(jī)硬盤);host copy d:oracleoradataorcl*.log E:orclbak;alter database backup controlfile to'e:control01.ctl'reuse;host copy e:control01.ctl E:orclbak;host copy e:archive*.*E:arbak;host copy e:orclbak*.*M:(映射盤符);host copy e:arbak*.*n:
2.3 增加循環(huán)周期在備份時(shí)由原來只保留1 d備份改為備份數(shù)據(jù)保存1個(gè)月,并1個(gè)月做1次全備份,每天備份計(jì)劃任務(wù)由1個(gè)改為7個(gè),每星期做循環(huán)備份,確保數(shù)據(jù)發(fā)生錯(cuò)誤時(shí)能夠完全恢復(fù)。
2.4 標(biāo)記存儲介質(zhì)根據(jù)備份的內(nèi)容,日期將介質(zhì)統(tǒng)一編號,以免備份和恢復(fù)時(shí)弄錯(cuò)介質(zhì),造成原有的備份丟失。
2.5 做好異地備份介質(zhì)應(yīng)存放在與計(jì)算機(jī)設(shè)備不同的地點(diǎn),以免機(jī)房發(fā)生意外時(shí),備份與計(jì)算機(jī)設(shè)備一同損壞。
現(xiàn)在大部分醫(yī)院采用熱備份,熱備份必須將數(shù)據(jù)庫運(yùn)行在(Archive Log)歸檔方式下,優(yōu)點(diǎn)是數(shù)據(jù)備份期間用戶可以繼續(xù)訪問數(shù)據(jù)庫,保證醫(yī)院信息系統(tǒng)不間斷運(yùn)行;而且可以達(dá)到秒級恢復(fù)(恢復(fù)到某一時(shí)間點(diǎn)上),這樣在出現(xiàn)問題時(shí)可以快速恢復(fù)到出問題的前一刻,這一點(diǎn)在雙機(jī)熱備恢復(fù)時(shí)是非常有用的;再就是熱備份數(shù)據(jù)恢復(fù)快,基本上不占用太多時(shí)間。但是熱備份的缺點(diǎn)是難于維護(hù),熱備份盡量在數(shù)據(jù)庫不使用或使用率低的情況下進(jìn)行,不能出錯(cuò),否則后果嚴(yán)重。例1主要原因是沒有每天查看備份是否完成,窗口中仍有活動(dòng)窗口,仍然強(qiáng)行宕機(jī)造成oracle中SCN處于不一致的狀態(tài),導(dǎo)致數(shù)據(jù)庫無法正常啟動(dòng)。
隨著醫(yī)院信息化程度的不斷提高,數(shù)據(jù)庫作為信息系統(tǒng)的核心,擔(dān)當(dāng)著十分重要的角色,做好數(shù)據(jù)庫備份尤為重要。因此,必須要有完備的備份與恢復(fù)策略,并通過模擬故障對每種可能的情況進(jìn)行嚴(yán)格測試,這樣才能保證數(shù)據(jù)的高可用性,保證日常工作的正常運(yùn)行。
[1]王慧琴.“軍字一號”工程數(shù)據(jù)庫系統(tǒng)的備份及恢復(fù)策略研究[J].中國數(shù)字醫(yī)學(xué),2008,12(48):
[2]潘哲毅,陳國軍,杜開齊,等.“軍字一號”醫(yī)院信息系統(tǒng)的備份和Oracle錯(cuò)誤恢復(fù)[J].武警醫(yī)學(xué),2008,1(92):
[3]袁姍,劉長生,施偉.Oracle數(shù)據(jù)庫熱備份過程中被中斷的數(shù)據(jù)恢復(fù)方法[J].計(jì)算機(jī)工程應(yīng)用技術(shù),2009,3(2315):
[2010-12-13收稿,2011-01-20修回]
TP311.53
B
264002山東煙臺,107醫(yī)院信息科(劉秉春,王曉虹,王志文,馬玉想,肖永平)
1.2.1 修改藥品記錄long ll_row;ll_row=dw_1.retrieve();int i,li,lii;string ls_patid,ls;decimal ld_p;for i=1 to ll_row;ld_p=dw_1.GetItemDecimal(i,"drug_dispense_rec_costs");ls_patid=dw_1.getitemstring(i,"inp_bill_detail_patient_id");li=dw_1.GetItemDecimal(i,"inp_bill_detail_visit_id");lii=dw_1.GetItemDecimal(i,"drug_dispense_rec_dispense_amount")UPDATE"INP_BILL_DETAIL";SET"AMOUNT"=:lii,"COSTS"=:ld_p,"CHARGES"=:ld_p;WHERE("INP_BILL_DETAIL"."PATIENT_ID"=:ls_patid)AND("INP_BILL_DETAIL"."VISIT_ID"=:li)AND("INP_BILL_DETAIL"."ITEM_NO"=72);commit;next messagebox(STRING(i),"ok")。
1.2.2 修改非藥品記錄long ll_row;ll_row=dw_1.retrieve();int i,li,lii;string ls_patid,ls;decimal ld_p;for i=1 to ll_row;ld_p=dw_1.GetItemDecimal(i,"price_list_price");ls_patid=dw_1.getitemstring(i,"inp_bill_detail_patient_id");li=dw_1.GetItemDecimal(i,"inp_bill_detail_visit_id");UPDATE"INP_BILL_DETAIL";SET"COSTS"=:ld_p,"CHARGES"=:ld_p;WHERE("INP_BILL_DETAIL"."PATIENT_ID"=:ls_patid)AND("INP_BILL_DETAIL"."VISIT_ID"=:li)AND("INP_BILL_DETAIL"."ITEM_NO"=72);commit;nextmessagebox("數(shù)據(jù)修改完畢","ok")。這樣基本完成了沒有備份時(shí)間段空白數(shù)據(jù)記錄的恢復(fù),個(gè)別數(shù)據(jù)不對的情況可以根據(jù)科室明細(xì)單進(jìn)行修改。這樣正常運(yùn)行10 d左右后基本沒有無法結(jié)賬的情況發(fā)生。
[本文編輯:羨秋盛]