oracledba.help
DataGuard

Rebuild SB (Data ReSync of Existing SB)

Overview

This process covers the refresh (AKA rebuild) of the SB.
Assumes all the base settings are the same, i.e. you just want to refresh the data on the SB.

 Role     Abbrev  Hostname       db_unique_name
 -------  ------  -------------  -------------------
 Primary  PRI     d2-oratrn-s01  dnatra
 StandBy  SB      d1-oratrn-s01  dnatra_sb
  • Change entries to match your PRI and SB environment.
  • SELECT value FROM v$parameter WHERE name = 'db_unique_name';

PRE

 -- Get FRA values on Primary (example below)
 SHOW PARAMETER db_recovery_file_dest;
 /u03/fra
 SHOW PARAMETER db_recovery_file_dest_size;
 2304G

1. On SB, Create Fresh Parameter File (PFILE) as shown.

 -- Set db_recovery_file_dest_* to match Primary.
 cat > $ORACLE_HOME/dbs/initdnatra.ora <<'EOF'
 DB_NAME=dnatra
 DB_UNIQUE_NAME=dnatra_sb
 db_recovery_file_dest=/u03/fra
 db_recovery_file_dest_size=2304G
 control_files=/u03/controlfiles/dnatra_sb/control01.ctl
 EOF

Remove leading space from each line.

2. On SB, Ensure Directory Structure Exists

 mkdir -p /u01/app/oracle/admin/dnatra/adump
 mkdir -p /u01/app/oracle/oradata/dnatra
 mkdir -p /u02/oradata/DNATRA_SB
 mkdir -p /u03/fra/dnatra
 mkdir -p /u03/controlfiles/dnatra
 mkdir -p /u05/oradata/DNATRA_SB/datafile
 chown -R oracle:oinstall /u01/app/oracle/oradata /u02 /u03 /u05

3. On SB, Start NOMOUNT Using the PFILE

 export ORACLE_SID=dnatra
 sqlplus / as sysdba
 shutdown immediate
 STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initdnatra.ora';

4. From PRI, Recreate Password File

 ping d1-oratrn-s01
 scp /u01/app/oracle/product/19.3.0.0.0/dbhome_1/dbs/orapwdnatra oracle@d1-oratrn-s01:$ORACLE_HOME/dbs/orapwdnatra

