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;