Oracle Data Guard Manual DR Drill Steps – Step-by-Step Guide

Step-by-step Oracle Data Guard manual DR drill guide to test and validate disaster recovery between primary and standby databases.
Performing a manual DR drill in Oracle Data Guard is an important activity to ensure your disaster recovery setup is working as expected. In this blog, you will learn step-by-step Oracle Data Guard manual DR drill steps, including required pre-checks, switchover process, and post-validation tasks. This guide is written in simple language to help DBAs confidently test their DR environment without data loss and ensure business continuity.

Oracle Data Guard Manual Switchover Steps

Pre-checks:

Before initiating the activity, take a full RMAN backup of the database to ensure data protection and recovery.

On Primary Database:

Check the primary database status and archive sequence details.
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      READ WRITE           PRIMARY          ARCHIVELOG   TO STANDBY

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            39

On Standby Database:

Check the standby database status and archive sequence details.
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      MOUNTED              PHYSICAL STANDBY ARCHIVELOG   NOT ALLOWED

SQL> select max(sequence#) from v$archived_log where applied='YES';

MAX(SEQUENCE#)
--------------
            39

On Primary Database:

Verify Archive Log Destination Status on the Primary Database.
SQL> SELECT DEST_ID, DEST_NAME, STATUS, ERROR FROM V$ARCHIVE_DEST;

   DEST_ID DEST_NAME               STATUS    ERROR
---------- ----------------------- --------- -------------------------------------
         1 LOG_ARCHIVE_DEST_1      VALID
         2 LOG_ARCHIVE_DEST_2      VALID
         3 LOG_ARCHIVE_DEST_3      INACTIVE
         4 LOG_ARCHIVE_DEST_4      INACTIVE
         5 LOG_ARCHIVE_DEST_5      INACTIVE
         6 LOG_ARCHIVE_DEST_6      INACTIVE
         7 LOG_ARCHIVE_DEST_7      INACTIVE
         8 LOG_ARCHIVE_DEST_8      INACTIVE
         9 LOG_ARCHIVE_DEST_9      INACTIVE
        10 LOG_ARCHIVE_DEST_10     INACTIVE
        11 LOG_ARCHIVE_DEST_11     INACTIVE
        12 LOG_ARCHIVE_DEST_12     INACTIVE
        13 LOG_ARCHIVE_DEST_13     INACTIVE
        14 LOG_ARCHIVE_DEST_14     INACTIVE
        15 LOG_ARCHIVE_DEST_15     INACTIVE
        16 LOG_ARCHIVE_DEST_16     INACTIVE
        17 LOG_ARCHIVE_DEST_17     INACTIVE
        18 LOG_ARCHIVE_DEST_18     INACTIVE
        19 LOG_ARCHIVE_DEST_19     INACTIVE
        20 LOG_ARCHIVE_DEST_20     INACTIVE
        21 LOG_ARCHIVE_DEST_21     INACTIVE
        22 LOG_ARCHIVE_DEST_22     INACTIVE
        23 LOG_ARCHIVE_DEST_23     INACTIVE
        24 LOG_ARCHIVE_DEST_24     INACTIVE
        25 LOG_ARCHIVE_DEST_25     INACTIVE
        26 LOG_ARCHIVE_DEST_26     INACTIVE
        27 LOG_ARCHIVE_DEST_27     INACTIVE
        28 LOG_ARCHIVE_DEST_28     INACTIVE
        29 LOG_ARCHIVE_DEST_29     INACTIVE
        30 LOG_ARCHIVE_DEST_30     INACTIVE
        31 LOG_ARCHIVE_DEST_31     INACTIVE

31 rows selected. 
Note the values of job queue processes and invalid database objects.
SQL> show parameter job_queue_processes;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
job_queue_processes                  integer     40

SQL> select count(*) from dba_objects where status='INVALID';

  COUNT(*)
----------
         0
Take a control file backup as trace and create a PFILE from the SPFILE.
SQL> alter database backup controlfile to trace as '/home/app/oracle/ctl_trace.bkp';

Database altered.

SQL> create pfile='/home/app/oracle/pfile_backup.ora' from spfile;

File created.
Switch the log before initiating the activity and verify database sync again.
SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> alter system switch logfile;

System altered.

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            43

On Standby Database:

Check the applied sequence on the standby database and ensure it matches the primary database.
SQL> select max(sequence#) from v$archived_log where applied='YES';

MAX(SEQUENCE#)
--------------
            43

Switchover Steps:

On Primary Database:

Set the job_queue_processes parameter to 0 before starting the switchover.
SQL> alter system set job_queue_processes=0 scope=both;

System altered.
First, verify that the primary database is ready for switchover. Once verification is successful, initiate the switchover and convert the primary database to a standby role.
SQL> alter database switchover to ORCLDR verify;

Database altered.

SQL> alter database commit to switchover to standby with session shutdown nowait;

Database altered.
Restart the database and mount it as a standby database.
SQL> shut immediate;
ORA-01012: not logged on
SQL>
SQL> startup nomount;
ORACLE instance started.

Total System Global Area 1543502248 bytes
Fixed Size                  8939944 bytes
Variable Size            1056964608 bytes
Database Buffers          469762048 bytes
Redo Buffers                7835648 bytes
SQL>
SQL> alter database mount standby database;

Database altered.

SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      MOUNTED              PHYSICAL STANDBY ARCHIVELOG   RECOVERY NEEDED
Defer the log_archive_dest_state_2 parameter and start the Managed Recovery Process (MRP).
SQL> alter system set log_archive_dest_state_2='DEFER';

System altered.

SQL> alter database recover managed standby database disconnect from session;

Database altered.

On Standby Database:

Stop MRP, convert the standby to primary, bounce the database, and enable log_archive_dest_state_2.
SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database commit to switchover to primary with session shutdown nowait;

Database altered.

SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup
ORACLE instance started.

Total System Global Area 1543502248 bytes
Fixed Size                  8939944 bytes
Variable Size            1073741824 bytes
Database Buffers          452984832 bytes
Redo Buffers                7835648 bytes
Database mounted.
Database opened.
SQL>
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE         DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- ----------------- ---------------- ------------ --------------------
ORCL      READ WRITE        PRIMARY          ARCHIVELOG   TO STANDBY

SQL> alter system set log_archive_dest_state_2='ENABLE';

System altered.

On Primary (New Standby) Database:

Check that MRP and RFS are active on the new standby database.
SQL> select process,status,sequence# from v$managed_standby;

PROCESS   STATUS        SEQUENCE#
--------- ------------ ----------
ARCH      CONNECTED             0
DGRD      ALLOCATED             0
DGRD      ALLOCATED             0
ARCH      CONNECTED             0
ARCH      CONNECTED             0
DGRD      ALLOCATED             0
ARCH      CONNECTED             0
MRP0      APPLYING_LOG         49
RFS       IDLE                  0
RFS       IDLE                 49
RFS       IDLE                  0

Oracle Data Guard Manual Switchback Steps

Pre-checks:

On Current Primary Database:

Check the database status and archive sequence details.
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      READ WRITE           PRIMARY          ARCHIVELOG   TO STANDBY

SQL> select max(sequence#) from v$archived_log;

MAX(SEQUENCE#)
--------------
            48

On Current Standby Database:

Check the database status and archive sequence details.
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      MOUNTED              PHYSICAL STANDBY ARCHIVELOG   NOT ALLOWED

SQL> select max(sequence#) from v$archived_log where applied='YES';

MAX(SEQUENCE#)
--------------
            48
Take a control file backup as trace and create a PFILE from the SPFILE.
SQL> alter database backup controlfile to trace as '/home/app/oracle/ctl_trace.bkp';

Database altered.

SQL> create pfile='/home/app/oracle/pfile_backup.ora' from spfile;

File created.

Switchback Steps:

On Current Primary Database:

Verify the switchover status, perform the switchover, then restart the database and bring it up in mount state.
SQL> select switchover_status from v$database;

SWITCHOVER_STATUS
--------------------
TO STANDBY

SQL> alter database commit to switchover to physical standby with session shutdown nowait;

Database altered.

SQL> shut immediate;
ORA-01012: not logged on
SQL>
SQL> startup mount;
ORACLE instance started.

Total System Global Area 1543502248 bytes
Fixed Size                  8939944 bytes
Variable Size            1073741824 bytes
Database Buffers          452984832 bytes
Redo Buffers                7835648 bytes
Database mounted.
SQL>
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      MOUNTED              PHYSICAL STANDBY ARCHIVELOG   RECOVERY NEEDED

On Current Standby Database:

Stop MRP, convert the current standby to primary and bounce the database.
SQL> alter database recover managed standby database cancel;

Database altered.

SQL> alter database commit to switchover to primary with session shutdown nowait;

Database altered.

SQL> shutdown immediate;
ORA-01109: database not open


Database dismounted.
ORACLE instance shut down.
SQL>
SQL> startup;
ORACLE instance started.

Total System Global Area 1543502248 bytes
Fixed Size                  8939944 bytes
Variable Size            1056964608 bytes
Database Buffers          469762048 bytes
Redo Buffers                7835648 bytes
Database mounted.
Database opened.
SQL>
SQL> select name, open_mode, database_role, log_mode, switchover_status from v$database;

NAME      OPEN_MODE            DATABASE_ROLE    LOG_MODE     SWITCHOVER_STATUS
--------- -------------------- ---------------- ------------ --------------------
ORCL      READ WRITE           PRIMARY          ARCHIVELOG   NOT ALLOWED
Enable the log_archive_dest_state_2 parameter and restore the job_queue_processes parameter to its previously noted value.
SQL> alter system set log_archive_dest_state_2=ENABLE scope=both;

System altered.

SQL> ALTER SYSTEM SET job_queue_processes=40 SCOPE=BOTH;

System altered.

On New Standby Database:

Defer log_archive_dest_state_2, start MRP, and verify MRP and RFS on the new standby database.
SQL> alter system set log_archive_dest_state_2=DEFER scope=both;

System altered.

SQL> alter database recover managed standby database disconnect from session;

Database altered.

SQL> select process, status, thread#, sequence#, block#, blocks from v$managed_standby;

PROCESS         STATUS          THREAD#  SEQUENCE#     BLOCK#     BLOCKS
--------------- ------------ ---------- ---------- ---------- ----------
ARCH            CONNECTED             0          0          0          0
DGRD            ALLOCATED             0          0          0          0
DGRD            ALLOCATED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
ARCH            CONNECTED             0          0          0          0
RFS             IDLE                  1          0          0          0
RFS             IDLE                  1         50      77289          1
MRP0            APPLYING_LOG          1         50      77289     409600

35 rows selected.

Post a Comment

© Ayaan Israr - All rights reserved. Premium By Ayaan Israr