`
wuhuizhong
  • 浏览: 686582 次
  • 性别: Icon_minigender_1
  • 来自: 中山
社区版块
存档分类
最新评论

定期清除STATSPACK舊的資料

阅读更多

1.創建PACKAGE:

CREATE OR REPLACE PACKAGE statspack_admin AS

  PROCEDURE purge_older_than_days(days      IN INTEGER,
                                  area_size IN INTEGER DEFAULT NULL);

  /*
  -- submit a job to run every day at 3am 
  deleting snaps older than 30 days
  -- specifying 50Mb for PGA.
  
  DECLARE
  j BINARY_INTEGER;
  BEGIN
  DBMS_JOB.SUBMIT(j, 'statspack_admin.purge_older_than_days(30, 52428800);', 
  TRUNC(SYSDATE) (3/24), 'TRUNC(SYSDATE) 1 (3/24)' );
  COMMIT;
  END;
  
  */

  PROCEDURE purge(lo_snap   IN NUMBER,
                  hi_snap   IN NUMBER,
                  area_size IN INTEGER DEFAULT NULL);

  PROCEDURE move_tablespace(tablespace_name IN VARCHAR2,
                            window_in_hours IN NUMBER);

END statspack_admin;
/
CREATE OR REPLACE PACKAGE BODY statspack_admin AS
  on_9i     BOOLEAN := FALSE;
  dbversion VARCHAR2(512);
  dbcompat  VARCHAR2(512);

  PROCEDURE purge(lo_snap   IN NUMBER,
                  hi_snap   IN NUMBER,
                  area_size IN INTEGER DEFAULT NULL) IS
  
    dbid      v$database.dbid%TYPE;
    inst_num  v$instance.instance_number%TYPE;
    inst_name v$instance.instance_name%TYPE;
    db_name   v$database.name%TYPE;
    btime     DATE;
    etime     DATE;
  
  BEGIN
  
    SELECT d.dbid            AS dbid,
           i.instance_number AS inst_num,
           i.instance_name   AS inst_name,
           d.name            AS db_name
      INTO dbid, inst_num, inst_name, db_name
      FROM v$database d, v$instance i;
  
    select snap_time
      into btime
      from stats$snapshot b
     where b.snap_id = (SELECT MIN(x.snap_id)
                          FROM stats$snapshot x
                         WHERE x.snap_id >= lo_snap)
       and b.dbid = dbid
       and b.instance_number = inst_num;
  
    select snap_time
      into etime
      from stats$snapshot e
     where e.snap_id = (SELECT MAX(x.snap_id)
                          FROM stats$snapshot x
                         WHERE x.snap_id <= hi_snap)
       and e.dbid = dbid
       and e.instance_number = inst_num;
  
    IF on_9i AND area_size IS NOT NULL THEN
      EXECUTE IMMEDIATE 'alter session set workarea_size_policy=MANUAL';
      EXECUTE IMMEDIATE 'alter session set hash_area_size=' ||
                        TO_CHAR(area_size);
      EXECUTE IMMEDIATE 'alter session set sort_area_size=' ||
                        TO_CHAR(area_size);
    ELSIF area_size IS NOT NULL THEN
      EXECUTE IMMEDIATE 'alter session set hash_area_size=' ||
                        TO_CHAR(area_size);
      EXECUTE IMMEDIATE 'alter session set sort_area_size=' ||
                        TO_CHAR(area_size);
    END IF;
  
    delete from stats$snapshot
     where instance_number = inst_num
       and dbid = dbid
       and snap_id between lo_snap and hi_snap;
  
    /*-- Delete any dangling SQLtext 
    -- The following statement deletes any dangling SQL statements which
    -- are no longer referred to by ANY snapshots. This statment has been
    -- commented out as it can be very resource intensive. 
    --*/
    delete --  index_ffs(st) 
    from stats$sqltext st
     where (hash_value, text_subset) not in
           (select --  hash_aj full(ss) no_expand 
             hash_value, text_subset
              from stats$sql_summary ss
             where ((snap_id < lo_snap or snap_id > hi_snap) and dbid = dbid and
                   instance_number = inst_num)
                or (dbid != dbid or instance_number != inst_num));
  
    -- Adding an optional STATS$SEG_STAT_OBJ delete statement
    delete --  index_ffs(sso)
    from stats$seg_stat_obj sso
     where (dbid, dataobj#, obj#) not in
           (select --  hash_aj full(ss) no_expand
             dbid, dataobj#, obj#
              from stats$seg_stat ss
             where ((snap_id < lo_snap or snap_id > hi_snap) and dbid = dbid and
                   instance_number = inst_num)
                or (dbid != dbid or instance_number != inst_num));
  
    /* Delete any undostat rows that cover the snap times */
    delete from stats$undostat us
     where dbid = dbid
       and instance_number = inst_num
       and begin_time < btime
       and end_time > etime;
  
    /* Delete any dangling database 
    nstance rows for that startup time */
    delete from stats$database_instance di
     where instance_number = inst_num
       and dbid = dbid
       and not exists (select 1
              from stats$snapshot s
             where s.dbid = di.dbid
               and s.instance_number = di.instance_number
               and s.startup_time = di.startup_time);
  
    /* Delete any dangling statspack parameter 
    rows for the database instance */
    delete from stats$statspack_parameter sp
     where instance_number = inst_num
       and dbid = dbid
       and not exists
     (select 1
              from stats$snapshot s
             where s.dbid = sp.dbid
               and s.instance_number = sp.instance_number);
  
    COMMIT;
  
  END purge;

  /* procedure to move tablespaces */
  PROCEDURE move_tablespace(tablespace_name IN VARCHAR2,
                            window_in_hours IN NUMBER) IS
    ts DATE := SYSDATE;
    te DATE := ts(window_in_hours / 24);
  BEGIN
  
    -- do the tables that haven't been rebuilt recently first
    FOR t IN (SELECT object_name AS table_name
                FROM user_objects
               WHERE object_type = 'TABLE'
               ORDER BY last_ddl_time ASC) LOOP
    
      EXECUTE IMMEDIATE 'ALTER TABLE ' || t.table_name ||
                        ' MOVE TABLESPACE ' || tablespace_name;
    
      -- now immediately rebuild the indexes
      -- I could use dbms_job to do this 
      -- asynchronously, maybe in a future revision ?
      -- not using ONLINE because moving 
      -- tables cannot be done ONLINE !
      -- maybe use dbms_redef in future version? 
      FOR i IN (SELECT index_name
                  FROM user_indexes
                 WHERE table_name = t.table_name) LOOP
        EXECUTE IMMEDIATE 'ALTER INDEX ' || i.index_name || ' 
REBUILD TABLESPACE ' || tablespace_name;
      END LOOP;
    
      IF SYSDATE > te THEN
        EXIT;
      END IF;
    
    END LOOP;
  EXCEPTION
    WHEN OTHERS THEN
      IF dbms_job.is_jobq THEN
        /*
        remove the  job preventing nasty 
        reruns outside the window 
        but generating a trace file for the DBA 
        */
        DBMS_JOB.REMOVE(NVL(SYS_CONTEXT('USERENV', 'BG_JOB_ID'),
                            SYS_CONTEXT('USERENV', 'FG_JOB_ID')));
        COMMIT;
      END IF;
      RAISE;
  END move_tablespace;

  /* purge records older than X days */
  PROCEDURE purge_older_than_days(days      IN INTEGER,
                                  area_size IN INTEGER DEFAULT NULL) IS
  
    losnap stats$snapshot.SNAP_ID%TYPE;
    hisnap stats$snapshot.SNAP_ID%TYPE;
  
  BEGIN
  
    SELECT s.snap_id
      INTO hisnap
      FROM stats$snapshot s
     WHERE s.snap_id =
           (SELECT MAX(s.snap_id)
              FROM stats$snapshot s
             WHERE s.snap_time < TRUNC(SYSDATE) - days);
  
    SELECT s.snap_id
      INTO losnap
      FROM stats$snapshot s
     WHERE s.snap_id = (SELECT MIN(s.snap_id)
                          FROM stats$snapshot s
                         WHERE s.snap_id <= hisnap);
    -- in case the highest snap is the only one to delete
  
    --DBMS_OUTPUT.PUT_LINE('Lo Snap: '||TO_CHAR(losnap));
    --DBMS_OUTPUT.PUT_LINE('Hi Snap: '||TO_CHAR(hisnap));
  
    purge(losnap, hisnap, area_size);
  
  EXCEPTION
    WHEN NO_DATA_FOUND THEN
      NULL;
      -- select into hisnap returned no rows, 
    --which means no snaps are older than days specified
  
  END purge_older_than_days;

BEGIN

  SYS.DBMS_UTILITY.DB_VERSION(dbversion, dbcompat);

  IF TO_NUMBER(REPLACE(dbversion, '.')) >= 90000 THEN
    -- we are on a 9i DB 
    on_9i := TRUE;
  ELSE
    on_9i := FALSE;
  END IF;

EXCEPTION
  WHEN OTHERS THEN
    on_9i := FALSE;
  
END statspack_admin;
/

 

2.排程:

DECLARE
  j BINARY_INTEGER;
BEGIN
  DBMS_JOB.SUBMIT(j,
                  'statspack_admin.purge_older_than_days
(30, 52428800);',
                  TRUNC(SYSDATE) (3 / 24),
                  'TRUNC(SYSDATE) 1 (3/24)');
  COMMIT;
END;
 

 

分享到:
评论

相关推荐

    Statspack分析报告详解

    1. 定期清理旧的Statspack数据以保持数据库整洁,避免不必要的空间占用。 2. 对比基线快照和分析快照,能更直观地看出性能改进或恶化。 3. 结合AWR(Automatic Workload Repository)或其他性能监控工具,可以获得更...

    oracle statspack安装配置

    5. **定期收集数据**:你可以通过调度任务(如Oracle的DBMS_JOB或DBMS_SCHEDULER)定期执行Statspack的`GATHER_SCHEMA_STATISTICS`或`GATHER_DATABASE_STATISTICS`过程。 6. **生成报告**:一旦数据被收集,就可以...

    oracle statspack

    Statspack设计时考虑到了保持旧脚本的简便性,同时提供了更多的功能。其中一个显著的区别在于数据收集方式的不同。当使用Statspack时: - **数据持久化**:Statspack不会在每次运行后删除数据表,这样用户可以在...

    ORACLE STATSPACK

    - **定期检查性能报告**:定期查看Statspack生成的性能报告,及时发现并解决问题。 - **合理设置采样间隔**:根据实际应用场景调整自动采样间隔,避免过度采样导致额外负载。 - **充分利用报告自定义功能**:利用...

    statspack安装与分析

    - **定期清理**: 由于Statspack会积累大量的历史数据,定期执行`DBMS_STATS.DELETE_SNAPSHOT`删除不再需要的快照,以保持数据库的整洁。 - **合理采样**: 设置合适的采样频率,过于频繁可能会增加数据库负担,而采样...

    statspack下载

    3. **快照机制**:Statspack通过定期创建快照来捕捉数据库的实时状态,这些快照提供了数据库性能的瞬间快照,便于比较不同时间点的性能差异。 三、Statspack的基本信息 Statspack表格包含了丰富的信息,如: 1. *...

    statspack安装

    Statspack 安装 Statspack 是 Oracle 提供的一个性能分析工具,用于收集和分析数据库性能数据。下面是 Statspack 安装的详细步骤和相应的知识点。 一、准备 1. 检查部分参数值:在安装 Statspack 之前,需要检查...

    session级别的statspack

    5. **清理与维护**:定期清理不再需要的Statspack快照,以保持数据库空间的整洁。使用`DBMS_STATS.PURGE_STATS`命令可以删除旧的统计信息。 在实际应用中,配合Oracle的其他性能分析工具,如AWR(Automatic ...

    STATSPACK数据分析

    STATSPACK是Oracle数据库系统中的一种性能分析工具,主要用于收集和分析数据库的运行统计信息,帮助DBA(数据库管理员)诊断性能问题、优化查询效率以及规划数据库资源的使用。STATSPACK报告是其核心功能之一,它...

    Oracle STATSPACK高性能调整

    1. **性能数据收集**:STATSPACK可以定期或按需收集数据库的各种运行时统计信息,如SQL执行统计、等待事件、系统活动等,这些数据对于分析性能问题至关重要。 2. **快照对比**:通过创建和比较不同时间点的快照,...

    statspack完整使用手册

    statspack完整使用指南: 包括: statspack的安装; statspack的自动数据收集; statspack的门限调整; statspack的报表自动产生与邮件发送(aix环境下); statspack的报表详细解析.

    Oracle9i STATSPACK 高性能调整

    10. **最佳实践**:使用STATSPACK时,应遵循一些最佳实践,例如定期清理旧的统计信息,避免在业务高峰期收集统计,以减少对系统的影响。 通过学习和掌握Oracle9i STATSPACK,数据库管理员能够更好地理解和优化他们...

    如何解读oracle_statspack 报告

    Oracle StatsPack 是Oracle数据库系统中一个强大的性能分析工具,它为DBA提供了详细的数据库性能统计数据,帮助诊断和优化系统的...在实际工作中,定期生成和分析StatsPack报告是保持数据库高效运行的关键步骤之一。

    Statspack工具

    - **DB_RECYCLE_CACHE_SIZE**:用于存储不经常访问的数据块,当缓存紧张时会被清除。 - **DB_BLOCK_SIZE**:数据库块的大小,影响数据存储和读取效率。 - **SHARED_POOL_SIZE**:共享池的大小,影响SQL语句的解析和...

    详解oracle9i Statspack安装&使用

    Oracle 9i Statspack 是一个强大的性能分析工具,它提供了对数据库性能的深入洞察,帮助DBA们诊断和优化数据库的运行效率。Statspack 的安装和使用是数据库管理中的重要环节,尤其对于监控和问题排查至关重要。以下...

    oracle中的高级运用statspack

    Oracle中的Statspack是一种强大的性能分析工具,尤其在大型企业如电信运营商的BSS(Business Support Systems)系统中,它在BOSS(Business Operation Support Systems)开发中扮演着至关重要的角色。Statspack是...

    细化解析oracle 10g statspack

    ### 细化解析Oracle 10g Statspack #### 引言 随着Oracle数据库技术的不断进步和发展,Statspack作为一款历史悠久的性能监控工具,在Oracle 10g中仍然扮演着重要的角色。尽管Oracle 10g引入了诸如自动工作负荷存储...

    Oracle STATSPACK高性能调整技术

    Oracle STATSPACK是一种强大的性能分析工具,主要用于诊断和优化Oracle数据库的运行效率。它由Oracle在9i版本中引入,后来在10g及更高版本中被Automatic Workload Repository (AWR)所取代,但即便如此,STATSPACK...

    Oracle High-Performance Tuning with STATSPACK 中文版

    - 定期采样:设置定时任务,定期获取新的快照,记录系统在不同负载下的运行状态。 - 分析差异:通过对比快照数据,找出性能下降的时间段,以及可能的问题领域。 3. **性能指标解读**: - CPU使用率:过高可能...

Global site tag (gtag.js) - Google Analytics