oracle SCN問題詳解
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基線外),不用理會第一條,最點關注除第一條以外的部分結果是否很大!