Sunday, 29 March 2026

Data Guard & RMAN Configuration


Oracle 19c Database

Data Guard & RMAN Configuration

Step-by-Step Reference Guide for DBAs

Database Version

Guide Type

Scope

Oracle 19c (19.3+)

Technical / DBA

Physical Standby + RMAN

 

Prerequisites

Before starting, ensure the following are in place on both primary and standby servers:

 

       Oracle 19c software installed on both primary and standby hosts

       Same Oracle Home path on both servers (recommended)

       Network connectivity between primary and standby (port 1521 open)

       Identical OS users (oracle) and groups (dba, oinstall) on both hosts

       ARCHIVELOG mode enabled on the primary database

       Fast Recovery Area (FRA) configured on both hosts

       Password file (orapwSID) present on primary — will be copied to standby

 

NOTE

All commands below use DB_UNIQUE_NAME=PROD for the primary and DB_UNIQUE_NAME=STDBY for the standby. Replace these with your actual values.

 

Step 1 — Enable ARCHIVELOG Mode on Primary

STEP 1

Enable ARCHIVELOG Mode on Primary

 

If the primary is already in ARCHIVELOG mode, skip to Step 2. Verify first:

 

sqlplus / as sysdba

 

-- Check current mode

SELECT LOG_MODE FROM V$DATABASE;

 

-- If NOARCHIVELOG, enable it:

SHUTDOWN IMMEDIATE;

STARTUP MOUNT;

ALTER DATABASE ARCHIVELOG;

ALTER DATABASE OPEN;

 

-- Confirm

ARCHIVE LOG LIST;

 

TIP

Set LOG_ARCHIVE_DEST_1 to USE_DB_RECOVERY_FILE_DEST for automatic archive management using the Fast Recovery Area.

 

Step 2 — Configure Primary Database Parameters

STEP 2

Set Data Guard Init Parameters on Primary

 

Edit the SPFILE parameters on the primary database. Connect as SYSDBA and run:

 

sqlplus / as sysdba

 

ALTER SYSTEM SET DB_UNIQUE_NAME='PROD' SCOPE=SPFILE;

ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(PROD,STDBY)' SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_1=

  'LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

   DB_UNIQUE_NAME=PROD' SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=

  'SERVICE=STDBY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

   DB_UNIQUE_NAME=STDBY' SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;

ALTER SYSTEM SET REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE SCOPE=SPFILE;

ALTER SYSTEM SET FAL_SERVER=STDBY SCOPE=BOTH;

ALTER SYSTEM SET FAL_CLIENT=PROD SCOPE=BOTH;

ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=BOTH;

ALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.dbf' SCOPE=SPFILE;

 

Key parameters explained:

 

Parameter

Value / Example

Description

DB_UNIQUE_NAME

PROD

Unique name per site

LOG_ARCHIVE_CONFIG

DG_CONFIG=(PROD,STDBY)

Lists all DG members

LOG_ARCHIVE_DEST_2

SERVICE=STDBY ASYNC

Redo ship to standby

FAL_SERVER

STDBY

Gap resolution server

STANDBY_FILE_MANAGEMENT

AUTO

Auto-adds datafiles

 

Step 3 — Configure TNS / Listener on Both Hosts

STEP 3

Set Up TNS Entries and Listeners

 

On both primary and standby hosts, edit $ORACLE_HOME/network/admin/tnsnames.ora:

 

# tnsnames.ora (both hosts)

 

PROD =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = primary-host)(PORT = 1521))

    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = PROD)))

 

STDBY =

  (DESCRIPTION =

    (ADDRESS = (PROTOCOL = TCP)(HOST = standby-host)(PORT = 1521))

    (CONNECT_DATA = (SERVER = DEDICATED)(SERVICE_NAME = STDBY)))

 

# listener.ora (both hosts — add STATIC_SERVICE_NAME)

LISTENER =

  (DESCRIPTION_LIST =

    (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 0.0.0.0)(PORT = 1521))))

 

SID_LIST_LISTENER =

  (SID_LIST =

    (SID_DESC =

      (GLOBAL_DBNAME = PROD/STDBY)   # change per host

      (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1)

      (SID_NAME = PROD/STDBY)))

 

Reload listeners on both hosts:

 

lsnrctl reload

lsnrctl status

 

Step 4 — Copy Password File to Standby

STEP 4

Copy Oracle Password File

 

Data Guard uses the password file for authentication between primary and standby. Copy it from primary to standby:

 

# On PRIMARY host — locate password file

