Friday, 7 November 2025

Filled under:

 -- ==========================================================

--  OEM Report: Databases Not Protected by Backup

--  Author : Daidipya Upalekar

--  Purpose: Identify databases (Primary/Standby) without

--           backup configuration or recent backup activity

-- ==========================================================


WITH db_targets AS (

    SELECT

        t.target_guid,

        t.target_name,

        t.host_name

    FROM sysman.mgmt$target t

    WHERE t.target_type IN ('oracle_database', 'rac_database')

),


db_properties AS (

    SELECT

        p.target_guid,

        MAX(CASE WHEN p.property_name = 'DBName' THEN p.property_value END) AS db_name,

        MAX(CASE WHEN p.property_name IN ('DatabaseRole', 'DBRole', 'DataGuardStatus')

                 THEN p.property_value END) AS dg_role

    FROM sysman.mgmt$target_properties p

    GROUP BY p.target_guid

),


rman_configured AS (

    SELECT DISTINCT target_name

    FROM sysman.mgmt$rman_config

),


recent_backup AS (

    SELECT

        b.target_guid,

        MAX(b.end_time) AS last_backup_time

    FROM sysman.mgmt$ha_backup b

    GROUP BY b.target_guid

),


merged AS (

    SELECT

        t.target_guid,

        t.target_name,

        t.host_name,

        p.db_name,

        NVL(p.dg_role, 'NONE') AS dg_role,

        CASE

            WHEN EXISTS (

                SELECT 1

                FROM sysman.mgmt$rman_config r

                WHERE LOWER(r.target_name) LIKE LOWER(p.db_name) || '%'

            ) THEN 'CONFIGURED'

            ELSE 'NOT CONFIGURED'

        END AS config_status,

        r.last_backup_time

    FROM db_targets t

    JOIN db_properties p ON t.target_guid = p.target_guid

    LEFT JOIN recent_backup r ON t.target_guid = r.target_guid

),


grouped AS (

    SELECT

        db_name,

        MAX(CASE WHEN config_status = 'CONFIGURED' THEN 1 ELSE 0 END) AS any_configured,

        MAX(CASE WHEN last_backup_time >= SYSDATE - 3 THEN 1 ELSE 0 END) AS recent_backup_done

    FROM merged

    GROUP BY db_name

)


SELECT

    m.db_name,

    m.host_name,

    m.dg_role,

    m.config_status,

    NVL(TO_CHAR(m.last_backup_time, 'YYYY-MM-DD HH24:MI:SS'), 'N/A') AS last_backup_time,

    CASE

        WHEN g.any_configured = 0 AND g.recent_backup_done = 0 THEN '❌ NO BACKUP CONFIGURED OR RUN'

        WHEN g.any_configured = 1 AND g.recent_backup_done = 0 THEN '⚠️ CONFIGURED BUT NO RECENT BACKUP'

        WHEN g.any_configured = 0 AND g.recent_backup_done = 1 THEN '⚠️ BACKUP RUN BUT NO CONFIGURATION FOUND'

        ELSE '✅ BACKUP OK (Primary or Standby Covered)'

    END AS backup_protection_status

FROM merged m

JOIN grouped g ON m.db_name = g.db_name

ORDER BY backup_protection_status, m.db_name, m.host_name;


0 comments:

Post a Comment