`

ADDM

 
阅读更多

DECLARE
   L_FROM_TIME                   TIMESTAMP;
   L_TO_TIME                     TIMESTAMP;
   L_MIN_ID                      DBA_HIST_SNAPSHOT.SNAP_ID%TYPE;
   L_MAX_ID                      DBA_HIST_SNAPSHOT.SNAP_ID%TYPE;
   L_START_NODE                  DBA_HIST_SNAPSHOT.INSTANCE_NUMBER%TYPE;
   L_END_NODE                    DBA_HIST_SNAPSHOT.INSTANCE_NUMBER%TYPE;
   L_DB_NAME                     V$DATABASE.NAME%TYPE;
   L_DB_ID                       V$DATABASE.DBID%TYPE;
   L_START_TIME                  DBA_HIST_SNAPSHOT.BEGIN_INTERVAL_TIME%TYPE;
   L_INTERVAL_MIN                NUMBER := 0;
   L_INPUT_INTERVAL              NUMBER := 0;
   L_COUNT                       NUMBER := 0;
   L_SNAP_DIFF                   NUMBER := 0;
   L_RPT_FORMAT					 VARCHAR2(10);
   L_START_SNAP_ID               NUMBER;
   L_END_SNAP_ID                 NUMBER;
   L_TASK_NAME                   VARCHAR2(50);   
   L_TASK_ID                     NUMBER; 
BEGIN
   BEGIN
      L_FROM_TIME := TO_TIMESTAMP ('&&1' ||lpad('&&2',4,0), 'YYYYMMDDHH24MI');
      L_TO_TIME := TO_TIMESTAMP ('&&1' || lpad('&&3',4,0),  'YYYYMMDDHH24MI');
      L_INPUT_INTERVAL := TO_NUMBER ('&&4');    
      L_RPT_FORMAT := UPPER('&&5');  
      IF L_RPT_FORMAT <> 'TEXT' THEN
         L_RPT_FORMAT := 'TEXT';
         DBMS_OUTPUT.PUT_LINE('--Error Unknown Report Format - Both HTML and TEXT formatted reports will be generated');         
      END IF;     

   EXCEPTION
      WHEN OTHERS
      THEN
         DBMS_OUTPUT.PUT_LINE (SQLERRM);
         DBMS_OUTPUT.PUT_LINE('--Error input format: Date ('||'&&1'||') should in YYYYMMDD, From time (&&2) and to time (&&3) must be hour and minutes');
         GOTO EXIT_LOOP;
   END;

   if (l_to_time<l_from_time) then
      	 DBMS_OUTPUT.PUT_LINE('--Error time range: From time '||to_char(l_from_time,'YYYYMMDD HH24MI')||' later than to time '||to_char(l_to_time,'YYYYMMDD HH24MI'));
         GOTO EXIT_LOOP;
   end if;

   SELECT DBID, NAME
   INTO   L_DB_ID, L_DB_NAME
   FROM   V$DATABASE;

   SELECT DISTINCT
          MIN (SNAP_ID) - 1,
          MAX (SNAP_ID),
          MIN (INSTANCE_NUMBER),
          MAX (INSTANCE_NUMBER),
          MIN (BEGIN_INTERVAL_TIME),
          ROUND(MIN(TO_DATE (TO_CHAR (END_INTERVAL_TIME, 'YYYYMMDDHH24MI'),
                               'YYYYMMDDHH24MI')
                      - TO_DATE (
                           TO_CHAR (BEGIN_INTERVAL_TIME, 'YYYYMMDDHH24MI'),
                           'YYYYMMDDHH24MI'
                        ))*1440
                )
   INTO   L_MIN_ID,
          L_MAX_ID,
          L_START_NODE,
          L_END_NODE,
          L_START_TIME,
          L_INTERVAL_MIN
   FROM   DBA_HIST_SNAPSHOT
   WHERE  BEGIN_INTERVAL_TIME >= L_FROM_TIME
      AND END_INTERVAL_TIME <= L_TO_TIME;

   IF (L_INPUT_INTERVAL / L_INTERVAL_MIN < 1)
   THEN
      L_SNAP_DIFF := 1;
      L_INPUT_INTERVAL:=L_INTERVAL_MIN;
   ELSE
      L_SNAP_DIFF := ROUND (L_INPUT_INTERVAL / L_INTERVAL_MIN);
   END IF;

   DBMS_OUTPUT.PUT_LINE('set feedback off echo off serveroutput off wrap on pagesize 0 linesize 1000 trimspool on ');

   FOR X IN 1 .. (L_MAX_ID - L_MIN_ID) / L_SNAP_DIFF
   LOOP
      FOR Y IN L_START_NODE .. L_END_NODE
      LOOP

         L_START_SNAP_ID :=  L_MIN_ID + L_COUNT * L_SNAP_DIFF;
         L_END_SNAP_ID := L_MIN_ID + (L_COUNT + 1) * L_SNAP_DIFF;

         -- Create ADDM Reports
         dbms_advisor.create_task('ADDM',L_TASK_ID,L_TASK_NAME,'run_addm('||L_START_SNAP_ID||','|| L_END_SNAP_ID||''')');
         dbms_advisor.set_task_parameter(L_TASK_NAME,'START_SNAPSHOT',L_START_SNAP_ID);
         dbms_advisor.set_task_parameter(L_TASK_NAME,'END_SNAPSHOT',L_END_SNAP_ID);
         dbms_advisor.set_task_parameter(L_TASK_NAME,'INSTANCE',Y);
         dbms_advisor.execute_task(L_TASK_NAME);
         dbms_output.put_line('--Task#' || L_TASK_ID || ' (' || L_TASK_NAME || ')');

         -- text version ONLY
      	 DBMS_OUTPUT.PUT_LINE(   'spool c:\temp\online_60\'
                              || L_DB_NAME
                              || Y
                              || '_&&1'
                              || '_'
                              || TO_CHAR (
                                    L_START_TIME
                                    +   L_COUNT                                     
                                      * L_INPUT_INTERVAL
                                      / 1440,
                                    'HH24MI'
                                 )
                              || '_to_'
                              || TO_CHAR (
                                    L_START_TIME
                                    +   (L_COUNT + 1)                                     
                                      * L_INPUT_INTERVAL
                                      / 1440,
                                    'HH24MI'
                                 )
                              || '_ADDM.txt');
         DBMS_OUTPUT.PUT_LINE('SET LONG 1000000');
         DBMS_OUTPUT.PUT_LINE('SET PAGESIZE 50000'); 
         DBMS_OUTPUT.PUT_LINE('COLUMN GET_CLOB FORMAT A80');
         DBMS_OUTPUT.PUT_LINE('SELECT dbms_advisor.get_task_report('        	                              	                      
                              || ''''||L_TASK_NAME||''','        	                      
                              || ''''||L_RPT_FORMAT||''','
                              || '''ALL'','        	                      
                              || '''ALL'','        	                      
                              || 'NULL'   
                              || ') as addm_rep from dba_advisor_tasks where task_id = '||L_TASK_ID||';'
                              );
         DBMS_OUTPUT.PUT_LINE ('spool off;');                

         L_TASK_NAME := NULL;

      END LOOP;

      L_COUNT := L_COUNT + 1;
   END LOOP;


  <<exit_loop>>
   NULL;
EXCEPTION
   WHEN NO_DATA_FOUND
   THEN
      DBMS_OUTPUT.PUT_LINE(   '--NO DATA FOUND BETWEEN '
                           || TO_CHAR (L_FROM_TIME, 'YYYYMMDD HH24MI')
                           || ' and  '
                           || TO_CHAR (L_TO_TIME, 'YYYYMMDD HH24MI'));
WHEN OTHERS
   THEN
      DBMS_OUTPUT.PUT_LINE(   '--Error:');
      DBMS_OUTPUT.PUT_LINE(  SQLERRM);
END;
/
 

-- A simple version:
DECLARE
    task_name VARCHAR2(30) := 'DEMO_ADDM01';
    task_desc VARCHAR2(30) := 'ADDM Feature Test';
    task_id NUMBER;
BEGIN
    dbms_advisor.create_task('ADDM', task_id, task_name, task_desc, null);
    dbms_advisor.set_task_parameter(task_name, 'START_SNAPSHOT', 65);
    dbms_advisor.set_task_parameter(task_name, 'END_SNAPSHOT', 66);
    dbms_advisor.set_task_parameter(task_name, 'INSTANCE', 1);
    dbms_advisor.set_task_parameter(task_name, 'DB_ID', 1712582900);
    dbms_advisor.execute_task(task_name);
END;
/
 
分享到:
评论

相关推荐

    ORACLE数据库(11g或10g)AWR与ADDM报告收集方法

    ORACLE数据库的AWR与ADDM报告是分析和优化数据库性能的重要工具。AWR(自动工作负载仓库)能够收集并报告数据库的性能数据,而ADDM(自动数据库诊断监视器)则基于AWR的数据提供深入的诊断建议。以下是收集AWR与ADDM...

    Oracle ADDM报告指标分析

    ### Oracle ADDM报告指标分析 #### 一、ADDM概览 ADDM(Automatic Database Diagnostic Monitor,自动数据库诊断管理)是Oracle 10g引入的一种强大的数据库自我诊断工具。它通过对AWR(Automatic Workload ...

    oracle ADDM 自动诊断监视工具

    ### Oracle ADDM自动诊断监视工具详解 #### 一、ADDM概述与背景 ADDM,全称Automatic Database Diagnostic Monitor,是Oracle数据库系统中内置的一种自动诊断引擎,旨在帮助数据库管理员(DBA)更有效地识别和解决...

    oracle ADDM自动诊断监视工具

    oracle ADDM自动诊断监视工具 oracle ADDM自动诊断监视工具

    oracle 生成ADDM和AWR的脚本

    Linux下生成oracle awr和addm的数据库脚本。通过生产环境测试。

    Oracle+10G+最佳20位新特性:SQL+Advisor+和+ADDM_IT168文库

    Oracle数据库10g版本引入了许多新的特性和改进,其中20个最出色的新特性包括了SQL Advisor和ADDM(自动数据库诊断监视器)。这些特性共同助力数据库管理员和开发者以更加高效和智能的方式管理数据库。以下是对Oracle...

    awr addm ash 相关脚本功能分析

    $ORACLE_HOME/rdbms/admin目录下awr,addm,ash相关脚本功能分析

    sql学习 addm体验.sql

    sql学习 addm体验.sql

    施耐德M340的以太网通讯程序以及数据处理

    在实际编程中,常用ST(结构化文本)语言表达ADDM指令的功能,格式为ADDM('地址标识'),其中地址标识包含了机架号、模块位置、通道编号和IP地址等。 READ_VAR指令用于从指定的地址读取数据,可以读取的类型包括内...

    DiscoEnhancements:此扩展为BMC发现(ADDM)UI提供了一些简单的增强

    BMC发现的DiscoEnhancements版本1.5traversys.io 此适度的扩展旨在为发现UI带来一些有用的增强支持BMC ADDM / Discovery的11+版本新的更新了RAW编辑器,以允许复制文本和快速编辑。 全局仪表板下拉列表。 CMDB同步和...

    使用shell定制addm脚本

    【使用Shell定制ADDM脚本】是针对Oracle数据库性能优化的一种高效方法,特别是在10g版本之后,ADDI Maintenance Wizard(ADDM)成为了自动化诊断和调整的重要工具。ADDM能够基于Automatic Workload Repository (AWR)...

    Oracle数据库优化经验

    ### Oracle数据库优化经验——ADDM应用详解 #### 一、ADDM概述 **ADDM**(Automatic Database Diagnostic Monitor,自动数据库诊断监视器)是Oracle数据库管理工具中的一个重要组件,旨在帮助数据库管理员(DBA)快速...

    Oracle_11g_面向DBA的新功能学习指南 less08

    《Oracle 11g DBA新功能深度解析:ADDM在RAC环境下的应用》 在Oracle Database 11g的版本更新中,面向数据库管理员(DBA)的新增功能不仅提升了数据库的性能与稳定性,更在数据库管理和维护方面带来了诸多便利。其中...

    Oracle常用分析诊断工具.pdf

    本文主要介绍了四个常用的Oracle分析诊断工具:AWR、ASH、ADDM以及它们的应用。 1. AWR(Automatic Workload Repository)是Oracle 10g引入的新特性,用以替代之前的Statspack。AWR提供了全面的数据库性能信息,...

    oracle 学习资料

    在Oracle的学习过程中,理解并掌握自动数据库诊断监控程序(ADDM)是至关重要的一步。ADDM是Oracle企业管理器(OEM)的一个关键组件,它在Oracle 10g版本中首次引入,以替代旧有的OEM Expert工具,提供了更为全面和...

    oracle_admm

    ADDM利用Automatic Workload Repository (AWR)收集的性能数据,定期进行数据库性能分析,寻找并提出性能优化建议。AWR是Oracle数据库自动生成的一种性能数据存储,它捕获了数据库的性能指标,包括SQL语句、等待事件...

    Oracle运维最佳实践-下.pdf 带书签

    - 提供了一系列策略和工具,如ADDM、AWR快照等,来帮助运维人员提前发现问题。 - 实例: - 定期创建AWR快照,使用`DBMS_WORKLOAD_REPOSITORY.SNAPSHOT`。 - 使用`DBMS_MONITOR.SESSION_MONITOR`来监控关键会话。...

    oracle性能日志分析报告收集方法

    - **ADDM**:ADDM是基于AWR数据生成的一组诊断报告,它能够帮助我们快速定位导致性能问题的原因。ADDM报告通常包含了对性能问题的根本原因分析以及相应的改进建议。 #### 二、通过OEM收集Oracle性能日志 在Oracle ...

    Oracle10g数据库自动诊断监视工具

    Oracle10g数据库自动诊断监视工具(ADDM)是Oracle数据库10g版本引入的一个重要特性,用于自动化数据库性能问题的诊断和优化建议。ADDM与SQL优化建议工具(SQL Tuning Advisor, STA)共同工作,极大地减轻了DBA的...

Global site tag (gtag.js) - Google Analytics