一、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);
未選定行