1. 程式人生 > >oracle SCN問題詳解

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