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 交於系統研發人員,結合業務邏輯進行優化。