ls $ORACLE_HOME/dbs/orapwPROD

 

# SCP to standby (adjust path/hostname)

scp $ORACLE_HOME/dbs/orapwPROD oracle@standby-host:$ORACLE_HOME/dbs/orapwSTDBY

 

# On STANDBY — verify file exists

ls -lh $ORACLE_HOME/dbs/orapwSTDBY

 

IMPORTANT

The password for the SYS user must be identical on both primary and standby. If you change it on primary later, copy the password file again.

 

Step 5 — Prepare Standby Database (NOMOUNT)

STEP 5

Start Standby Instance in NOMOUNT

 

On the STANDBY host, create a minimal init.ora (RMAN DUPLICATE will replace it). Then start the instance in NOMOUNT:

 

# Create minimal pfile on STANDBY at $ORACLE_HOME/dbs/initSTDBY.ora

 

DB_NAME=PROD

DB_UNIQUE_NAME=STDBY

 

# Start instance NOMOUNT

sqlplus / as sysdba

STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initSTDBY.ora';

 

Step 6 — Duplicate Database via RMAN (Active Duplication)

STEP 6

RMAN DUPLICATE — Create Physical Standby

 

This is the most important step. RMAN streams the primary database directly to the standby over the network — no backup files needed. Run from the PRIMARY host:

 

rman TARGET sys/SysPassword@PROD AUXILIARY sys/SysPassword@STDBY

 

RMAN> DUPLICATE TARGET DATABASE

        FOR STANDBY

        FROM ACTIVE DATABASE

        DORECOVER

        SPFILE

          SET "db_unique_name"="STDBY"

          SET "log_archive_dest_1"=

             "LOCATION=USE_DB_RECOVERY_FILE_DEST

              VALID_FOR=(ALL_LOGFILES,ALL_ROLES)

              DB_UNIQUE_NAME=STDBY"

          SET "log_archive_dest_2"=

             "SERVICE=PROD ASYNC

              VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)

              DB_UNIQUE_NAME=PROD"

          SET "fal_server"="PROD"

          SET "fal_client"="STDBY"

        NOFILENAMECHECK;

 

RMAN will:

1.    Connect to both TARGET (primary) and AUXILIARY (standby)

2.    Back up primary datafiles and stream directly to standby

3.    Apply all changes and set standby to MOUNT mode

4.    Configure the SPFILE on standby with correct DG parameters

 

TIME

Duplication time depends on database size. A 500 GB database over 10 Gbps takes roughly 15-30 minutes. Monitor with V$SESSION_LONGOPS.

 

Step 7 — Add Standby Redo Logs (SRL)

STEP 7

Create Standby Redo Log Groups

 

Standby Redo Logs (SRL) are mandatory in Oracle 19c for real-time apply. The number of SRL groups must be (online redo log groups + 1) per thread.

 

-- First, check how many ORL groups exist on primary

SELECT GROUP#, MEMBERS, BYTES/1048576 MB FROM V$LOG;

 

-- On STANDBY — add SRL groups (one more than ORL count)

-- Example: 3 ORL groups → add 4 SRL groups

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1

  GROUP 4 ('/oradata/stdby/srl04.log') SIZE 200M;

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1

  GROUP 5 ('/oradata/stdby/srl05.log') SIZE 200M;

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1

  GROUP 6 ('/oradata/stdby/srl06.log') SIZE 200M;

ALTER DATABASE ADD STANDBY LOGFILE THREAD 1

  GROUP 7 ('/oradata/stdby/srl07.log') SIZE 200M;

 

-- Verify SRL groups

SELECT GROUP#, THREAD#, SEQUENCE#, BYTES/1048576 MB, STATUS

FROM   V$STANDBY_LOG;

 

RULE

SRL size must match ORL size. If online redo logs are 200M, SRLs must be 200M. Also add SRLs on PRIMARY for future role transitions.

 

Step 8 — Start Managed Recovery Process (MRP)

STEP 8

Start MRP — Begin Redo Apply

 

The Managed Recovery Process (MRP) reads standby redo logs and applies redo data to the standby database. Start it on the STANDBY:

 

-- On STANDBY — start real-time apply

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE

  USING CURRENT LOGFILE DISCONNECT FROM SESSION;

 

-- Verify MRP is running

SELECT PROCESS, STATUS, THREAD#, SEQUENCE#

FROM   V$MANAGED_STANDBY

WHERE  PROCESS = 'MRP0';

 

-- Check apply and transport lag

SELECT NAME, VALUE, DATUM_TIME

