ORACLE SCN增长异常定位传染源将其隔离处理是处理SCN问题最有效的方法,具体定位过程如下:
一:查看alter日志找查传染源
从数据库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 Headroom 的剩余天数的历史变化是相对平滑的趋向于变小,那么就说明内部数据库有应用触发了 Bug,导致 SCN 异常增长,如图上图所示
2、被传染headroom趋势图如下:
说明:如果 SCN Headroom 的剩余天数的历史变化很突然,那么就说明数据库主要被外部通过DBLINK 传染,导致 SCN 异常增长;
看一下我管理系统生产库SCN历史变化图:
变化很突然,说明是被传染所致,因此问题的重点是查找传染源(这种方法不太准确)
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基线外),不用理会第一条,最点关注除第一条以外的部分结果是否很大!