Oracle性能調優(AWR)

 

一、AWR報告

      AWR 是通過對比兩次快照(snapshot)收集到的統計信息,來生成報表數據,生成的報表包括多個部分,這點與Statspack生成的報告非常類似。不過AWR在生成報告時,可以選擇生成TXT或HTML兩種格式的報告,相對來說,HTML更利於閱讀,而TXT的適用性更廣(即使在不能使用瀏覽器的機器上也能看)。

      操作過Statspack的朋友都還記的,生成報告使用$ORACLE_HOME/rdbms/admin/spreport.sql腳本,到了AWR這片,操作步驟基本上相同,不過生成報告的腳本多了很多選擇,包括:

  • awrrpt.sql :生成指定快照區間的統計報表; ----產生整個數據庫的AWR報告
  • awrrpti.sql :生成指定數據庫實例,並且指定快照區間的統計報表; -----產生某個實例的AWR報告
  • awrsqlrpt.sql :生成指定快照區間,指定SQL語句(實際指定的是該語句的SQLID)的統計報表;  --產生某條SQL語句的AWR報告,運行腳本awrsqrpt.sql
  • awrsqrpi.sql :生成指定數據庫實例,指定快照區間的指定SQL語句的統計報表; 
  • awrddrpt.sql :指定兩個不同的時間週期,生成這兩個週期的統計對比報表; 
  • awrddrpi.sql :指定數據庫實例,並指定兩個的不同時間週期,生成這兩個週期的統計對比報表;

     那麼如何產生AWR報告呢?

1、啓用AWR

     在默認情況下,Oracle啓用數據庫統計收集這項功能(即啓用AWR)。是否啓用AWR由初始化參數STATISTICS_LEVEL控制。通過SHOW PARAMETER命令

可以顯示STATISTICS_LEVEL的當前值:

     SQL> SHOW PARAMETER STATISTICS_LEVEL 

    SQL語句的執行結果是:
    NAME                                 TYPE        VALUE
    ------------------------------------ ----------- ------------------------------
   statistics_level                     string      TYPICAL

如果STATISTICS_LEVEL的值爲TYPICAL或者 ALL,表示啓用AWR;如果STATISTICS_LEVEL的值爲BASIC,表示禁用AWR.

AWR的行爲受到參數STATISTICS_LEVEL的影響。這個參數有三個值:

*BASIC:awr統計的計算和衍生值關閉.只收集少量的數據庫統計信息.

*TYPICAL:默認值.只有部分的統計收集.他們代表需要的典型監控oracle數據庫的行爲.

*ALL : 所有可能的統計都被捕捉. 並且有操作系統的一些信息.這個級別的捕捉應該在很少的情況下,比如你要更多的sql診斷信息的時候才使用.

2、運行腳本awrrpt.sql
     SQL> @/oracle/product/10.2.0/db_1/rdbms/admin/awrrpt.sql

3、選擇報告的類型

    輸入 report_type 的值:  html

4、列出最近兩天產生的快照(主要是獲得快照ID)

   1. 輸入 num_days 的值:  2  

                                                        Snap
  Instance     DB Name        Snap Id    Snap Started    Level
  ------------ ------------ --------- ------------------ -----
  telemt       TELEMT           4123 06 Mar 2011 00:00      1
                                      4124 06 Mar 2011 01:01      1
  ....
                                      4160 07 Mar 2011 13:00      1
                                      4161 07 Mar 2011 14:00      1

  指定起始快照的ID和結束快照的ID。

   1. Specify the Begin and End Snapshot Ids  
   2. ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~  
   3. 輸入 begin_snap 的值:  4123
   4. Begin Snapshot Id specified: 4123
   5.  
   6. 輸入 end_snap 的值:  4161
   7. End   Snapshot Id specified: 4161

本例中起始快照的ID是4123,結束快照的ID是4161。

指定報告的名字。

    輸入 report_name 的值:  myreport.html

二、AWR報告日常分析

(1) SQL ordered by Elapsed Time

      記錄了執行總和時間的TOP SQL(請注意是監控範圍內該SQL的執行時間總和,而不是單次SQL執行時間 Elapsed Time = CPU Time + Wait Time)。
