AWR的由來:
10g之前的oracle:用戶的連接將產生會話,當前會話記錄保存在v$session中;處於等待狀態的會話會被複制一份放在v$session_wait中。當該連接
斷開後,其原來的連接信息在v$session和v$session_wait中就會被刪除;oracle10g及之後保留下了v$session_wait中的這些信息,並多了
v$active_session_history(ASH)視圖,記錄每個活動session在v$session_wait中最近10次的等待事件。
ASH的採樣數據是保存在內存中。而分配給ASH的內存空間是有限的,當所分配空間佔滿後,舊的記錄就會被覆蓋掉;而且數據庫重啓後,所有的這些
ASH信息都會消失。這樣,對於長期檢測oracle的性能是不可能的。在Oracle10g中,提供了永久保留ASH信息的方法,這就是AWR。
由於全部保存ASH中的信息是非常耗費時間和空間的,AWR採用的策略是:每小時對v$active_session_history進行採樣一次,並將信息保存到磁盤
中,並且保留7天,7天后舊的記錄纔會被覆蓋。這些採樣信息被保存在視圖wrh$_active_session_history中。而這個採樣頻率(1小時)和保留時間
(7天)是可以根據實際情況進行調整的,這就給DBA們提供了更加有效的系統監測工具。
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。
初始化參數statistics_level介紹:
AWR的行爲受到參數STATISTICS_LEVEL的影響。這個參數有三個值:
*BASIC:awr統計的計算和衍生值關閉.只收集少量的數據庫統計信息.
*TYPICAL:默認值.只有部分的統計收集.他們代表需要的典型監控oracle數據庫的行爲.
*ALL : 所有可能的統計都被捕捉. 並且有操作系統的一些信息.這個級別的捕捉應該在很少的情況下,比如你要更多的sql診斷信息的時候才使用.
2.快照(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;
3.採樣數據存放位置
這些採樣數據都存儲在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$%';
4. 設置基線
4.1創建基線
基線(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');
像這樣把快照分隔在僅僅幾個集合中有助於研究調整對於性能量度的影響。
4.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);
未選定行
5.產生AWR報告
Oracle可以產生兩種類型的AWR報告:文本格式和HTML 格式。HTML格式的報告界面更加友好。AWR報告用於顯示兩個快照或者兩個時間點之間捕捉到
的數據。AWR報告其實就是一張數據庫健康體檢表,它顯示了數據庫健康的各項指標。
有針對整個數據庫的AWR報告,有針對某個實例的AWR報告(在集羣環境),有針對單條SQL語句的AWR報告。通過運行Oracle自帶的SQL腳本產生
AWR報告,只是產生不同的AWR報告,需要運行不同的腳本。
--產生整個數據庫的AWR報告,運行腳本awrrpt.sql。
@$ORACLE_HOME/rdbms/admin/awrrpt.sql
--產生某個實例的AWR報告,運行腳本awrrpti.sql。
@$ORACLE_HOME/rdbms/admin/awrrpti.sql
--產生某條SQL語句的AWR報告,運行腳本awrsqrpt.sql。
@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql
--注: $ORACLE_HOME代表Oracle的主目錄。
示例:產生整個數據庫的AWR報告。本例中,Oracle的主目錄是 /oracle/product/10.2.0/db_1/rdbms/admin
運行腳本awrrpt.sql。
SQL> @/oracle/product/10.2.0/db_1/rdbms/admin/awrrpt.sql
選擇報告的類型。
1. 輸入 report_type 的值: html
本例中選擇HTML。
列出最近兩天產生的快照(主要是獲得快照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
注意:輸入報告名後回車出現 ORA-00904:: invalid identified value
解決辦法:用sys用戶來執行或者對用戶進行授權 grant all on dbms_workload_repository to perfstat;