1.檢視目前的AWR儲存政策
select * from dba_hist_wr_control;
DBID,SNAP_INTERVAL,RETENTION,TOPNSQL
860524039,+00 01:00:00.000000,+07 00:00:00.000000,DEFAULT
以上結果表示,每小時産生一個SNAPSHOT,保留7天
2.調整AWR配置
AWR配置都是通過dbms_workload_repository包進行配置
2.1調整AWR産生snapshot的頻率和保留政策,如:如将收集間隔時間改為30 分鐘一次。并且保留5天時間(注:機關都是為分鐘):
exec dbms_workload_repository.modify_snapshot_settings(interval=>30, retention=>5*24*60);
2.2關閉AWR,把interval設為0則關閉自動捕捉快照
2.3手工建立一個快照
exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
2.4 檢視快照
select * from sys.wrh$_active_session_history
2.5手工删除指定範圍的快照
exec WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE(low_snap_id => 22, high_snap_id => 32, dbid => 3310949047);
2.6建立baseline
exec dbms_workload_repository.create_baseline (56,59,'apply_interest_1')
2.7删除baseline
exec DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => ' apply_interest_1', cascade => FALSE);
3.生産AWR報告
$ORACLE_HOME/rdbms/admin/awrrpt.sql
4.1 Snapshots( 快照)
前面操作報表生成時,snap這個關鍵字已經出現過多次了,想必你對它充滿了疑惑,這個東西是哪來的咋來的誰讓它來的呢?事實上,Snap是Snapshot的簡寫,這正是AWR在自動性方面的展現,雖然你沒有建立,但是AWR自動幫你建立了(當然也可以手動建立snapshot),并且是定時(每小時)建立,定期清除(保留最近7天)。
Snapshots 是一組某個時間點時曆史資料的集合,這些資料就可被ADDM(Automatic Database Diagnostic Monitor)用來做性能對比。預設情況下,AWR能夠自動以每小時一次的頻率生成Snapshots性能資料,并保留7天,,如果需要的話,DBA可以通過DBMS_WORKLOAD_REPOSITORY過程手動建立、删除或修改snapshots。
- 提示:調用DBMS_WORKLOAD_REPOSITORY包需要擁有DBA權限。
4.1.1 手動建立Snapshots
手動建立Snapshots,通過DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT過程,例如:
SQL> exec dbms_workload_repository.create_snapshot();
- PL/SQL procedure successfully completed.
然後可以通過DBA_HIST_SNAPSHOT 視圖檢視剛剛建立的Snapshots資訊。
4.1.2 手動删除Snapshots
删除Snapshots是使用DBMS_WORKLOAD_REPOSITORY包的另一個過程:DROP_SNAPSHOT_RANGE,該過程在執行時可以通過指定snap_id的範圍的方式一次删除多個Snapshots,例如:
SQL> select count(0) from dba_hist_snapshot where snap_id between 7509 and 7518;
COUNT(0)
----------
10
SQL> begin
2 dbms_workload_repository.drop_snapshot_range(
3 low_snap_id => 7509,
4 high_snap_id => 7518,
5 dbid => 3812548755);
6 end;
7 /
注意當snapshots被删除的話,與其關聯的ASH記錄也會級聯删除。
4.1.3 修改Snapshots設定
通過MODIFY_SNAPSHOT_SETTINGS過程,DBA可以調整包括快照收集頻率、快照儲存時間、以及捕獲的SQL數量三個方面的設定。分别對應MODIFY_SNAPSHOT_SETTINGS的三個參數:
- Retention :設定快照儲存的時間,機關是分鐘。可設定的值最小為1天,最大為100年。設定該參數值為0的話,就表示永久保留收集的快照資訊。
- Interval :設定快照收集的頻率,以分鐘為機關。可設定的值最小為10分鐘,最大為1年。如果設定該參數值為0,就表示禁用AWR特性。
- Topnsql :指定收集的比較占用資源的SQL數量,可設定的值最小為30,最大不超過100000000。
檢視目前快照收集的相關設定,可以通過DBA_HIST_WR_CONTROL視圖檢視,例如:
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- ------------------------ -------------------- ----------
- 3812548755 +00000 01:00:00.0 +00007 00:00:00.0 DEFAULT
又比如通過MODIFY_SNAPSHOT_SETTTINGS過程修改snap_intrval的設定:
SQL> exec dbms_workload_repository.modify_snapshot_settings(interval=>120);
- 3812548755 +00000 02:00:00.0 +00007 00:00:00.0 DEFAULT
4.2 Baselines( 基線)
Baseline ,直譯的話叫做基線,顧名思義的方式了解,就是用于比較的基本線。因為Baseline中包含指定時間點時的性能資料,是以就可以用來與其它時間點時的狀态資料做對比,以分析性能問題。
建立Baseline時,Snapshots是做為其中的一個組成部分存在,是以一般來說當AWR自動維護快照時,如果定義過baseline,與baseline相關的快照不會被删除,即使是過期的快照,這樣就相當于手動保留了一份統計資料的曆史資訊,DBA可以在适當的時間将其與現有的快照進行對比,以生成相關的統計報表。
使用者可以通過DBMS_WORKLOAD_REPOSITORY包中的相關過程,手動的建立或删除Baseline。
4.2.1 建立Baseline
建立Baseline使用CREATE_BASELINE過程,執行該過程時分别指定開始和結果的snap_id,然後為該baseline定義一個名稱即可,例如:
SQL> BEGIN
2 DBMS_WORKLOAD_REPOSITORY.CREATE_BASELINE(start_snap_id => 7550,
3 end_snap_id => 7660,
4 baseline_name => ¨am_baseline¨);
5 END;
6 /
SQL> select dbid,baseline_name,start_snap_id,end_snap_id from dba_hist_baseline;
DBID BASELINE_NAME START_SNAP_ID END_SNAP_ID
---------- -------------------- ------------- -----------
- 3812548755 am_baseline 7550 7660
4.2.2 删除Baseline
删除Baseline使用DROP_BASELINE過程,删除時可以通過cascade參數選擇是否将其關聯的Snapshots級别進行删除,例如:
2 DBMS_WORKLOAD_REPOSITORY.DROP_BASELINE(baseline_name => ¨am_baseline¨,
3 cascade => true);
4 END;
5 /
SQL> select * from dba_hist_baseline;
no rows selected
SQL> select * from dba_hist_snapshot where snap_id between 7550 and 7660;
如上例中所示,删除時指定了cascade參數值為true,對應的snap也被級聯删除了。
不管是EM也好,或是前面示範中使用的awr*.sql腳本也好,實質都是通路ORACLE中的部分相關視圖來生成統計資料,是以如果DBA對自己的了解能力有足夠的自信,也可以直接查詢動态性能視圖(或相關資料字典)的方式來擷取自己想要的那部分性能資料。ORACLE将這部分性能統計資料儲存在DBA_HIST開頭的資料字典中,要查詢目前執行個體所有能夠通路的DBA_HIST字典,可以通過下列語句:
SQL> select * from dict where table_name like ¨DBA_HIST%¨;
TABLE_NAME COMMENTS
------------------------------ --------------------------------------------------------------------------------
DBA_HIST_DATABASE_INSTANCE Database Instance Information
DBA_HIST_SNAPSHOT Snapshot Information
DBA_HIST_SNAP_ERROR Snapshot Error Information
DBA_HIST_BASELINE Baseline Metadata Information
DBA_HIST_WR_CONTROL Workload Repository Control Information
DBA_HIST_DATAFILE Names of Datafiles
DBA_HIST_FILESTATXS Datafile Historical Statistics Information
DBA_HIST_TEMPFILE Names of Temporary Datafiles
DBA_HIST_TEMPSTATXS Temporary Datafile Historical Statistics Information
DBA_HIST_COMP_IOSTAT I/O stats aggregated on component level
DBA_HIST_SQLSTAT SQL Historical Statistics Information
DBA_HIST_SQLTEXT SQL Text
......................
- ........................
ORACLE 資料庫中以DBA_HIST命名的視圖非常多,下面簡單介紹幾個,比如說:
V$ACTIVE_SESSION_HISTORY
該視圖由ASH自動維護,以每秒一次的頻率收集目前系統中活動session的資訊。雖然說是記錄SESSION的曆史記錄,不過該視圖與V$SESSION還是有差異的。
SQL> desc v$active_session_history;
Name Type Nullable Default Comments
------------------------- ------------ -------- ------- --------
SAMPLE_ID NUMBER Y
SAMPLE_TIME TIMESTAMP(3) Y
SESSION_ID NUMBER Y
SESSION_SERIAL# NUMBER Y
USER_ID NUMBER Y
SQL_ID VARCHAR2(13) Y
SQL_CHILD_NUMBER NUMBER Y
SQL_PLAN_HASH_VALUE NUMBER Y
FORCE_MATCHING_SIGNATURE NUMBER Y
SQL_OPCODE NUMBER Y
PLSQL_ENTRY_OBJECT_ID NUMBER Y
PLSQL_ENTRY_SUBPROGRAM_ID NUMBER Y
PLSQL_OBJECT_ID NUMBER Y
PLSQL_SUBPROGRAM_ID NUMBER Y
SERVICE_HASH NUMBER Y
SESSION_TYPE VARCHAR2(10) Y
SESSION_STATE VARCHAR2(7) Y
QC_SESSION_ID NUMBER Y
QC_INSTANCE_ID NUMBER Y
BLOCKING_SESSION NUMBER Y
BLOCKING_SESSION_STATUS VARCHAR2(11) Y
BLOCKING_SESSION_SERIAL# NUMBER Y
EVENT VARCHAR2(64) Y
EVENT_ID NUMBER Y
EVENT# NUMBER Y
SEQ# NUMBER Y
P1TEXT VARCHAR2(64) Y
P1 NUMBER Y
P2TEXT VARCHAR2(64) Y
P2 NUMBER Y
P3TEXT VARCHAR2(64) Y
P3 NUMBER Y
WAIT_CLASS VARCHAR2(64) Y
WAIT_CLASS_ID NUMBER Y
WAIT_TIME NUMBER Y
TIME_WAITED NUMBER Y
XID RAW(8) Y
CURRENT_OBJ# NUMBER Y
CURRENT_FILE# NUMBER Y
CURRENT_BLOCK# NUMBER Y
PROGRAM VARCHAR2(48) Y
MODULE VARCHAR2(48) Y
ACTION VARCHAR2(32) Y
- CLIENT_ID VARCHAR2(64) Y
v$session 中與操作相關的列均被收集,除此之外還備援了部分列,這是為了友善DBA查詢V$ACTIVE_SESSION_HISTORY時能夠快速擷取到自己需要的資料。
DBA_HIST_ACTIVE_SESS_HISTORY
該視圖與V$ACTIVE_SESSION_HISTORY的結構灰常灰常灰常的想像,功能也灰常灰常灰常的類似,都是記錄活動session的操作記錄,所不同點在于,V$ACTIVE_SESSION_HISTORY是ORACLE自動在記憶體中維護的,受制于其可用記憶體區限制,并非所有記錄都能儲存,而DBA_HIST_ACTIVE_SESS_HISTORY視圖則是維護到磁盤中的。簡單了解的話,就是說通常情況下,DBA_HIST_ACTIVE_SESS_HISTORY視圖的資料量要比V$ACTIVE_SESSION_HISTORY的多。
- 提示:上述結構并不絕對,因為預設情況下DBA_HIST_ACTIVE_SESS_HISTORY字典的資料每10秒收集一次,而V$ACTIVE_SESSION_HISTORY中則是每秒一次,是以也有可能V$ACTIVE_SESSION_HISTORY中記錄量更大。不過相對來說,DBA_HIST字典中儲存的資料更長久。
DBA_HIST_DATABASE_INSTANCE
該視圖用來顯示資料庫和執行個體的資訊,比如DBID,執行個體名,資料庫版本等等資訊,生成報表中第一行表格,就是由該視圖生成的。如圖:

