唐顯歲



關(guān)鍵詞:HIS系統(tǒng);SQL Server數(shù)據(jù)庫;死鎖;數(shù)據(jù)庫運維
0 引言
SQL Server是由微軟公司開發(fā)的一個大型的關(guān)系型數(shù)據(jù)系統(tǒng),它為用戶提供了一個安全、可靠、易管理和高端的客戶/服務(wù)器數(shù)據(jù)庫平臺。隨著現(xiàn)代數(shù)據(jù)庫應(yīng)用業(yè)務(wù)范圍的拓展,用戶對數(shù)據(jù)庫性能的要求,運維人員對數(shù)據(jù)庫管理的要求都在不斷提高,而SQLServer就是這樣一種高性能的關(guān)系型數(shù)據(jù)庫,它以客戶端/服務(wù)端為設(shè)計結(jié)構(gòu),支持多個不同的開發(fā)平臺,支持企業(yè)級的應(yīng)用程序,支持XML等,能夠滿足多種類型的數(shù)據(jù)庫應(yīng)用場景[1]。因此,SQL Server數(shù)據(jù)庫被廣泛地應(yīng)用在醫(yī)療、教育、商場等各行各業(yè)中,它為使用者提供了一個全面的數(shù)據(jù)管理和業(yè)務(wù)智能平臺。但是,在實際應(yīng)用場景中,面對繁忙的業(yè)務(wù)、復雜的場景以及海量的數(shù)據(jù),難免會出現(xiàn)不同的故障需要調(diào)試,數(shù)據(jù)庫死鎖就是其中之一。
SQL Server數(shù)據(jù)庫貫穿HIS系統(tǒng)設(shè)計、開發(fā)、實施和運行的全過程,HIS系統(tǒng)具有流程復雜,數(shù)據(jù)量龐大的特點,醫(yī)院業(yè)務(wù)要求其具有相應(yīng)速度快且可靠性高,在實際應(yīng)用中,死鎖會使數(shù)據(jù)服務(wù)的終端無法進行任務(wù)操作,并帶來極大的危害且可能導致整個HIS系統(tǒng)癱瘓[2]。
本文通過作者在日常維護中遇到的數(shù)據(jù)庫死鎖問題進行分析,并將處理方法進行梳理,以方便為數(shù)據(jù)庫運維人員在處理此類問題時提供一些思路及方法。
1 SQL Server 數(shù)據(jù)庫鎖管理機制
1.1 鎖模式
在SQL Server數(shù)據(jù)庫中針對不同的資源,存在不同的加鎖方式,即鎖存在多種模式[3],具體包括共享鎖、更新鎖、排它鎖、結(jié)構(gòu)鎖、意向鎖、批量修改鎖,詳細用途如表1所示。
1.2 鎖粒度
根據(jù)SQL Server數(shù)據(jù)庫中用戶可以操作的數(shù)據(jù)行、索引以及數(shù)據(jù)表的不同,鎖有多粒度的概念,即可以鎖定資源的層次[4],資源粒度包括:數(shù)據(jù)庫、表、區(qū)域、頁面、鍵值、行標識符。多粒度鎖用于保證數(shù)據(jù)的完整性和支持并發(fā)操作,收到用戶SQL請求,自動分析并在數(shù)據(jù)庫中加上相應(yīng)的鎖[5]。
1.3 死鎖概述
SQL Server數(shù)據(jù)庫系統(tǒng)中,當多個事務(wù)分別鎖定了某種資源時,又發(fā)出請求試圖鎖定其他事務(wù)已占用的資源,每個事務(wù)都在等待另一個事務(wù)釋放鎖,結(jié)果造成任務(wù)一個事務(wù)都無法繼續(xù)執(zhí)行,從而形成了請求鎖的循環(huán),產(chǎn)生死鎖,即產(chǎn)生永久阻塞的特殊場景[6]。圖1為兩個事務(wù)產(chǎn)生死鎖的例子。
此時我們有兩個線程,分別是線程A和線程B,假設(shè)線程A現(xiàn)在持有了鎖A,線程B持有了鎖B,然后線程A嘗試去獲取鎖B,當然它獲取不到,因為線程B還沒有釋放鎖B。然后線程B又來嘗試獲取鎖A,同樣線程B也獲取不到鎖A,因為鎖A已經(jīng)被線程A持有了。這樣一來,線程A和線程B就發(fā)生了死鎖,因為它們都相互持有對方想要的資源,卻又不釋放自己手中的資源,形成相互等待,而且會一直等待下去[7]。
2 問題描述與分析
某三甲醫(yī)院于上午九時左右多個臨床科室報應(yīng)用程序故障,HIS系統(tǒng)使用非常卡慢,部分科室甚至出現(xiàn)無法進行任何操作的情況,此時正值臨床業(yè)務(wù)繁忙時段。接臨床科室故障報修后,運維工程師根據(jù)故障信息的描述以及故障影響的范圍,迅速就反饋的問題分析有可能造成此類問題的原因:
2.1 服務(wù)器集群出現(xiàn)故障
服務(wù)器集群即多個服務(wù)器一起工作,可以減少單點故障的數(shù)量[8]。可能會出現(xiàn)主機不能加電,自檢報錯、自檢過程中所顯示的配置與實際不符等多種故障。
2.2 內(nèi)部網(wǎng)絡(luò)出現(xiàn)故障
內(nèi)部網(wǎng)絡(luò)即醫(yī)院內(nèi)部的專用網(wǎng)絡(luò),以Web為核心應(yīng)用,構(gòu)成統(tǒng)一便利的信息交互平臺[9]。可能會出現(xiàn)整個局域網(wǎng)都不能上因特網(wǎng)、網(wǎng)絡(luò)適配器與計算機資源沖突和網(wǎng)速過慢等故障。
2.3 客戶端/服務(wù)端資源空間不足
隨著業(yè)務(wù)流量的劇增,客戶端/服務(wù)端可能運行程序過多、應(yīng)用程序沒有及時釋放內(nèi)存、受到網(wǎng)絡(luò)攻擊等問題,導致服務(wù)器資源被大量占用,出現(xiàn)空間不足的情況。
2.4 SQL Server 數(shù)據(jù)庫服務(wù)運行異常
常見的SQL Server數(shù)據(jù)庫服務(wù)運行異常包括數(shù)據(jù)庫服務(wù)未啟動或直接報數(shù)據(jù)庫服務(wù)異常,一般原因為數(shù)據(jù)庫程序損壞或是軟件安裝的數(shù)據(jù)庫服務(wù)未啟動[10]。
2.5 SQL Server 數(shù)據(jù)庫出現(xiàn)死鎖情況
因爭奪資源而造成一種互相等待的情況即死鎖,可能會出現(xiàn)事務(wù)之間對資源訪問順序的交替、并發(fā)修改同一記錄和索引不當導致死鎖的情況。
3 問題處理
在本節(jié)中,我們將之前分析的故障情況具體去操作驗證,以便排查出故障的根本原因并予以處理。
3.1 查看服務(wù)器集群運行狀態(tài)
服務(wù)器集群管理的目的就是提高服務(wù)器性能,同時在出現(xiàn)故障時能及時進行故障轉(zhuǎn)移,提高服務(wù)器的可用性,保障應(yīng)用業(yè)務(wù)的穩(wěn)定性。登錄服務(wù)器集群管理平臺,查看服務(wù)器運行狀態(tài)是否正常,查看服務(wù)器日志有無異常記錄。
3.2 檢查內(nèi)部網(wǎng)絡(luò)運行情況
根據(jù)醫(yī)院內(nèi)網(wǎng)網(wǎng)絡(luò)拓撲圖,依次檢查網(wǎng)絡(luò)核心層、匯聚層及接入層的交換機運行狀態(tài)是否正常,查看日志記錄是否正常。特別是對于故障報修的臨床科室,檢查此區(qū)域內(nèi)局部網(wǎng)絡(luò)是否暢通,終端設(shè)備是否能夠正常連接。
3.3 檢查客戶端/服務(wù)端資源空間
檢查客戶端終端設(shè)備資源空間使用情況,排查是否出現(xiàn)磁盤空間不足或內(nèi)存被惡意侵占等情況;打開數(shù)據(jù)庫服務(wù)器,檢查服務(wù)器資源空間使用情況是否正常,如果資源不足,可通過適當擴容來解決問題。
3.4 檢查SQL Server 數(shù)據(jù)庫服務(wù)運行
打開SQL Server配置管理器,檢查SQL Server服務(wù)狀態(tài)是否運行正常。如果運行異常或未運行,可嘗試重啟下服務(wù),并查看下服務(wù)日志,進一步排查原因,確保SQL Server數(shù)據(jù)庫服務(wù)運行正常。
3.5 查看SQL Server 數(shù)據(jù)庫應(yīng)用情況
打開SQL Server數(shù)據(jù)庫管理工具,通過使用sys.dm_tran_locks動態(tài)管理視圖查看活動鎖的信息,也可以使用sp_lock存儲過程來查看,當發(fā)現(xiàn)死鎖后,應(yīng)排查引起死鎖的原因和影響的范圍,可選擇使用KILL命令結(jié)束產(chǎn)生死鎖的進程ID,釋放資源,確保數(shù)據(jù)庫的運行正常。圖2為作者在數(shù)據(jù)庫運維過程中創(chuàng)建的查看數(shù)據(jù)庫死鎖的存儲過程,它能夠非常便捷直觀地顯示死鎖的詳細信息,可供參考。
通過上述問題分析和問題排查,引起此次HIS系統(tǒng)卡慢的情況是由于新上線的一個小模塊中某個視圖產(chǎn)生大量的查詢語句,剛好與醫(yī)院業(yè)務(wù)數(shù)據(jù)操作繁忙時段相沖突,因此引起數(shù)據(jù)庫死鎖現(xiàn)象,造成應(yīng)用程序卡慢,系統(tǒng)無法操作等故障。最后,通過清理死鎖,釋放資源,同時優(yōu)化視圖,使得數(shù)據(jù)庫運行正常,HIS系統(tǒng)恢復正常。
4 預防和避免死鎖及優(yōu)化效果
4.1 預防和避免死鎖
鎖在數(shù)據(jù)庫中是一個非常重要的概念,它可以防止事務(wù)的并發(fā)問題,在多個事務(wù)訪問下能夠保證數(shù)據(jù)庫的完整性和一致性。本案例中,造成HIS系統(tǒng)卡慢的根本原因就是數(shù)據(jù)庫死鎖,那么在日常使用中該如何預防和避免死鎖呢?
數(shù)據(jù)庫設(shè)計的優(yōu)劣直接影響到系統(tǒng)的運行效率,為了避免死鎖我們遵循以下原則,首先是通過增加數(shù)據(jù)冗余和數(shù)據(jù)劃分兩種途徑非規(guī)范化設(shè)計數(shù)據(jù)庫;其次在頻繁更新的列上、搜索參數(shù)上建立合適的索引;最后對頻繁訪問的表,應(yīng)適當減少頁分裂次數(shù)[11]。
同時可以依據(jù)數(shù)據(jù)庫關(guān)于鎖的機制、鎖模式以及鎖的粒度管理來有效的預防和避免死鎖的產(chǎn)生[12]。通過適時地對數(shù)據(jù)庫表結(jié)構(gòu)、索引建立等進行調(diào)優(yōu),提高數(shù)據(jù)庫的使用性能;優(yōu)化存儲過程、視圖等SQL語句,避免頻繁地在其內(nèi)進行增刪改查操作,占用過多的資源;較大數(shù)據(jù)量的查詢避開臨床業(yè)務(wù)使用的高峰期,降低資源搶占的現(xiàn)象;合理地對數(shù)據(jù)庫服務(wù)器進行資源的調(diào)整,加大數(shù)據(jù)庫服務(wù)器的容量提升性能等都能夠有效的預防和避免數(shù)據(jù)庫死鎖的產(chǎn)生。
4.2 優(yōu)化效果
經(jīng)過對SQL Server數(shù)據(jù)庫的上述優(yōu)化處理,清理了系統(tǒng)中大量的垃圾,合理地規(guī)劃了數(shù)據(jù)庫,極大地提升了處理速度。經(jīng)過系統(tǒng)真實的醫(yī)療數(shù)據(jù)運轉(zhuǎn)環(huán)境下的業(yè)務(wù)測試,及時地預防了死鎖的發(fā)生;重視數(shù)據(jù)的分布和流動性,數(shù)據(jù)量的增大及數(shù)據(jù)模型的改變均不會影響到系統(tǒng)的響應(yīng)速度。
5 結(jié)束語
數(shù)據(jù)庫的死鎖問題是數(shù)據(jù)庫日常維護工作中的常見問題,我們應(yīng)當充分認識和了解數(shù)據(jù)庫中關(guān)于鎖的相關(guān)機制,如鎖模式、鎖粒度及死鎖,并盡量做到預防和避免死鎖的產(chǎn)生,這樣既能保證數(shù)據(jù)庫系統(tǒng)安全穩(wěn)定地運行,又能為實際應(yīng)用工作者節(jié)約寶貴的時間,避免了日常軟件運行過程中出現(xiàn)停頓鎖表的現(xiàn)象,同時還能提高運維人員的工作效率,從而為患者提供流暢、高效、便捷的醫(yī)療服務(wù)。