Elapsed Time(S): SQL語句執行用總時長,此排序就是按照這個字段進行的。注意該時間不是單個SQL跑的時間,而是監控範圍內SQL執行次數的總和時間。單位時間爲秒。Elapsed Time = CPU Time + Wait Time
       CPU Time(s): 爲SQL語句執行時CPU佔用時間總時長,此時間會小於等於Elapsed Time時間。單位時間爲秒;
       Executions: SQL語句在監控範圍內的執行次數總計;
       Elap per Exec(s): 執行一次SQL的平均時間。單位時間爲秒;
       % Total DB Time: 爲SQL的Elapsed Time時間佔數據庫總時間的百分比。
       SQL ID: SQL語句的ID編號,點擊之後就能導航到下邊的SQL詳細列表中,點擊IE的返回可以回到當前SQL ID的地方。
       SQL Module: 顯示該SQL是用什麼方式連接到數據庫執行的,如果是用SQL*Plus或者PL/SQL鏈接上來的那基本上都是有人在調試程序。一般用前臺應用鏈接過來執行的sql該位置爲空。
       SQL Text: 簡單的sql提示,詳細的需要點擊SQL ID。

(2) SQL ordered by CPU Time

     記錄了執行佔CPU時間總和時間最長的TOP SQL(請注意是監控範圍內該SQL的執行佔CPU時間總和,而不是單次SQL執行時間)。

(3) SQL ordered by Gets

     記錄了執行佔總buffer gets(邏輯IO)的TOP SQL(請注意是監控範圍內該SQL的執行佔Gets總和,而不是單次SQL執行所佔的Gets)。

(4) SQL ordered by Reads

     記錄了執行佔總磁盤物理讀(物理IO)的TOP SQL(請注意是監控範圍內該SQL的執行佔磁盤物理讀總和,而不是單次SQL執行所佔的磁盤物理讀)。

(5) SQL ordered by Executions

     記錄了按照SQL的執行次數排序的TOP SQL。該排序可以看出監控範圍內的SQL執行次數。

(6) SQL ordered by Parse Calls

     記錄了SQL的軟解析次數的TOP SQL。說到軟解析(soft prase)和硬解析(hard prase),就不能不說一下Oracle對sql的處理過程。

(7) SQL ordered by Sharable Memory

     記錄了SQL佔用library cache的大小的TOP SQL。Sharable Mem (b):佔用library cache的大小,單位是byte。

(8) SQL ordered by Version Count

     記錄了SQL的打開子游標的TOP SQL。

(9) SQL ordered by Cluster Wait Time

     記錄了集羣的等待時間的TOP SQL

三、快照(SNAPSHOT)

     每隔一小時,內存監控進程(MMON)自動地採集一次統計信息,並把這些信息存放到負載庫中,一次採樣就是一個快照。爲了節省空間,採集的數據在7天后自動清除。快照的頻率和保留時間可以由用戶修改。
--查看快照的頻率和保留時間(默認爲每1小時採樣一次,採樣信息保留時間爲7天)
 select * from dba_hist_wr_control;
 select DBID, SNAP_INTERVAL, SNAPINT_NUM, RETENTION from wrm$_wr_control;
--修改 快照的頻率和保留時間(單位用分鐘)
exec dbms_workload_repository.modify_snapshot_settings(interval=>60, retention=>7*24*60);


用戶也可以使用下面的命令手工採樣(手工生成快照):
    BEGIN  
    DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();  
    END;

手工刪除指定範圍的快照
  begin
  dbms_workload_repository.drop_snapshot_range(low_snap_id => 3965, high_snap_id => 3966, dbid => 3437504306);
  end;
    
 --查看有多少個快照
 select count(1) from wrh$_active_session_history;
 select count(1) from dba_hist_active_sess_history;
 
通過查詢視圖DBA_HIST_SNAPSHOT,可以知道系統中產生了哪些快照。
select * from DBA_HIST_SNAPSHOT;

四、採樣數據存放位置

      這些採樣數據都存儲在SYSAUX表空間中,並且以WRM$_* 和 WRH$_*的格式命名。前一種類型存儲元數據信息(如檢查的數據庫和採集的快照),
