Oracle 使用AWR處理問題

語言: CN / TW / HK

theme: cyanosis

小知識,大挑戰!本文正在參與“  程式設計師必備小知識  ”創作活動
本文同時參與 「掘力星計劃」  ,贏取創作大禮包,挑戰創作激勵金

怎樣抓取管理awr,之前寫過,就不過多介紹了。
https://juejin.cn/post/7002048974605680677
https://juejin.cn/post/7002421237586591751
本文主要結合實際環境談下 Oracle 單機環境下如何利用awr報告,分析資料庫問題。

一、背景

運維人員反映,上午系統卡住,頁面無法載入使用,下午系統自動恢復正常,軟體層面未排查到原因,請求協助排查資料庫層面。

二、分析定位

2.1 確認時間範圍

與運維人員確認了上午業務異常時間段為 9:30-11:30,下午業務正常時間段為 13:30以後。

2.2 抓取 awr 報告

資料庫伺服器上執行指令碼 @?/rdbms/admin/awrrpt.sql,抓取兩個時間段的awr報告,因awr快照預設生成頻率為1小時,故抓取了正常時間段 10:00-11:00 和異常時間段 14:00-15:00 的awr報告。

2.3 檢視 awr 報告

2.3.1 檢視資料庫壓力

awr報告開頭展示的內容。
Elapsed/DB Time 的值越小,資料庫壓力越大。
awr快照預設生成頻率都是1小時,所以通常直接看 DB Time 即可,改值越大,資料庫壓力越大。
業務正常時資料庫壓力: image.png 業務異常時資料庫壓力: image.png 抓取了業務正常時間段和不正常時間段的資料庫awr報告,上述業務異常時資料庫的 DB Time 明顯比正常時高出很多,可判斷資料庫目前存在問題。

業務越繁忙 DB Time 越高,但一般也不會超過 2000(mins)。

2.3.2 檢視資料庫等待事件

業務正常時等待事件: image.png 業務異常時等待事件: image.png 正常時,DB CPU 排在 top 的首位,異常時其他等待事假會躍居 top 首位。
上述直接查詢異常時的等待事件 enq: HW - contention 即可。(Oracle 絕大多數等待事件的原因和處理方式網上都可查到)經查詢可得到如下解釋:

為防止多個程序同時修改HWM而提供的鎖稱為HW鎖。想要移動HWM的程序必須獲得HW鎖。若在獲取HW鎖過程中發生爭用,則等待enq: HW - contention事件。HW鎖爭用大部分是因大量執行insert所引發的,偶爾也會因大量執行update在回滾段中發生HW鎖爭用現象。若是update,表中段的擴充套件的大小雖然不多,但在建立回滾資料的過程中,需要回滾段的急速擴張。HW鎖爭用是在急速空間擴張時普遍出現的等待現象,有時也會引發嚴重的效能下降。

根據上述等待事件資訊,可判斷資料庫記憶體在 sql 造成了鎖爭用。

2.3.3 檢視資料庫 sql 耗時

業務正常時 sql 耗時: image.png 業務異常時 sql 耗時: image.png Elapsed Time (s):sql 執行總耗時。
Executions:sql 執行次數。
Elapsed Time per Exec (s):sql 每次執行所消耗時間。
%Total:sql 耗時百分比。

直接看排名前幾位的即可,正常時排在第一位的 sql 一小時內(抓取的快照時間)執行了 1,838 次,每次執行 0.94s,共耗費時間為 1,733.81s,正常速度。
異常時排在第一位的 sql 一小時內(抓取的快照時間)執行了 2,972 次,每次執行 108.43s,共耗費時間為 322,249.95s,明顯不正常。 檢視異常時間段耗時 sql 的百分比 96.42%,再結合上述等待事件,可判斷改 sql 造成了資料庫鎖爭用。

2.3.4 檢視抓取資料庫具體 sql 資訊

直接單擊對應的 sql_id 跳轉到詳細的 sql 頁面。 image.png image.png

三、將抓取的 sql 交於系統研發人員

將抓取的 sql 交於系統研發人員,結合業務邏輯進行優化。