ARES資通電子報

技術交流

定期對資料庫進行健康檢查,防患於未然

文 - 趙青 Gracie Zhao

你瞭解你的資料庫現在的狀態嗎?你有定期幫它體檢嗎?還是在等到它向你拋異常情況時才去補救?
前段時間在做集團化的一些功能,資料涉及到多個 DB 間的傳輸,這讓我想到若這其中有一個 DB 出現異常,都會導致很嚴重的後果。所以就想到了定期給資料庫做健康檢查的問題。

先給出健康檢查的定義:
健康檢查:為避免系統出現不必要的故障而定期對主機、作業系統、資料庫、存儲、中介軟體等進行全面檢查,以系統提供最高可用性,並通過全面的分析,提出對系統的評價以及改進方案的過程。

一般分為三個步驟:
第一步,檢查主機配置,作業系統相關參數及目前的運行狀態是否符合資料庫的要求。

第二步,檢查資料庫的一些基本資訊,實例命中率 ( Instance efficiency hit ratios ) 、共用池狀態 ( Shared Pool Statistics ) 、等待事件、首要的 SQL ( Top SQL ) 、實例活動 ( Instance activity ) 、檔 I/O ( File I/O ) 、其他記憶體統計資料、撤銷段統計資訊、鎖統計資訊、資料字典和庫緩衝統計資訊、SGA 記憶體統計資訊、 init.ora 參數。

第三步,根據前兩步得出的結果製作一份資料庫健康檢查表,並得出改善的結論。
現在有一些工具就可進行資料庫方面的健康檢查,比如 TOAD 的 Health check、Statspac+job ,不過大家必須要知道最後生成的每一項結果的具體含義,不然就沒有意義了。我給大家介紹一下在不安裝其它工具的情況下如何進行健康檢查,並給出相關指標的含義。只需使用 SYS 用戶登錄,查詢 V$SYSSTAT 視圖即可自己做出健康檢查表,關鍵指標及解釋如下:

1.CPU used by this session:所有 session 的 CPU 占用量,不包括後臺進程。這項統計的單位是百分之 x 秒.完全調用一次不超過 10ms。

2.db block changes:那部分造成SGA中資料塊變化的 insert 、 update 或 delete 運算元 這項統計可以大概看出整體資料庫狀態。在各項事務級別,這項統計指出髒緩存比率。

3.execute count:執行的SQL語句數量(包括遞迴SQL)。

4.logons current:當前連接到實例的 Sessions 。如果當前有兩個快照則取平均值。

5.logons cumulative:自實例啟動後的總登陸次數。

6.parse count ( hard ):在 shared pool 中解析調用的未命中次數。當 SQL 語句執行並且該語句不在 shared pool 或雖然在 shared pool 但因為兩者存在部分差異而不能被使用時產生硬解析。如果一條 SQL 語句原文與當前存在的相同,但查詢表不同則認為它們是兩條不同語句,則硬解析即會發生。硬解析會帶來 CPU 和資源使用的高昂開銷,因為它需要 Oracle 在 shared pool 中重新分配記憶體,然後再確定執行計畫,最終語句才會被執行。

7.parse count ( total ):解析調用總數,包括軟解析和硬解析。當 session 執行了一條 SQ
語句,該語句已經存在於 shared pool 並且可以被使用則產生軟解析。當語句被使用(即共
用)所有資料相關的現有 SQL 語句(如最優化的執行計畫)必須同樣適用於當前的聲明。
這兩項統計可被用於計算軟解析命中率。

8.parse time CPU:總CPU解析時間(單位:10ms)。包括硬解析和軟解析。

9.parse time elapsed:完成解析調用的總時間花費。

10.physical reads:OS blocks read 數。包括插入到 SGA 緩存區的物理讀以及 PGA 中的直讀這項統計並非 i/o 請求數。

11.physical writes:從 SGA 緩存區被 DBWR 寫到磁片的資料塊以及 PGA 進程直寫的資料塊數量。

12.redo log space requests:在 redo logs 中服務進程的等待空間,表示需要更長時間的 log switch。

13.redo size:redo 發生的總次數(以及因此寫入 log buffer),以 byte 為單位。這項統計顯示出 update 活躍性。

14.session logical reads:邏輯讀請求數。

15.sorts ( memory ) and sorts ( disk ):sorts ( memory ) 是適於在SORT_AREA_SIZE(因此不需要在磁片進行排序)的排序操作的數量。Sorts ( disk ) 則是由於排序所需空間太大,SORT_AREA_SIZE 不能滿足而不得不在磁片進行排序操作的數量。這兩項統計通常用於計算 in-memory sort ratio。

16.sorts ( rows ): 列排序總數。這項統計可被 'sorts ( total )' 統計項除盡以確定每次排序的列。該項可指出資料卷和應用特徵。

17.table fetch by rowid:使用 ROWID 返回的總列數(由於索引訪問或 SQL 語句中使用了'where rowid=&rowid'而產生)。

18.table scans ( rows gotten ):全資料表掃描中讀取的總列數。

19.table scans ( blocks gotten ):全資料表掃描中讀取的總塊數,不包括那些 split 的列。

20.user commits + user rollbacks:系統事務起用次數。當需要計算其它統計中每項事務比率時該項可以被做為除數。例如,計算事務中邏輯讀,可以使用下列公式:session logical reads / ( user commits + user rollbacks )。

通過一條SQL語句:select name, value from v$sysstat 就可進行日常的資料庫檢查,大家是不是覺得很方便?