Saturday, 8 November 2025

Filled under:

 /********************************************************************

 *  FINAL BOSS QUERY – YOUR LOGIC, 100% CORRECT

 *  Rule: First 4 or 5 chars = FAMILY

 *  IF PRIMARY HAS BACKUP → STANDBY IS SAFE (never listed)

 *  IF STANDBY HAS BACKUP → PRIMARY IS SAFE (never listed)

 ********************************************************************/


WITH dbs AS (

  SELECT 

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

    t.host_name                                          AS host,

    i.LOG_MODE,

    SUBSTR(TRIM(REGEXP_SUBSTR(t.target_name,'[^.]+')),1,

           CASE WHEN REGEXP_LIKE(SUBSTR(TRIM(REGEXP_SUBSTR(t.target_name,'[^.]+')),5,1),'[0-9]')

                THEN 5 ELSE 4 END)                     AS family

  FROM mgmt$target t

  JOIN MGMT$DB_DBNINSTANCEINFO i 

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

  WHERE t.target_type = 'oracle_database'

),


family_backup AS (

  SELECT DISTINCT

    SUBSTR(TRIM(REGEXP_SUBSTR(DATABASE_NAME,'[^.]+')),1,

           CASE WHEN REGEXP_LIKE(SUBSTR(TRIM(REGEXP_SUBSTR(DATABASE_NAME,'[^.]+')),5,1),'[0-9]')

                THEN 5 ELSE 4 END) AS family

  FROM mgmt$ha_backup

  WHERE end_time >= SYSDATE - 3

    AND status = 'COMPLETED'

),


family_blackout AS (

  SELECT DISTINCT family

  FROM mgmt$blackout_history b

  JOIN dbs d ON TRIM(REGEXP_SUBSTR(b.target_name,'[^.]+')) = d.db_name

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

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

)


-- ONLY list DBs where:

--   1. Family has ZERO backup

--   2. Not in blackout

--   3. Is ARCHIVELOG

SELECT 

  db_name      AS "Database",

  host         AS "Host",

  family || 'xx' AS "Family",

  LOG_MODE     AS "Log Mode",

  'ALERT: NO BACKUP 72H' AS "Status"

FROM dbs

WHERE LOG_MODE = 'ARCHIVELOG'

  AND family NOT IN (SELECT family FROM family_backup)

  AND family NOT IN (SELECT family FROM family_blackout)

ORDER BY family, db_name;

0 comments:

Post a Comment