Oracle Data Guard Setup Guide - Standby Database Configuration
Oracle Data Guard Setup Guide
Section titled “Oracle Data Guard Setup Guide”Comprehensive guide to Oracle Data Guard physical standby database setup and management.
Prerequisites Checklist
Section titled “Prerequisites Checklist”-- On Primary: Check archive log modeSELECT LOG_MODE FROM V$DATABASE;
-- Enable archive log mode if neededSHUTDOWN IMMEDIATE;STARTUP MOUNT;ALTER DATABASE ARCHIVELOG;ALTER DATABASE OPEN;
-- Enable force loggingALTER DATABASE FORCE LOGGING;
-- Check force loggingSELECT FORCE_LOGGING FROM V$DATABASE;Primary Database Configuration
Section titled “Primary Database Configuration”Configure Initialization Parameters
Section titled “Configure Initialization Parameters”-- Set unique nameALTER SYSTEM SET DB_UNIQUE_NAME='PRIMARY' SCOPE=SPFILE;
-- Configure log archive destination for localALTER SYSTEM SET LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=PRIMARY' SCOPE=SPFILE;
-- Configure log archive destination for standbyALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=STANDBY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=STANDBY' SCOPE=SPFILE;
-- Enable archive dest stateALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_1=ENABLE SCOPE=SPFILE;ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE SCOPE=SPFILE;
-- Remote archive log destinationsALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(PRIMARY,STANDBY)' SCOPE=SPFILE;
-- Standby file managementALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SCOPE=SPFILE;
-- FAL (Fetch Archive Log) configurationALTER SYSTEM SET FAL_SERVER='STANDBY' SCOPE=SPFILE;ALTER SYSTEM SET FAL_CLIENT='PRIMARY' SCOPE=SPFILE;
-- Log archive formatALTER SYSTEM SET LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' SCOPE=SPFILE;Create Standby Redo Logs
Section titled “Create Standby Redo Logs”-- Add standby redo logs (one more group than online redo logs)-- Check existing redo log sizesSELECT GROUP#, BYTES/1024/1024 AS size_mb FROM V$LOG;
-- Add standby redo log groupsALTER DATABASE ADD STANDBY LOGFILE GROUP 4 SIZE 200M;ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 SIZE 200M;ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 SIZE 200M;ALTER DATABASE ADD STANDBY LOGFILE GROUP 7 SIZE 200M;
-- VerifySELECT GROUP#, TYPE, MEMBER FROM V$LOGFILE ORDER BY GROUP#;Network Configuration
Section titled “Network Configuration”Listener.ora (Both Servers)
Section titled “Listener.ora (Both Servers)”# Primary serverLISTENER_PRIMARY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521)) )
SID_LIST_LISTENER_PRIMARY = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = primary) (ORACLE_HOME = /u01/app/oracle/product/19c/db_1) (SID_NAME = orcl) ) )Tnsnames.ora (Both Servers)
Section titled “Tnsnames.ora (Both Servers)”PRIMARY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = primary_host)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = primary) ) )
STANDBY = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = standby_host)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = standby) ) )Create Physical Standby
Section titled “Create Physical Standby”Method 1: RMAN Duplicate
Section titled “Method 1: RMAN Duplicate”# On Standby: Create required directoriesmkdir -p /u01/oradata/standbymkdir -p /u01/app/oracle/fast_recovery_area
# Start listenerlsnrctl start
# Create password file (copy from primary or create)orapwd file=$ORACLE_HOME/dbs/orapwstandby password=oracle entries=10
# Create pfile for standby# Edit and adjust parameters for standby-- On Standby: Create pfile with these changes*.db_unique_name='STANDBY'*.fal_server='PRIMARY'*.fal_client='STANDBY'*.log_archive_dest_2='SERVICE=PRIMARY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRIMARY'
-- Start standby in nomountSTARTUP NOMOUNT PFILE='?/dbs/initstandby.ora';# Run RMAN duplicate from primaryrman TARGET sys/password@PRIMARY AUXILIARY sys/password@STANDBY
RMAN> DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE DORECOVER SPFILE SET DB_UNIQUE_NAME='STANDBY' SET LOG_ARCHIVE_DEST_2='SERVICE=PRIMARY ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=PRIMARY' SET FAL_SERVER='PRIMARY' SET FAL_CLIENT='STANDBY' NOFILENAMECHECK;Method 2: Backup-Based
Section titled “Method 2: Backup-Based”# On Primary: Create backuprman target /RMAN> BACKUP DATABASE PLUS ARCHIVELOG;RMAN> BACKUP CURRENT CONTROLFILE FOR STANDBY FORMAT '/backup/standby_ctl.bkp';
# Copy backups to standby serverscp /backup/* standby_host:/backup/
# On Standby: Restorerman target /RMAN> STARTUP NOMOUNT;RMAN> RESTORE STANDBY CONTROLFILE FROM '/backup/standby_ctl.bkp';RMAN> ALTER DATABASE MOUNT;RMAN> RESTORE DATABASE;Start Managed Recovery
Section titled “Start Managed Recovery”Real-Time Apply (Recommended)
Section titled “Real-Time Apply (Recommended)”-- On StandbyALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
-- Check statusSELECT PROCESS, STATUS, SEQUENCE#, BLOCK#, DELAY_MINSFROM V$MANAGED_STANDBY;Standard Apply
Section titled “Standard Apply”-- Apply archived logs onlyALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;Stop Recovery
Section titled “Stop Recovery”ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;Monitoring Data Guard
Section titled “Monitoring Data Guard”Check Sync Status
Section titled “Check Sync Status”-- On Primary: Check transport lagSELECT DEST_ID, STATUS, DESTINATION, ERROR, ARCHIVED_SEQ#, APPLIED_SEQ#FROM V$ARCHIVE_DESTWHERE DEST_ID IN (1, 2);
-- Check current sequenceSELECT THREAD#, SEQUENCE#, ARCHIVED, APPLIED FROM V$ARCHIVED_LOGWHERE ARCHIVED = 'YES'ORDER BY SEQUENCE# DESCFETCH FIRST 10 ROWS ONLY;Standby Database Status
Section titled “Standby Database Status”-- On Standby: Check apply statusSELECT DATABASE_ROLE, OPEN_MODE, PROTECTION_MODE, SWITCHOVER_STATUSFROM V$DATABASE;
-- Check recovery progressSELECT PROCESS, STATUS, THREAD#, SEQUENCE#, BLOCK#FROM V$MANAGED_STANDBYWHERE PROCESS IN ('MRP0', 'RFS', 'ARCH');
-- Check apply lagSELECT NAME, VALUE, DATUM_TIME FROM V$DATAGUARD_STATSWHERE NAME IN ('transport lag', 'apply lag');Archive Gap Detection
Section titled “Archive Gap Detection”-- Check for gapsSELECT * FROM V$ARCHIVE_GAP;
-- On Primary: Find missing archivesSELECT THREAD#, LOW_SEQUENCE#, HIGH_SEQUENCE#FROM V$ARCHIVE_GAP;Data Guard Broker (Optional)
Section titled “Data Guard Broker (Optional)”Enable Broker
Section titled “Enable Broker”-- On both Primary and StandbyALTER SYSTEM SET DG_BROKER_START=TRUE SCOPE=BOTH;Configure Using DGMGRL
Section titled “Configure Using DGMGRL”# Connect to brokerdgmgrl sys/password@PRIMARY
# Create configurationDGMGRL> CREATE CONFIGURATION 'DG_Config' AS PRIMARY DATABASE IS 'PRIMARY' CONNECT IDENTIFIER IS PRIMARY;
# Add standbyDGMGRL> ADD DATABASE 'STANDBY' AS CONNECT IDENTIFIER IS STANDBY MAINTAINED AS PHYSICAL;
# Enable configurationDGMGRL> ENABLE CONFIGURATION;
# Show configurationDGMGRL> SHOW CONFIGURATION;DGMGRL> SHOW DATABASE 'PRIMARY';DGMGRL> SHOW DATABASE 'STANDBY';Switchover
Section titled “Switchover”Prerequisites Check
Section titled “Prerequisites Check”-- On PrimarySELECT SWITCHOVER_STATUS FROM V$DATABASE;-- Should be "TO STANDBY" or "SESSIONS ACTIVE"
-- On StandbySELECT SWITCHOVER_STATUS FROM V$DATABASE;-- Should be "NOT ALLOWED" until primary switchesPerform Switchover
Section titled “Perform Switchover”-- Step 1: On Primary - Convert to standbyALTER DATABASE COMMIT TO SWITCHOVER TO STANDBY WITH SESSION SHUTDOWN;SHUTDOWN IMMEDIATE;STARTUP MOUNT;ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;
-- Step 2: On Standby - Convert to primaryALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;SHUTDOWN IMMEDIATE;STARTUP;Using Broker
Section titled “Using Broker”dgmgrl sys/password@PRIMARYDGMGRL> SWITCHOVER TO 'STANDBY';Failover (When Primary is Lost)
Section titled “Failover (When Primary is Lost)”-- On Standby: Cancel recoveryALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
-- Activate standbyALTER DATABASE ACTIVATE STANDBY DATABASE;
-- Open databaseALTER DATABASE OPEN;
-- Note: After failover, old primary requires FLASHBACK DATABASE-- or must be rebuilt from new primaryUsing Broker
Section titled “Using Broker”dgmgrl sys/password@STANDBYDGMGRL> FAILOVER TO 'STANDBY';Reinstate Failed Primary
Section titled “Reinstate Failed Primary”-- On Old Primary (after failover): Use flashbackSHUTDOWN ABORT;STARTUP MOUNT;
-- Flashback to before failoverFLASHBACK DATABASE TO RESTORE POINT BEFORE_FAILOVER;
-- Or flashback to SCNFLASHBACK DATABASE TO SCN &scn;
-- Convert to standbyALTER DATABASE CONVERT TO PHYSICAL STANDBY;
-- Start recoverySHUTDOWN IMMEDIATE;STARTUP MOUNT;ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT;Protection Modes
Section titled “Protection Modes”-- Maximum Performance (default, async)ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PERFORMANCE;
-- Maximum Availability (sync, failover on failure)ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE AVAILABILITY;
-- Maximum Protection (sync, primary shuts down if standby unavailable)ALTER DATABASE SET STANDBY DATABASE TO MAXIMIZE PROTECTION;
-- Check current modeSELECT PROTECTION_MODE FROM V$DATABASE;