FROM   V$DATAGUARD_STATS

WHERE  NAME IN ('apply lag','transport lag');

 

-- Check database role and mode

SELECT DB_UNIQUE_NAME, OPEN_MODE, DATABASE_ROLE, PROTECTION_MODE

FROM   V$DATABASE;

 

Expected output after successful start:

 

PROCESS  STATUS     THREAD#  SEQUENCE#

-------- ---------  -------  ---------

MRP0     APPLYING_LOG   1      45

 

NAME              VALUE    DATUM_TIME

------------      ------   --------------------

transport lag     +00 00:00:01  2024-01-15 09:30:00

apply lag         +00 00:00:02  2024-01-15 09:30:00

 

Step 9 — Configure Data Guard Broker (DGMGRL)

STEP 9

Set Up Data Guard Broker

 

Data Guard Broker (DGMGRL) automates failover, switchover, and health monitoring. Enable it on both primary and standby:

 

-- Enable broker on PRIMARY and STANDBY (both)

ALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;

 

-- Connect to broker from PRIMARY host

dgmgrl sys/SysPassword@PROD

 

-- Create broker configuration

DGMGRL> CREATE CONFIGURATION 'DG_CONFIG'

          AS PRIMARY DATABASE IS 'PROD'

          CONNECT IDENTIFIER IS PROD;

 

-- Add standby to configuration

DGMGRL> ADD DATABASE 'STDBY'

          AS CONNECT IDENTIFIER IS STDBY

          MAINTAINED AS PHYSICAL;

 

-- Enable the configuration

DGMGRL> ENABLE CONFIGURATION;

 

-- Verify configuration health

DGMGRL> SHOW CONFIGURATION;

DGMGRL> SHOW DATABASE VERBOSE PROD;

DGMGRL> SHOW DATABASE VERBOSE STDBY;

 

Expected output from SHOW CONFIGURATION:

 

Configuration - DG_CONFIG

  Protection Mode: MaxPerformance

  Members:

    PROD  - Primary database

    STDBY - Physical standby database

Fast-Start Failover: Disabled

Configuration Status: SUCCESS   (status updated X seconds ago)

 

Step 10 — Configure RMAN Backup from Standby

STEP 10

RMAN Offload Backup — Run from Standby

 

Running RMAN backups from the physical standby offloads I/O and CPU from the production primary. The backups are usable for primary recovery.

 

10.1 — Set up RMAN Recovery Catalog (Recommended)

-- Create catalog schema on a separate catalog DB

CREATE TABLESPACE rman_ts DATAFILE '/oradata/catdb/rman01.dbf' SIZE 500M AUTOEXTEND ON;

CREATE USER rman IDENTIFIED BY CatPassword DEFAULT TABLESPACE rman_ts;

GRANT RECOVERY_CATALOG_OWNER TO rman;

 

-- Initialize the catalog

rman CATALOG rman/CatPassword@CATDB

RMAN> CREATE CATALOG;

 

-- Register primary database

rman TARGET sys/SysPassword@PROD CATALOG rman/CatPassword@CATDB

RMAN> REGISTER DATABASE;

 

10.2 — Full Database Backup from Standby

rman TARGET sys/SysPassword@PROD CATALOG rman/CatPassword@CATDB

 

RMAN> CONNECT AUXILIARY sys/SysPassword@STDBY;

 

-- Full compressed backup from standby

RMAN> BACKUP DEVICE TYPE DISK

       SECTION SIZE 32G

       AS COMPRESSED BACKUPSET

       DATABASE

       FORMAT '/backup/rman/%d_%T_%s_%p.bkp'

       TAG 'FULL_STDBY_BKP';

 

-- Backup archived logs and delete applied logs

RMAN> BACKUP ARCHIVELOG ALL

       FORMAT '/backup/rman/arch_%d_%T_%s_%p.bkp'

       DELETE INPUT;

 

10.3 — Incremental Backup Strategy

-- Level 0 (full) backup — run weekly

RMAN> BACKUP INCREMENTAL LEVEL 0

       DATABASE FORMAT '/backup/rman/L0_%d_%T_%s.bkp'

       TAG 'INC_L0_WEEKLY';

 

-- Level 1 (incremental) backup — run daily

RMAN> BACKUP INCREMENTAL LEVEL 1

       DATABASE FORMAT '/backup/rman/L1_%d_%T_%s.bkp'

       TAG 'INC_L1_DAILY';

 

-- Validate backup integrity

RMAN> VALIDATE DATABASE;

