張開基
摘 要:oracle數據庫作為目前市場占有率最大的數據庫,以其查詢效率高、運行安全可靠等優點被許多公司采用。數據庫存儲著公司生產經營的核心數據,因此安全性、可靠性等要求比較高。保證生產數據庫系統的高效運行,從而確保公司核心數據的安全穩定,是數據庫管理員的職責。其中,數據庫調優和故障處理是數據庫管理員日常工作的重要部分。本文通過數據庫性能調優的方法研究與故障的分析排除,闡述了數據庫日常運維的重要性。
關鍵詞:運維;性能調優;故障排除
1.引言
公司生產數據庫存儲著公司的重要數據,是公司所有應用數據的唯一源頭。生產數據庫中存儲的數據是公司基礎數據的標準,是公司領導層進行重要決策所需數據的唯一來源。所以,確保生產數據庫的運行穩定,能夠快速響應公司所需數據的請求,是數據庫管理員日常工作的重要內容。
數據庫管理員的日常巡檢中,應全面檢查數據庫服務器的硬件資源、數據庫運行情況等,發現異常及時處理,這樣才能最大限度的避免數據庫產生性能問題,避免影響生產庫的正常使用。這就要求管理員,平時要注意監控數據庫,防止數據庫產生嚴重的性能問題。當數據庫出現性能問題時,要積極去解決它,防止出現數據丟失、生產庫死機等嚴重事件。本文從數據庫性能調優的常規手段入手,分析公司數據庫的運行情況,查看數據庫的性能狀況,排除可能出現的性能問題。然后,針對數據庫出現的異常狀況,闡述了詳盡的解決過程。
2. 數據庫運行情況分析
2.1 等待事件及AWR概述
Oracle等待事件是衡量oracle性能狀況的重要依據及指標。oracle中有兩種類型的等待事件:空閑等待事件,即oracle正在等待事件的發生,這種類型的等待事件對數據庫性能沒有太大的影響,在日常調優中可以忽略;另一種是非空閑等待事件,即會話正在等待oracle完成的事件[1]。數據庫出現非空閑等待事件一般表明服務器資源出現了瓶頸,數據庫發生了資源競爭。如果某個非空閑等待事件比正常情況下持續時間變長,發生次數明顯變多,這種情況一般就表示數據庫發生了性能問題。
在數據庫眾多的管理工具中,Oracle提供的運行收集工具AWR是一個很強大的工具,通過AWR,可以收集系統信息及數據庫運行情況信息,可以用來診斷數據庫故障,也方便第三方技術支持進行遠程閱讀和建議[2]。通過AWR可以很容易的確定Oracle數據庫的性能瓶頸所在,因此了解和使用AWR對于數據庫管理員來說至關重要。
2.2 AWR報告分析
為了查看數據庫運行情況,我們在數據庫使用高峰期,提取了一份數據庫AWR報告。其中,Top 5 Wait Events列出了數據庫耗時最長或發生次數最多的五個等待事件,是整個AWR報告中最能披露問題的一部分內容。識別分析其中的等待事件往往可以幫助解決系統調整方面的性能問題。如果數據庫參數TIMED_STATISTICS值設置為true,則等待事件會按照等待時間的長短來排序;如果沒有,則會按照等待事件發生的次數來排序。
通過分析提取的AWR報告,前兩位等待事件分別是CPU time、db file sequential read。其中,CPU time排位第一表明數據庫沒用io或內存等硬件瓶頸,如果利用系統命令查看cpu使用率在正常狀態下,表明數據庫運行情況正常。在等待事件排序中它居首,說明數據庫運行正常,但是不能說明數據庫性能良好,它不是衡量數據庫性能好壞的指標。第二個等待事件db file sequential read等待次數遠遠多于后幾個,但它所占的響應時間比重并不大,說明等待事件并不是太嚴重。下面來分析一下這個等待事件次數過多的原因。
通過查詢v$session_wait視圖,用來定位當前等待會話所等待數據的具體數據文件。查詢出數據文件號5和數據塊號55560,進一步定位等待事件相關的數據庫表。登錄數據庫查看這張表,發現該表的結構比較復雜,存在BLOB類型的大字段,并且數據量巨大。通過與業務人員溝通,了解到此表是業務主表,訪問量大。通過觀察服務器硬件資源的使用情況,處于正常狀態,所以決定不對它調整,再進一步密切觀察。
3. 數據庫故障的分析排除
3.1 故障分析
數據庫管理員在日常的數據庫監控中,有多種手段,比如利用系統命令prstat、vmstat等去監控系統資源的使用情況;利用telnet命令登陸服務器觀察器cpu及I/O是否出現異常;利用數據庫視圖v$session等觀察數據庫的連接是否處于正常狀態;利用spotlight、AWR工具獲取數據庫實時運行情況等等。
首先我們登錄生產數據庫,利用prstat –a查看系統進程消耗資源情況。通過查看運行結果,我們發現進程號為96的進程運行時間已長達三天,這表示此進程已遇到故障無法自動退出。我們下面要找出此進程無法退出的原因,必要的話要手動殺掉。
3.2 故障排除
首先我們抓取了最近幾天數據庫高峰期的awr報告,對比了一下awr報告,沒發現有什么異常情況發生,系統資源及數據庫運行情況都處于正常狀況。
利用sql語句查出此進程正在運行的sql語句。我們利用autotrace命令得到了這條sql的執行計劃。通過分析執行計劃,也沒有發現異常資源的消耗。由此,我們判斷,此進程是數據庫服務器沒有正常退出的異常進程,可以手工將它殺掉。至于為什么沒有正常退出,可能是系統的bug,需要進一步研究。
首先查找出此進程對應的數據庫會話,查詢出此進程對應的會話的SID和SERIAL#為20和44658。
利用alter system kill session 20,44658殺掉此會話,然后登陸數據庫服務器利用命令kill -1 pid終止此異常進程。再次利用prstat –a查看系統資源,發現此異常進程已被殺掉,系統恢復正常。
4. 結束語
數據庫調優在日常的數據庫運維中占據了數據庫管理員70%的工作量。除了調優,設置內存參數、對數據的存儲劃分等,都是數據庫日常運維的一部分。數據庫管理員的工作對一個公司來說,處于非常重要的位置。一旦數據庫運行不穩定或出現故障,對公司造成的損失是不可估量的。因此,數據庫管理員在日常的運維中,一定要細中再細,做好公司數據庫的“管家婆”。
參考文獻:
[1] 何曾樑.基于等待事件的Oracle數據庫性能優化.現代計算機,2009,(7):106-109.
[2] 張文峰,彭小斌,林根深.AWR技術在ORACLE自動管理中的應用.中國數學醫學,2014,(8):114-115.