Oracle AWR快照管理与常见问题

Posted lYong90

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Oracle AWR快照管理与常见问题相关的知识,希望对你有一定的参考价值。

1、手动创建Snapshots

exec dbms_workload_repository.create_snapshot();
OR
BEGIN
DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ();
END
/

 

2、手动删除Snapshots

exec dbms_workload_repository.drop_snapshot_range(low_snap_id => 6770,high_snap_id => 6774,dbid => 4059638244);
OR
BEGIN
dbms_workload_repository.drop_snapshot_range(low_snap_id => 6770,
high_snap_id => 6774,
dbid => 4059638244);
END
/

这种方法删除是通过delete的会产生大量redo,建议直接删除相关分区

 

3、修改快照设置

-----查看快照策略
SQL> col SNAP_INTERVAL format a30
SQL> col RETENTION format a30
SQL> set linesize 150
SQL> select * from dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
---------- ------------------------------ ------------------------------ ----------
2956179842 +00000 00:30:00.0 +00016 00:00:00.0 DEFAULT
------生成修改快照策略的语句
set linesize 1000 pagesize 5000
col cmd for a200
SELECT exec DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 16*24*60,INTERVAL => 30,dbid =>  || DBID ||
 ); cmd
FROM dba_hist_wr_control;
------其他参数修改
DBMS_WORKLOAD_REPOSITORY.AWR_SET_REPORT_THRESHOLDS(
top_n_events IN NUMBER DEFAULT NULL,
top_n_files IN NUMBER DEFAULT NULL,
top_n_segments IN NUMBER DEFAULT NULL,
top_n_services IN NUMBER DEFAULT NULL,
top_n_sql IN NUMBER DEFAULT NULL,
top_n_sql_max IN NUMBER DEFAULT NULL,
top_sql_pct IN NUMBER DEFAULT NULL,
shmem_threshold IN NUMBER DEFAULT NULL,
versions_threshold IN NUMBER DEFAULT NULL);

exec DBMS_WORKLOAD_REPOSITORY.AWR_SET_REPORT_THRESHOLDS(top_n_sql=>30);
------修改快照策略
BEGIN
DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 18*24*60,
INTERVAL => 30,
dbid => 1328382724);
END
/

 

4、AWR生成常用脚本

-----相关脚本说明
?awrrpt.sql :生成指定快照区间的统计报表;
?awrrpti.sql :生成指定数据库实例,并且指定快照区间的统计报表;
?awrsqlrpt.sql :生成指定快照区间,指定SQL语句(实际指定的是该语句的SQLID)的统计报表;
?awrsqrpi.sql :生成指定数据库实例,指定快照区间的指定SQL语句的统计报表;
?awrddrpt.sql :指定两个不同的时间周期,生成这两个周期的统计对比报表;
?awrddrpi.sql :指定数据库实例,并指定两个的不同时间周期,生成这两个周期的统计对比报表;

--1.生成单实例 AWR 报告:
@$ORACLE_HOME/rdbms/admin/awrrpt.sql

--2.生成 Oracle RAC AWR 报告:
@$ORACLE_HOME/rdbms/admin/awrgrpt.sql

--3.生成 RAC 环境中特定数据库实例的 AWR 报告:
@$ORACLE_HOME/rdbms/admin/awrrpti.sql

--4.生成 Oracle RAC 环境中多个数据库实例的 AWR 报告的方法:
@$ORACLE_HOME/rdbms/admin/awrgrpti.sql

--5.生成 SQL 语句的 AWR 报告:
@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql

--6.生成特定数据库实例上某个 SQL 语句的 AWR 报告:
@$ORACLE_HOME/rdbms/admin/awrsqrpi.sql

----生成 AWR 时段对比报告
--7.生成单实例 AWR 时段对比报告
@$ORACLE_HOME/rdbms/admin/awrddrpt.sql

--9.生成 Oracle RAC AWR 时段对比报告
@$ORACLE_HOME/rdbms/admin/awrgdrpt.sql

--10.生成特定数据库实例的 AWR 时段对比报告
@$ORACLE_HOME/rdbms/admin/awrddrpi.sql

--11.生成 Oracle RAC 环境下特定(多个)数据库实例的 AWR 时段对比报告
@$ORACLE_HOME/rdbms/admin/awrgdrpi.sql

 

5、常见问题

5.1、AWR快照数据和ASH数据未正常产生,一般是由于Oracle mman和mmnl进程异常导致的,可以尝试下列方法解决

1)、重启一下mmon的刷新 
alter system set "_swrf_mmon_flush"=false; 
alter system set "_swrf_mmon_flush"=true;
2)、或者,找到mmon进程杀掉,让数据库自动重启一个新的mmon进程,或者重启下实例。 
ps -ef|grep mmon 
kill -9 xxxxxx