5. On SB, Prepurge Stale Datafiles

 rm -rf /u02/oradata/DNATRA_SB/*
 rm -f /u03/controlfiles/dnatra/control01.ctl

 -- If Required
 rm -f /u05/oradata/DNATRA/datafile/indexes01.dbf
 rm -f /u05/oradata/DNATRA_SB/datafile/indexes01.dbf

 Check disk space: df -h

6. On PRI, run RMAN DUPLICATE

 rman target sys/********@dnatra auxiliary sys/********@dnatra_sb
 connected to target database: DNATRA (DBID=4191999671)
 connected to auxiliary database: DNATRA (not mounted)

 If not connected as shown above:
 SHUTDOWN IMMEDIATE then STARTUP NOMOUNT PFILE='$ORACLE_HOME/dbs/initdnatra.ora';


 -- RMAN Cmd Factoring in a TS (INDEXES) File Moved outside the DB_CREATE_FILE_DEST
    -- Get File Number of files outside the DB_CREATE_FILE_DEST (ex. below)
    SELECT file_id, file_name FROM  dba_data_files
    WHERE  tablespace_name = 'INDEXES' ORDER  BY file_id;
    21

 RUN {
  -- Pin any files outside the DB_CREATE_FILE_DESTINDEXES (ex. below)
  SET NEWNAME FOR DATAFILE 21 TO '/u05/oradata/DNATRA_SB/datafile/indexes01.dbf';

  DUPLICATE TARGET DATABASE
    FOR STANDBY
    FROM ACTIVE DATABASE
    DORECOVER
    SPFILE
      SET DB_UNIQUE_NAME='dnatra_sb'
      SET DB_CREATE_FILE_DEST='/u02/oradata/DNATRA_SB'
      SET DB_RECOVERY_FILE_DEST='/u03/fra'
      SET CONTROL_FILES='/u03/controlfiles/dnatra_sb/control01.ctl'
      SET DB_FILE_NAME_CONVERT=
        '/u02/oradata/DNATRA','/u02/oradata/DNATRA_SB',
        '/u05/oradata/DNATRA','/u05/oradata/DNATRA_SB'
      SET LOG_FILE_NAME_CONVERT=
        '/u02/oradata/DNATRA','/u02/oradata/DNATRA_SB',
        '/u05/oradata/DNATRA','/u05/oradata/DNATRA_SB'
    NOFILENAMECHECK;
 }


 -- Standard RMAN (all dbf files here DB_CREATE_FILE_DEST)
 RMAN>
 DUPLICATE TARGET DATABASE 
   FOR STANDBY 
   FROM ACTIVE DATABASE 
   DORECOVER 
   SPFILE
     SET DB_UNIQUE_NAME='dnatra_sb'
     SET DB_FILE_NAME_CONVERT='/u01/app/oracle/oradata/dnatra','/u01/app/oracle/oradata/dnatra'
     SET LOG_FILE_NAME_CONVERT='/u01/app/oracle/oradata/dnatra','/u01/app/oracle/oradata/dnatra'
     SET DB_RECOVERY_FILE_DEST='/u02/fra/dnatra'
     SET CONTROL_FILES='/u03/controlfiles/dnatra/control01.ctl'
 NOFILENAMECHECK;

  On SB: watch -n 10 df -h /u02 /u03 /u05
  with 10gb network: [Est. 2 Hours of 7tb database]

7. On SB, Enable Flashback and Start Recovery

   -- Start Redo Apply (initial test)
   ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

   -- Confirm MRP0 recovery process
   SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY;
   You should see: MRP0 with status like WAIT_FOR_LOG or APPLYING_LOG

   -- Stop Recovery → Enable Flashback → Restart Recovery
   ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
   ALTER DATABASE FLASHBACK ON;
   ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;

8. On PRI, Restore Data Guard Parameters and Resume Redo Transport
If you previously cleared any Data Guard config (e.g. LOG_ARCHIVE_DEST_2='')
before the schema refresh, you must now restore them.

   show parameter LOG_ARCHIVE_DEST_2
   show parameter  LOG_ARCHIVE_CONFIG
   show parameter LOG_ARCHIVE_DEST_STATE_2

   IF REQUIRED (per above param checks)

   -- Reconfigure redo shipping to the SB
   ALTER SYSTEM SET LOG_ARCHIVE_DEST_2 = 'SERVICE=dnatra_sb LGWR ASYNC 
      VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=dnatra_sb' SCOPE=BOTH;

   -- Restore Data Guard configuration awareness
   ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(dnatra,dnatra_sb)' SCOPE=BOTH;

   -- Re-enable redo transport
   ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=BOTH;

9. Post-Validation Checks

   -- Confirm status is VALID
   SELECT DEST_ID, STATUS, ERROR FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
   PRI = VALID
   SB  = DEFERRED

   -- Confirm redo apply is active (Sequence# Check)
   SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY;
   PRI = WRITING
   SB  = APPLYING_LOG
   Sequence# should match.

   -- Confirm archive destination status and apply sequence
   SELECT DEST_ID, STATUS, APPLIED_SEQ# FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID > 1;

   -- Confirm standby role, open mode, switchover readiness
   SELECT NAME, OPEN_MODE, DATABASE_ROLE, SWITCHOVER_STATUS FROM V$DATABASE;

   -- Confirm Flashback Database is ON
   SELECT FLASHBACK_ON FROM V$DATABASE;

   --Make the PRI view catch up
   Run a switch (or two) on the PRI and recheck:

   -- On PRI
   ALTER SYSTEM SWITCH LOGFILE;
   ALTER SYSTEM ARCHIVE LOG CURRENT;

   -- PRI
   SELECT ads.dest_id, ad.db_unique_name, ads.recovery_mode,
          ads.archived_seq#, ads.applied_seq#
   FROM   v$archive_dest_status ads
   JOIN   v$archive_dest ad ON ad.dest_id = ads.dest_id
   WHERE  ads.status='VALID' AND ad.target='STANDBY'
   ORDER  BY ads.dest_id;

   -- BOTH
   SELECT PROCESS, STATUS, THREAD#, SEQUENCE# FROM V$MANAGED_STANDBY;

   -- Quick sanity Check if INDEXES Outside DB_CREATE_FILE_DEST
   SELECT df.file#,ts.name AS tablespace_name,df.name AS file_name 
   FROM   v$datafile df JOIN   v$tablespace ts ON ts.ts# = df.ts#
   WHERE  ts.name = 'INDEXES' ORDER  BY df.file#;

As Needed

Reset RMAN

The following command resets all the RMAN parameters back to their default values.

 SQL> execute dbms_backup_restore.resetConfig;

Reset RMAN values for your environment (rman.cfg.rmn).

 # rman.cfg.rmn
 CONFIGURE COMPRESSION ALGORITHM 'MEDIUM';
 CONFIGURE CONTROLFILE AUTOBACKUP on;
 CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE disk TO '/u04/dnatra/rman/%F';
 CONFIGURE RETENTION POLICY TO RECOVERY WINDOW OF 14 DAYS;
 CONFIGURE SNAPSHOT CONTROLFILE NAME TO '/u03/rman/snapshot.ctl';

 CONFIGURE DEVICE TYPE disk BACKUP TYPE TO compressed backupset PARALLELISM 4;
 CONFIGURE CHANNEL 1 DEVICE TYPE disk FORMAT '/u04/dnatra/rman/%U.bkp';
 CONFIGURE CHANNEL 2 DEVICE TYPE disk FORMAT '/u04/dnatra/rman/%U.bkp';
 CONFIGURE CHANNEL 3 DEVICE TYPE disk FORMAT '/u04/dnatra/rman/%U.bkp';
 CONFIGURE CHANNEL 4 DEVICE TYPE disk FORMAT '/u04/dnatra/rman/%U.bkp';

 show all;

APPENDIX

Legacy Pfile

 %green%--This Type Better if You Need to Set Everything before RMAN DUPLICATE%%
 cat <<EOF > $ORACLE_HOME/dbs/init{$:vPrimary}.ora
 DB_NAME={$:vPrimary}
 DB_UNIQUE_NAME={$:vPrimary}_sb
 CONTROL_FILES='/u03/controlfiles/{$:vPrimary}/control01.ctl'
 DB_CREATE_FILE_DEST='/u01/app/oracle/oradata/{$:vPrimary}'
 DB_RECOVERY_FILE_DEST='/u02/fra/{$:vPrimary}'
 DB_RECOVERY_FILE_DEST_SIZE=7000G
 FAL_SERVER={$:vPrimary}
 FAL_CLIENT={$:vPrimary}_sb
 LOG_ARCHIVE_CONFIG='DG_CONFIG=({$:vPrimary},{$:vPrimary}_sb)'
 LOG_ARCHIVE_DEST_2='SERVICE={$:vPrimary} LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME={$:vPrimary}'
 EOF

File Move QC

 -- Post RMAN Quick Check
 If indexes01.dbf was created here /u05/oradata/DNATRA/datafile move it as so:  
    ALTER DATABASE MOVE DATAFILE '/u05/oradata/DNATRA/datafile/indexes01.dbf'
    TO '/u05/oradata/DNATRA_SB/datafile/indexes01.dbf';