Saturday, 8 November 2025

Filled under:

 WITH db AS (

  SELECT 

    TRIM(REGEXP_SUBSTR(t.target_name, '[^.]+')) AS db_name,

    t.host_name                                 AS host,

    NVL(p_dg.property_value,'Single Instance') AS dg_role,

    i.LOG_MODE,

    t.target_guid

  FROM mgmt$target t

  LEFT JOIN mgmt$target_properties p_dg 

         ON p_dg.target_guid = t.target_guid AND p_dg.property_name = 'DataGuardStatus'

  JOIN MGMT$DB_DBNINSTANCEINFO i 

         ON i.DATABASE_NAME LIKE t.target_name || '%'

  WHERE t.target_type = 'oracle_database'

),


blackout AS (

  SELECT DISTINCT TRIM(REGEXP_SUBSTR(b1.target_name, '[^.]+')) AS db_name

  FROM mgmt$blackout_history b1

  WHERE b1.status IN ('Started','Low')

    AND SYSDATE BETWEEN b1.start_time AND NVL(b1.end_time,SYSDATE+1)

),


primary_backup AS (

  SELECT 

    TRIM(REGEXP_SUBSTR(b.DATABASE_NAME, '[^.]+')) AS db_name,

    MAX(b.end_time) AS last_backup

  FROM mgmt$ha_backup b

  WHERE b.end_time >= SYSDATE - 3 AND b.status = 'COMPLETED'

  GROUP BY TRIM(REGEXP_SUBSTR(b.DATABASE_NAME, '[^.]+'))

),


standby_map AS (

  SELECT 

    s.db_name AS standby,

    p.db_name AS primary

  FROM db s

  JOIN db p ON p.dg_role = 'Primary' AND s.dg_role = 'Physical Standby'

  WHERE TRIM(REGEXP_SUBSTR(s.LOG_MODE, '[^.]+')) = p.db_name

)


SELECT 

  d.db_name                                 AS "Database",

  d.host                                    AS "Host",

  d.dg_role                                 AS "DG Role",

  d.LOG_MODE                                AS "Log Mode",

  NVL(b.db_name,'NO')                       AS "Blackout?",

  NVL(TO_CHAR(p.last_backup,'YYYY-MM-DD HH24:MI'),'NEVER') AS "Last Backup",

  CASE 

    WHEN d.LOG_MODE = 'NOARCHIVELOG'          THEN 'OK (NoArch)'

    WHEN b.db_name IS NOT NULL                THEN 'OK (Blackout)'

    WHEN d.dg_role = 'Physical Standby' AND sp.last_backup IS NOT NULL 

                                              THEN 'OK (Standby, Primary OK)'

    ELSE                                        'ALERT: NO BACKUP 72H'

  END                                       AS "Status"

FROM db d

LEFT JOIN blackout b       ON b.db_name = d.db_name

LEFT JOIN primary_backup p ON p.db_name = d.db_name

LEFT JOIN standby_map sm   ON sm.standby = d.db_name

LEFT JOIN primary_backup sp ON sp.db_name = sm.primary

WHERE d.LOG_MODE = 'ARCHIVELOG'

  AND b.db_name IS NULL

  AND (d.dg_role IN ('Primary','Single Instance') OR sp.last_backup IS NULL)

  AND p.last_backup IS NULL

ORDER BY p.last_backup NULLS FIRST;

0 comments:

Post a Comment