MMON负责执行与AWR相关的任务。包括收集数据库统计信息,收集AWR快照,启动各种自动维护作业JOB,生成超过阀值告警信息。
MMNL负责执行与ASH相关的任务。

5.2、生成awr报告时报错,抛出ORA-06502: PL/SQL: 数字或值错误 : 字符串缓冲区太小
ERROR:
ORA-06502: PL/SQL: numeric or value error: character string buffer too small
ORA-06512: at "SYS.DBMS_WORKLOAD_REPOSITORY", line 919
ORA-06512: at line 1
解决方法:

1、截断sql_text
update WRH$_SQLTEXT set sql_text = SUBSTR(sql_text, 1, 1000);
commit;
2、补丁13527323
Patch 13527323
3、 Use following workaround:
sqlplus / as sysdba
@$ORACLE_HOME/rdbms/admin/prvsawr.plb
@$ORACLE_HOME/rdbms/admin/prvtawr.plb


5.3、SYSAUX表空间中WRH$_ACTIVE_SESSION_HISTORY占用大量空间

SELECT owner,
segment_name,
partition_name,
segment_type,
bytes/1024/1024/1024 Size_GB
FROM dba_segments
WHERE segment_name=WRH$_ACTIVE_SESSION_HISTORY;
--修改参数手动出发AWR表的新分区生成
alter session set "_swrf_test_action" = 72;
--通过下列脚本获取AWR分区对应的快照ID
set serveroutput on 
declare 
CURSOR cur_part IS 
SELECT partition_name from dba_tab_partitions 
WHERE table_name = WRH$_ACTIVE_SESSION_HISTORY; 

query1 varchar2(200); 
query2 varchar2(200); 

TYPE partrec IS RECORD (snapid number, dbid number); 
TYPE partlist IS TABLE OF partrec; 

Outlist partlist; 
begin 
dbms_output.put_line(PARTITION NAME SNAP_ID DBID); 
dbms_output.put_line(--------------------------- ------- ----------); 

for part in cur_part loop 
query1 := select min(snap_id), dbid from sys.WRH$_ACTIVE_SESSION_HISTORY partition (||part.partition_name||) group by dbid; 
execute immediate query1 bulk collect into OutList; 
if OutList.count > 0 then 
for i in OutList.first..OutList.last loop 
dbms_output.put_line(part.partition_name|| Min ||OutList(i).snapid|| ||OutList(i).dbid); 
end loop; 
end if; 
query2 := select max(snap_id), dbid from sys.WRH$_ACTIVE_SESSION_HISTORY partition (||part.partition_name||) group by dbid; 
execute immediate query2 bulk collect into OutList; 
if OutList.count > 0 then 
for i in OutList.first..OutList.last loop 
dbms_output.put_line(part.partition_name|| Max ||OutList(i).snapid|| ||OutList(i).dbid); 
dbms_output.put_line(---); 
end loop; 
end if; 

end loop; 
end; 
/
----通过DBMS_WORKLOAD_REPOSITORY.DROP_SNAPSHOT_RANGE包删除快照信息,但是会产生大量的redo
直接删除相关分区更为便捷和迅速恢复业务
alter table WRH$_ACTIVE_SESSION_HISTORY drop partition WRH$_ACTIVE_692952975_0;

 

6、快速收集AWR/ASH/ADDM脚本

-------快速收集AWR
declare 
begin_time_date date := to_date(20141130 23:00:00, yyyymmdd hh24:mi:ss) ; 
end_time_date date := to_date(20141203 18:00:00, yyyymmdd hh24:mi:ss) ; 
begin 
dbms_output.put_line(set linesize 2000); 
dbms_output.put_line(set pagesize 50000); 
dbms_output.put_line(set head off); 
for r in (select * 
from sys.WRM$_SNAPSHOT t 
where t.begin_interval_time >begin_time_date 
and t.begin_interval_time< end_time_date 
and t.dbid=3628304518 
order by t.snap_id, t.instance_number) 
loop 
dbms_output.put_line(spool awrrpt_ || r.instance_number || _ || 
to_char(r.begin_interval_time+1/24,mmdd_hh24mi) || _ ||to_char(r.end_interval_time+1/24,mmdd_hh24mi) || .html); 
dbms_output.put_line(select * 
from table 
(dbms_workload_repository.awr_report_html( || 
r.dbid || , || r.instance_number || , || 
r.snap_id || , || (r.snap_id + 1) || ,0));); 
dbms_output.put_line(spool off); 
end loop; 
end;
---------快速收集ASH
declare 
begin_time_date date := to_date(20141130 23:00:00, 
yyyymmdd hh24:mi:ss); 
end_time_date date := to_date(20141203 13:00:00, 
yyyymmdd hh24:mi:ss); 
interval_minutes number := 60; 
begin 
dbms_output.put_line(set linesize 2000); 
dbms_output.put_line(set pagesize 50000); 
dbms_output.put_line(set head off); 
for r in (select db.DBID, 
ins.INSTANCE_NUMBER, 
begin_time_date + interval_minutes * (lv - 1) / 1440 begin_time_date, 
begin_time_date + interval_minutes * lv / 1440, 
yyyymmdd hh24:mi:ss end_time_date, 
to_char(begin_time_date + 60 * (lv - 1) / 1440, 
yyyymmddhh24mi) begin_time, 
to_char(begin_time_date + 60 * lv / 1440, 
yyyymmddhh24miss) end_time 
from (select /*+ no_merge*/ 
level lv 
from dual 
connect by level <= (end_time_date - begin_time_date) * 60 * 24 / 
interval_minutes), 
gv$instance ins, 
v$database db) loop 
dbms_output.put_line(spool ashrpt_ || to_char(r.instance_number) || _ || 
r.begin_time || - || r.end_time || .html); 

