【醫(yī)院信息系統(tǒng)典型故障案例解析】數(shù)據(jù)庫性能優(yōu)化后的悲喜交加
《醫(yī)院信息系統(tǒng)典型故障案例解析》一書收集整理了53個醫(yī)院信息安全典型案例,內(nèi)容涉及基礎(chǔ)設(shè)施、網(wǎng)絡(luò)設(shè)備、主機(jī)應(yīng)用系統(tǒng)、數(shù)據(jù)庫、安全設(shè)備、虛擬化等各個方面。該書在CHIMA 2019大會發(fā)布后即受到醫(yī)療信息化同仁的一致好評。現(xiàn)CHIMA加印了第二版,同時(shí)在公眾號發(fā)布數(shù)期典型案例,為大家分享信息安全事故經(jīng)驗(yàn),避免事故重現(xiàn),共建醫(yī)院信息安全網(wǎng)絡(luò)。
【案例概述】
案例關(guān)鍵詞:Oracle;數(shù)據(jù)庫;性能優(yōu)化;Bug
更快的速度、更高的的性能不僅對臨床用戶,對運(yùn)維人員也是一件喜事。即便如此,有時(shí)也會在數(shù)據(jù)庫中觸發(fā)一些讓人意想不到的“坑”。下面簡單介紹一個因?yàn)樾阅軆?yōu)化后觸發(fā)的Oracle數(shù)據(jù)庫的Bug導(dǎo)致業(yè)務(wù)故障的案例。
【案例還原】
某醫(yī)院資深維護(hù)人員小L最近算是“悲喜交加”,喜的是,某個重要系統(tǒng)剛換了服務(wù)器、存儲等硬件設(shè)備,整個系統(tǒng)性能有了極大提升;悲的是,該系統(tǒng)自從更換過設(shè)備后,每天一到業(yè)務(wù)高峰期,業(yè)務(wù)科室就報(bào)障無法操作或是要等待一段時(shí)間才能操作。小L甚是不解,在一次報(bào)障中,小L仔細(xì)檢查完主機(jī)操作系統(tǒng)及存儲后確認(rèn)兩方面均無問題,之后便開始深入檢查了數(shù)據(jù)庫。
通過語句[select * fromv$session_wait where event not like ‘%message%’]發(fā)現(xiàn)event 等待事件中有許多enqueue等待事件,通過該視圖,繼續(xù)深入查詢sid為1310的enqueue等待事件。
通過語句[select sid,prev_hash_value from v$session where sid = 1310]查詢得到該sid的事件等待的上一條語句的hash_value為“2687139145”;
繼續(xù)查詢v$sqltext,通過語句[select * from v$sqltext where hash_value = '2687139145' order by piece]得到sid為1310的等待事件,等待的是上一條語句[delete SF_HZBR00 whereHZQSRQ<to_char(sysdate,'YYYYMMDD')]。
通過對所有enqueue等待事件的查詢得知,數(shù)據(jù)庫中的enqueue事件都是在等待上述delete語句的執(zhí)行。
問題現(xiàn)象已經(jīng)很清晰了,因?yàn)閐elete的操作,導(dǎo)致表SF_HZBR00的排他鎖而導(dǎo)致其它業(yè)務(wù)等待。小L查到問題所在,并通過腳本把數(shù)據(jù)庫中所有的hold和wait殺掉后(具體語句如下),業(yè)務(wù)恢復(fù)正常。
SELECT'kill -9 '||p.spid
FROMv$session s,v$process p
WHERE s.paddr=p.addr
ands.sid in(
SELECTsid FROM V$LOCK
WHERE(id1, id2, type) in
(SELECTid1, id2, type FROM V$LOCK WHERE request>0))
但是到了第二天,問題又重復(fù)出現(xiàn),查詢后仍舊是表SF_HZBR00的delete操作在作祟。
那為什么在高峰時(shí)間會頻繁執(zhí)行delete操作?誰在執(zhí)行?為什么要執(zhí)行?
帶著這些問題,小L咨詢了業(yè)務(wù)同事小W,小W一眼就看出,該delete語句是數(shù)據(jù)庫中某個job的問題,該job每天定期跑一個存儲過程SP_HT_LSSJQL,該存儲過程就每天都在跑這條delete語句,主要是每天定期清理候診病人隊(duì)列數(shù)據(jù)。
那問題又來了,既然是job,每天定期執(zhí)行,為什么之前沒有問題,升級系統(tǒng)后就出問題了?
查詢數(shù)據(jù)庫日志后發(fā)現(xiàn),之前沒有出問題是因?yàn)樵瓉頇C(jī)器性能所限,該job根本沒有執(zhí)行成功過,表SF_HZBR00積攢了好幾年的候診病人隊(duì)列無用數(shù)據(jù)。而自從換了設(shè)備后,系統(tǒng)性能大為改觀,job可以正常跑,但是因?yàn)閿?shù)據(jù)量過大,所以導(dǎo)致在業(yè)務(wù)高峰時(shí)期表數(shù)據(jù)仍未清理完畢,而之前的處理手段是直接kill進(jìn)程(job超時(shí),數(shù)據(jù)庫會將其停掉),所以刪除表數(shù)據(jù)的工作被回滾,導(dǎo)致表數(shù)據(jù)未清理成功過。
原以為性能提高后問題會減少,沒想到性能提高后觸發(fā)了數(shù)據(jù)庫一個長期存在的“隱憂”。原來“坑”一直都在,只是之前沒有踩中而已。
后來,小L把存儲過程SP_HT_LSSJQL中的該條delete語句注釋掉,問題得以解決且未再出現(xiàn)。后續(xù),小L通過手工方式逐步把表SF_HZBR00的數(shù)據(jù)進(jìn)行清理,并撤銷對SP_HT_LSSJQL的delete語句的注釋,從根本上解決了問題。
【案例總結(jié)】
1、要定期關(guān)注數(shù)據(jù)庫日志,關(guān)注數(shù)據(jù)庫定期執(zhí)行job的執(zhí)行情況,尤其是對一些表或數(shù)據(jù)的處理是否執(zhí)行成功,如果未成功,雖然短時(shí)間可能不會影響業(yè)務(wù)系統(tǒng),但是長期可能會導(dǎo)致性能瓶頸。
2、數(shù)據(jù)庫鎖及鎖等待,為盡快恢復(fù)業(yè)務(wù)系統(tǒng),應(yīng)急處理可以統(tǒng)一kill掉,但是從根本上來說,為防止鎖及鎖等待的出現(xiàn),應(yīng)深入分析鎖產(chǎn)生的機(jī)制與原因,優(yōu)化相關(guān)SQL語句,從根源上解決問題。
3、DBA和熟悉業(yè)務(wù)的工程師應(yīng)該共同處理數(shù)據(jù)庫邏輯問題,這樣可起到事半功倍的效果。
本文選自《醫(yī)院信息系統(tǒng)典型故障案例解析》
主 編 傅昊陽
副主編 馬麗明 賀嘉嘉 高峰
近期活動推薦:醫(yī)院數(shù)據(jù)安全和數(shù)據(jù)治理論壇
點(diǎn)擊以下圖片可直接購買:《醫(yī)院網(wǎng)絡(luò)安全等級保護(hù)(2.0)實(shí)施指南》
更多醫(yī)療信息相關(guān)書籍請點(diǎn)擊查看