如果你去分析awrrpt.sql腳本的話,會發現其中有如下腳本,上述表格中顯示的内容資訊,正是來自于下列腳本:
select distinct
(case when cd.dbid = wr.dbid and
cd.name = wr.db_name and
ci.instance_number = wr.instance_number and
ci.instance_name = wr.instance_name
then ¨* ¨
else ¨ ¨
end) || wr.dbid dbbid
, wr.instance_number instt_num
, wr.db_name dbb_name
, wr.instance_name instt_name
, wr.host_name host
- from dba_hist_database_instance wr, v$database cd, v$instance ci;
DBA_HIST_SNAPSHOT
該視圖用來記錄目前資料庫收集到的快照資訊。相信朋友應該還記得之前使用腳本生成報表時,輸入完快照區間後顯示的一堆清單,沒錯,那正是DBA_HIST_SNAPSHOT記錄的内容,該段功能對應的代碼如下:
select to_char(s.startup_time,¨dd Mon "at" HH24:mi:ss¨) instart_fmt
, di.instance_name inst_name
, di.db_name db_name
, s.snap_id snap_id
, to_char(s.end_interval_time,¨dd Mon YYYY HH24:mi¨) snapdat
, s.snap_level lvl
from dba_hist_snapshot s
, dba_hist_database_instance di
where s.dbid = :dbid
and di.dbid = :dbid
and s.instance_number = :inst_num
and di.instance_number = :inst_num
and di.dbid = s.dbid
and di.instance_number = s.instance_number
and di.startup_time = s.startup_time
and s.end_interval_time >= decode( &num_days
, 0 , to_date(¨31-JAN-9999¨,¨DD-MON-YYYY¨)
, 3.14, s.end_interval_time
, to_date(:max_snap_time,¨dd/mm/yyyy¨) - (&num_days-1))