dbms_output.put_line(select output from table(dbms_workload_repository.ash_report_html(  || 
r.dbid ||  ,  || r.instance_number ||  ,  || 
to_date( || ‘‘‘‘ || r.begin_time || 
‘‘‘, ‘‘yyyymmddhh24miss‘‘‘ || ) ||  ,  || 
to_date( || ‘‘‘‘ || r.end_time || 
‘‘‘, ‘‘yyyymmddhh24miss‘‘‘ || )));); 

dbms_output.put_line(spool off ); 
end loop; 
end;
---------------快速收集ADDM
declare
begin_time_date date := to_date(20141109 15:00:00, yyyymmdd hh24:mi:ss) ;
end_time_date date := to_date(20141109 19:00:00, yyyymmdd hh24:mi:ss) ;

begin
dbms_output.put_line(set linesize 100);
dbms_output.put_line(set pagesize 50000);
dbms_output.put_line(set head off);
dbms_output.put_line(serveroutput ON SIZE UNLIMITED );
dbms_output.put_line(spool addm.txt);
for r in (select *
from sys.WRM$_SNAPSHOT t
where t.begin_interval_time >=begin_time_date 
and t.begin_interval_time<= end_time_date 
order by t.snap_id, t.instance_number)

loop
dbms_output.put_line(declare 
id number ;
name varchar2(100) ;
v_dec varchar2(200) :=||‘‘‘addm_||to_char(r.snap_id)||_||to_char(r.snap_id+1)||‘‘‘;);
dbms_output.put_line( begin ) ;
dbms_output.put_line( dbms_advisor.create_task(‘‘ADDM‘‘,id,name,v_dec,null););
dbms_output.put_line( dbms_advisor.set_task_parameter(name, ||‘‘‘START_SNAPSHOT‘‘,||r.snap_id||);) ;
dbms_output.put_line( dbms_advisor.set_task_parameter(name,  ||‘‘‘END_SNAPSHOT‘‘,||to_char(r.snap_id+1)||);) ;
dbms_output.put_line( dbms_advisor.set_task_parameter(name, ||‘‘‘INSTANCE‘‘,||r.instance_number||);) ;
dbms_output.put_line( dbms_advisor.set_task_parameter(name, ||‘‘‘DB_ID‘‘,||r.dbid||);) ;
dbms_output.put_line( dbms_advisor.execute_task(name); ) ;
dbms_output.put_line(dbms_output.put_line(||‘‘‘#spool addm_ || r.instance_number || _ ||
r.snap_id || _ || (r.snap_id + 1) || .txt‘‘););
dbms_output.put_line(dbms_output.put_line(||‘‘‘#select dbms_advisor.get_task_report(‘‘‘‘‘‘‘||||name||‘‘‘‘‘‘,
||‘‘‘‘‘TEXT‘‘‘‘,‘‘‘‘TYPICAL‘‘‘‘) from dual ;‘‘);); 
dbms_output.put_line(dbms_output.put_line(‘‘#spool off‘‘););
dbms_output.put_line(end ; 
/);
end loop;
dbms_output.put_line(spool off);
end
/

 

 


参考文档:
AWR Diagnostic Collection Script (Doc ID 733655.1)
Getting ORA-06502 and ORA-06512 Errors When Running AWR Report in HTML Format (Doc ID 2231743.1)
How To Avoid the AWR Usage Without Having Diagnostic Pack License (Doc ID 2276199.1)
WRH$_ACTIVE_SESSION_HISTORY Does Not Get Purged Based Upon the Retention Policy (Doc ID 387914.1)


























以上是关于Oracle AWR快照管理与常见问题的主要内容,如果未能解决你的问题,请参考以下文章

手工生成oracle快照

oracle awr的相关语法

oracle的快照和基线

Oracle数据库创建awr基线

awr报告基础

提取oracle awr报告