Oracle AWR快照管理与常见问题

1、手动创建Snapshots


exec dbms_workload_repository.create_snapshot();  
--或者 
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、修改快照设置


------查看快照策略  
set linesize 1000 pagesize 500  
col SNAP_INTERVAL for a20  
col RETENTION for a30  
select * from dba_hist_wr_control;  
  
------生成修改快照策略的语句  
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;  
  
------修改快照策略  
BEGIN  
   DBMS_WORKLOAD_REPOSITORY.MODIFY_SNAPSHOT_SETTINGS(retention => 18*24*60,  
                                                     INTERVAL => 30,  
                                                     dbid => 1328382724);  
 END;  
 /  

4、AWR生成常用脚本


--生成单实例 AWR 报告:  
@$ORACLE_HOME/rdbms/admin/awrrpt.sql  
  
--生成 Oracle RAC AWR 报告:  
@$ORACLE_HOME/rdbms/admin/awrgrpt.sql  
  
--生成 RAC 环境中特定数据库实例的 AWR 报告:  
@$ORACLE_HOME/rdbms/admin/awrrpti.sql  
  
--生成 Oracle RAC 环境中多个数据库实例的 AWR 报告的方法:  
@$ORACLE_HOME/rdbms/admin/awrgrpti.sql  
  
--生成 SQL 语句的 AWR 报告:  
@$ORACLE_HOME/rdbms/admin/awrsqrpt.sql  
  
--生成特定数据库实例上某个 SQL 语句的 AWR 报告:  
@$ORACLE_HOME/rdbms/admin/awrsqrpi.sql  
  
--生成单实例 AWR 时段对比报告  
@$ORACLE_HOME/rdbms/admin/awrddrpt.sql  
  
--生成 Oracle RAC AWR 时段对比报告  
@$ORACLE_HOME/rdbms/admin/awrgdrpt.sql  
  
--生成特定数据库实例的 AWR 时段对比报告  
@$ORACLE_HOME/rdbms/admin/awrddrpi.sql  
  
--生成 Oracle RAC 环境下特定(多个)数据库实例的 AWR 时段对比报告  
@$ORACLE_HOME/rdbms/admin/awrgdrpi.sql  

5、快速收集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;  



6、常见问题

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

原文链接

猜你喜欢

转载自blog.csdn.net/weixin_40581617/article/details/80179890