後一種類型保存實際採集的統計數據.
select table_name from dba_tables where table_name like 'WRM$%';
 
TABLE_NAME
-----------------------
WRM$_WR_CONTROL
WRM$_SNAP_ERROR
WRM$_SNAPSHOT
WRM$_DATABASE_INSTANCE
WRM$_BASELINE

當SYSAUX表空間滿後,AWR將自動覆蓋掉舊的信息,並在警告日誌中記錄一條相關信息:
ORA-1688: unable to extend table SYS.WRH$_ACTIVE_SESSION_HISTORY partition WRH$_ACTIVE_3533490838_1522 by 128 in                 tablespace SYSAUX

select table_name from dba_tables where table_name like 'WRH$%';

五、設置基線

    創建基線
      基線(baseline)是一種機制,這樣你可以在重要時間的快照信息集做標記。一個基線定義在一對快照之間,快照通過他們的快照序列號識別.每個
基線有且只有一對快照。一次典型的性能調整實踐從採集量度的基準線集合、作出改動、然後採集另一個基準線集合開始。可以比較這兩個集合來檢查
所作的改動的效果。在 AWR 中,對現有的已採集的快照可以執行相同類型的比較。
    假定一個名稱爲 apply_interest 上午 2:00 到 4:00 之間運行,對應快照 ID 4150 到 4151。我們可以爲這些快照定義一個名稱爲 apply_interest_1 的基準線:
SQL> exec dbms_workload_repository.create_baseline(4150, 4151, 'apply_interest_1');


這一操作將快照從 4150 到 4151 編號,作爲上面指定的基準線的一部分。查看現有的基準線:
SQL> select *from dba_hist_baseline;
 
 DBID      BASELINE_ID  BASELINE_NAME        START_SNAP_ID  START_SNAP_TIME                  END_SNAP_ID END_SNAP_TIME
---------- ----------- -------------------- ------------- --------------------------------  ----------- -------------------------------
3437504306     1        apply_interest_1     4150          07-3月 -11 03.00.47.627 上午       4151        07-3月 -11 04.00.12.567 上午
 
SQL> select *from wrm$_baseline;
 
DBID        BASELINE_ID BASELINE_NAME                   START_SNAP_ID  END_SNAP_ID
---------- ----------- ------------------------------  -------------  -----------
3437504306      1       apply_interest_1                 4150             4151
 

在一些調整步驟之後,我們可以創建另一個基準線 — 假設名稱爲 apply_interest_2(下午2點到4點),然後只爲那些與這兩條基準線相關的快照比較量度。
SQL> exec dbms_workload_repository.create_baseline(4162, 4163, 'apply_interest_2');
 
像這樣把快照分隔在僅僅幾個集合中有助於研究調整對於性能量度的影響。

     刪除基線
    分析之後使用 drop_baseline() 來刪除基準線;快照將保留(也可級聯刪除)。此外,當清除例程開始刪除舊的快照時,與基準線相關的快照不會被清除,從而允許進行進一步的分析。
如果要刪除一個基準線:
SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_1', cascade=>false);
 
SQL> select *from wrh$_active_session_history where snap_id in (4150,4151);
 
SNAP_ID  DBID     INSTANCE_NUMBER  SAMPLE_ID SAMPLE_TIME                  SESSION_ID ...
4150 3437504306    1             14900840   07-3月 -11 02.55.02.038 上午   162       ...   
4150 3437504306    1             14900200   07-3月 -11 02.44.21.942 上午   165       ...  
....
4151 3437504306    1             14901980   07-3月 -11 03.14.02.213 上午  165        ...    
4151 3437504306    1             14901790   07-3月 -11 03.10.52.183 上午  165        ...  
4151 3437504306    1             14901490   07-3月 -11 03.05.52.138 上午  167        ...
 
--級聯刪除(基線與快照一塊刪)
SQL> exec dbms_workload_repository.drop_baseline(baseline_name=>'apply_interest_2', cascade=>true);
 
SQL> select *from wrh$_active_session_history where snap_id in (4162,4163);
未選定行

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章