RMAN> LIST BACKUP SUMMARY;

 

BEST PRACTICE

Schedule backups using OS cron or Oracle Scheduler. Always test recovery using RESTORE DATABASE PREVIEW before an actual disaster.

 

Step 11 — Switchover and Failover Operations

STEP 11

Switchover / Failover via DGMGRL

 

11.1 — Planned Switchover (Zero Data Loss)

Use switchover for planned maintenance. It gracefully transfers the primary role to the standby:

 

dgmgrl sys/SysPassword@PROD

 

-- Verify everything is healthy first

DGMGRL> SHOW CONFIGURATION;

DGMGRL> VALIDATE DATABASE STDBY;

 

-- Perform switchover (STDBY becomes new primary)

DGMGRL> SWITCHOVER TO STDBY;

 

-- Verify roles after switchover

DGMGRL> SHOW CONFIGURATION;

 

-- Expected output:

-- STDBY  - Primary database

-- PROD   - Physical standby database

 

11.2 — Failover (Unplanned — Primary Lost)

Use failover only when the primary is completely unavailable and cannot be recovered quickly:

 

dgmgrl sys/SysPassword@STDBY

 

-- Failover (STDBY becomes primary — data loss possible)

DGMGRL> FAILOVER TO STDBY;

 

-- After failover, re-instantiate the old primary as new standby

DGMGRL> REINSTATE DATABASE PROD;

 

WARNING

Failover is a one-way operation without Fast-Start Failover configured. Always prefer SWITCHOVER for planned activities. Run VALIDATE DATABASE before any role change.

 

Step 12 — Protection Modes

STEP 12

Choose the Right Protection Mode

 

Data Guard offers three protection modes. Choose based on your RPO (Recovery Point Objective) and performance requirements:

 

Mode

Redo Transport

Data Loss Risk

Performance

Maximum Protection

SYNC + AFFIRM

Zero

Highest impact

Maximum Availability

SYNC + AFFIRM

Zero (degrades gracefully)

Medium impact

Maximum Performance

ASYNC

Seconds of data

Lowest impact

 

Set protection mode on the primary:

 

-- Set Maximum Availability (recommended for most production systems)

sqlplus / as sysdba

 

ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;

-- OR via DGMGRL:

DGMGRL> EDIT CONFIGURATION SET PROTECTION MODE AS MAXAVAILABILITY;

 

Step 13 — Health Check Queries

STEP 13

Monitor Data Guard and RMAN Status

 

-- ===== ON PRIMARY =====

 

-- Archive destination status

SELECT DEST_ID, STATUS, TARGET, DESTINATION, DB_UNIQUE_NAME, ERROR

FROM   V$ARCHIVE_DEST_STATUS WHERE TARGET='STANDBY';

 

-- Gap detection

SELECT * FROM V$ARCHIVE_GAP;

 

-- ===== ON STANDBY =====

 

-- Last 10 applied archive logs

SELECT SEQUENCE#, APPLIED, FIRST_TIME, NEXT_TIME

FROM   V$ARCHIVED_LOG

WHERE  DEST_ID=1 ORDER BY SEQUENCE# DESC

FETCH FIRST 10 ROWS ONLY;

 

-- MRP process status

SELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#

FROM   V$MANAGED_STANDBY;

 

-- DG stats (apply lag, transport lag)

SELECT NAME, VALUE, DATUM_TIME

FROM   V$DATAGUARD_STATS;

 

-- ===== RMAN CHECKS =====

 

-- List all backups

RMAN> LIST BACKUP SUMMARY;

 

-- Check for expired backups

RMAN> CROSSCHECK BACKUP;

RMAN> REPORT OBSOLETE;

 

Quick Reference Summary

Use this checklist to verify a complete Data Guard + RMAN setup:

 

5.    Primary is in ARCHIVELOG mode and FRA is configured

6.    All DG init.ora parameters set on primary and standby

7.    TNS entries and static listeners configured on both hosts

8.    Password file copied from primary to standby

9.    Standby created using RMAN DUPLICATE FROM ACTIVE DATABASE

10.  Standby redo logs (SRL) added on both primary and standby

11.  MRP started with USING CURRENT LOGFILE on standby

12.  Data Guard Broker configured and showing SUCCESS

13.  RMAN recovery catalog created and primary/standby registered

14.  Scheduled backups tested from standby and validated

 

FINAL TIP

Always run DGMGRL> VALIDATE DATABASE STDBY before any planned switchover, and periodically run RMAN> RESTORE DATABASE PREVIEW to verify recoverability.