Standby Database Gap Kontrolü

Standby Database Gap Kontrolü

Standbye db ile primary db arasındaki log farkını izlemek ve raporlamak için aşağıdaki sorgu prod ortamından select edilebilir.Hatta view yaparak konrollerde kullanabilirsiniz.Mesela log farkı 10 dan fazla olunca mail göndermesi gibi. Sorgu sonucunda 2 satır gelmesi ortamın cluster(RAC) olmasından kaynaklanıyor.Thread1 1. instance’ı, Thread2 2. instance’ı ifade etmektedir.

CREATE OR REPLACE VIEW DATAGUARD_CONTROL_VIEW AS
SELECT DEST_ID,
       THREAD#,
       MAX(PRIMARY) PRIMARY,
       MAX(STANDBY) STANDBY,
       MAX(PRIMARY) - MAX(STANDBY) LOG_GAP,
       MAX(TIMEGAP) TIME_GAP
  FROM (SELECT DEST_ID,
               THREAD#,
               MAX(SEQUENCE#) PRIMARY,
               0 TRANSF,
               0 STANDBY,
               SYSDATE-600 TIMEGAP
          FROM V$ARCHIVED_LOG
         WHERE STANDBY_DEST = 'YES'
           AND ARCHIVED = 'YES'
           AND RESETLOGS_CHANGE# =
               (SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)
         GROUP BY DEST_ID, THREAD#
        UNION ALL
        SELECT DEST_ID,
               THREAD#,
               0 PRIMARY,
               MAX(SEQUENCE#) TRANSF,
               0 STANDBY,
               NULL TIMEGAP
          FROM V$ARCHIVED_LOG
         WHERE STANDBY_DEST = 'YES'
           AND ARCHIVED = 'YES'
           AND RESETLOGS_CHANGE# =
               (SELECT D.RESETLOGS_CHANGE# FROM  V$DATABASE D)
         GROUP BY DEST_ID, THREAD#
        UNION ALL
        SELECT DEST_ID,
               THREAD#,
               0 PRIMARY,
               0 TRANSF,
               MAX(SEQUENCE#) STANDBY,
               MAX(FIRST_TIME) TIMEGAP
          FROM V$ARCHIVED_LOG
         WHERE STANDBY_DEST = 'YES'
           AND APPLIED = 'YES'
           AND RESETLOGS_CHANGE# =
               (SELECT D.RESETLOGS_CHANGE# FROM V$DATABASE D)
         GROUP BY DEST_ID, THREAD#) ASD
 GROUP BY DEST_ID, THREAD#
 ORDER BY THREAD#, DEST_ID;
select * from DATAGUARD_CONTROL_VIEW;
 
DEST_ID	THREAD#	PRIMARY	STANDBY	LOG_GAP	TIME_GAP
2	1	11354	11353	1	9.6.2015 15:24:27
2	2	12895	12893	2	9.6.2015 15:15:26

Eğer mail atmasını istersek bir procedure ve job aracılığıyla bunu yapabiliriz.
Önce bir procedure oluşturalım.Sonra da 3 saatte bir çalışacak şekilde job’a bağlayalım

PROCEDURE CHECK_DATAGUARD_STATE IS
    fail_msg_ VARCHAR2(4000);
  BEGIN
    FOR REC_ IN ( SELECT * FROM 
                  DATAGUARD_CONTROL_VIEW T
                ) LOOP
 
    IF REC_.LOG_GAP > 10 THEN 
       fail_msg_:='DRC Node'||rec_.thread#||''''||'de GAP var,kontrol ediniz..'||
                   Chr(13)|| Chr(13)||'<<< Node '||to_char(rec_.thread#)||'>>>'||
                   Chr(13)||'Primary Log Sequence: '||to_char(rec_.primary)||
                   Chr(13)||'Standby Log Sequence: '||to_char(rec_.standby)||
                   Chr(13)||'Log Fark            : '||to_char(rec_.primary-rec_.standby)||
                   Chr(13)||'Son Log Apply Zamani: '||TO_CHAR(rec_.time_gap,'dd.mm.yyyy HH24:MI:SS');
 
    -- Buraya kendi mail gönderen procedurunuzu yazınız.
    MAIL_GONDER(fail_msg_)        
    -- Buraya kendi mail gönderen procedurunuzu yazınız.
 
    END IF;
    END LOOP;
END CHECK_DATAGUARD_STATE;

Her 3 Saatte bir çalışıp standby ile primary arasında gap varsa mail atan jobımızı oluşturalım..

BEGIN 
dbms_scheduler.create_job('"BG_DG_CHECK"',
job_type=>'PLSQL_BLOCK', job_action=>
'BEGIN
  CHECK_DATAGUARD_STATE();
END;'
, number_of_arguments=>0,
start_date=>TO_TIMESTAMP_TZ('18-DEC-2014 04.00.56.909160000 PM TURKEY','DD-MON-RRRR HH.MI.SSXFF AM TZR','NLS_DATE_LANGUAGE=english'), repeat_interval=> 
'Freq=Hourly;Interval=3'
, end_date=>NULL,
job_class=>'"DEFAULT_JOB_CLASS"', enabled=>FALSE, auto_drop=>FALSE,comments=>
'dataguard status mail');
dbms_scheduler.enable('"BG_DG_CHECK"');
COMMIT; 
END;

Tagged: , , , , , ,

Bir cevap yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir