SCN问题详解(2)--传染源定位

ORACLE SCN增长异常定位传染源将其隔离处理是处理SCN问题最有效的方法,具体定位过程如下:

一:查看alter日志找查传染源

SCN问题详解(2)--传染源定位_第1张图片
    从数据库alter日志中可以看出,系统scn增长过快是因为通过dblink被远端数据库ORCL传染所致,信息详细显示了远端数据库名、用户名、触发机器名等信息,但是该提示是安装2012年1月ORACLE发布的补丁才会有的提示,因此该方法有很大的局限性

二:通过定位传染源方法

1、查询SCN距离Headroom 上限的剩余天数的历史变化

SELECT TIM,

       GSCN,

       ROUND(RATE),

       ROUND((CHK16KSCN - GSCN) / 24 / 3600 / 16 / 1024, 1) "HEADROOM"

  FROM (SELECT TIM,

               GSCN,

               RATE,

               ((((TO_NUMBER(TO_CHAR(TIM, 'YYYY')) - 1988) * 12 * 31 * 24 * 60 * 60) +

               ((TO_NUMBER(TO_CHAR(TIM, 'MM')) - 1) * 31 * 24 * 60 * 60) +

               (((TO_NUMBER(TO_CHAR(TIM, 'DD')) - 1)) * 24 * 60 * 60) +

               (TO_NUMBER(TO_CHAR(TIM, 'HH24')) * 60 * 60) +

               (TO_NUMBER(TO_CHAR(TIM, 'MI')) * 60) +

               (TO_NUMBER(TO_CHAR(TIM, 'SS')))) * (16 * 1024)) CHK16KSCN

          FROM (SELECT FIRST_TIME TIM,

                       FIRST_CHANGE# GSCN,

                       ((NEXT_CHANGE# - FIRST_CHANGE#) /

                       ((NEXT_TIME - FIRST_TIME) * 24 * 60 * 60)) RATE

                  FROM V$ARCHIVED_LOG

                 WHERE (NEXT_TIME > FIRST_TIME)))

 ORDER BY 1, 2;

将结果导出EXECEL生成图形:

1、如果是传染源headroom趋势图如下:

       SCN问题详解(2)--传染源定位_第2张图片
     说明:如果 SCN Headroom 的剩余天数的历史变化是相对平滑的趋向于变小,那么就说明内部数据库有应用触发了 Bug,导致 SCN 异常增长,如图上图所示

2、被传染headroom趋势图如下:

 

       SCN问题详解(2)--传染源定位_第3张图片
     说明:如果 SCN Headroom 的剩余天数的历史变化很突然,那么就说明数据库主要被外部通过DBLINK 传染,导致 SCN 异常增长;

     看一下我管理系统生产库SCN历史变化图:

     SCN问题详解(2)--传染源定位_第4张图片
     变化很突然,说明是被传染所致,因此问题的重点是查找传染源(这种方法不太准确)
2、也可以跟据如下脚本判断数据库是否为传染源

SELECT SS.SNAP_ID AS SNAP_ID,      
       TO_CHAR(SN.BEGIN_INTERVAL_TIME, 'YYYY-MM-DD HH24:MI:SS') AS "SNAP_DATE",      
       SUM(DECODE(STAT_NAME, 'calls to kcmgas', VALUE, 0)) -      
       LAG(SUM(DECODE(STAT_NAME, 'calls to kcmgas', VALUE, 0)), 1) OVER(ORDER BY SS.SNAP_ID) "KCMGAS",      
       TRUNC((SUM(DECODE(STAT_NAME, 'calls to kcmgas', VALUE, 0)) -            
             LAG(SUM(DECODE(STAT_NAME, 'calls to kcmgas', VALUE, 0)), 1)           
              OVER(ORDER BY SS.SNAP_ID)) /           
             TRUNC((CAST(SN.END_INTERVAL_TIME AS DATE) -                  
                   CAST(SN.BEGIN_INTERVAL_TIME AS DATE)) * 86400)) "KCMGAS PER SEC"
  FROM SYS.DBA_HIST_SYSSTAT SS, SYS.DBA_HIST_SNAPSHOT SN
 WHERE SS.SNAP_ID = SN.SNAP_ID   
   AND SS.STAT_NAME IN ('calls to kcmgas')     
   AND SS.DBID = SN.DBID     
   AND SS.INSTANCE_NUMBER = SN.INSTANCE_NUMBER    
   AND SN.INSTANCE_NUMBER = 1 --替换检查库INSTANCE_NUMBER    
   AND SN.DBID = 1840233104 --替换检查库DBID
 GROUP BY SS.SNAP_ID, SN.BEGIN_INTERVAL_TIME, SN.END_INTERVAL_TIME
 ORDER BY SS.SNAP_ID;
 (此脚本相对而言比较准确)

     建议用此脚本进行传染源的定位,这个里面的数据主要是跟据AWR报告保留时间,因此为了能够更好的诊断传染源,最好将AWR报告保留时间设置31天,输出结果第一条值比大(除AWR基线外),不用理会第一条,最点关注除第一条以外的部分结果是否很大!




你可能感兴趣的:(Oracle,技术文档)