When running mission-critical applications, downtime is never an option. That’s why many organizations rely on Oracle Data Guard Physical Standby to protect their data and ensure business continuity. In this guide, we’ll walk through how to configure RAC Primary to RAC Standby with a Dedicated Log-Shipping Network, a best-practice approach that improves performance, reduces latency, and strengthens resilience. By isolating log transport onto its own network, you minimize the risk of congestion on public or interconnect traffic—giving your database a more reliable safety net during switchover and failover operations.

Why a second network for redo?
- Isolation & performance: keep redo/protection traffic off the public client network.
- Availability: DG VIPs ensure endpoint survivability during node failovers.
- Operational clarity: LISTENER_NETWORKS cleanly separates registrations for public vs. redo/Broker traffic.
1. Cluster Configuration Information
RAC Primary Nodes (db112a)
| Category | Details |
|---|---|
| Public IPs / eth0 | Node 1:<eth0_ip_prodvm1> → prodvm1.<domain><eth0_ip_prodvm1-vip> → prodvm1-vip.<domain>Node 2: <eth0_ip_prodvm2> → prodvm2.<domain><eth0_ip_prodvm2-vip> → prodvm2-vip.<domain> |
| SCAN | <ip_scan_prodvmscan1> → prodvmscan1.<domain> |
| Data Guard IPs / eth2 | Node 1:<eth2_ip_prodvm1-dg> → prodvm1-dg.<domain><eth2_ip_prodvm1-dg-vip> → prodvm1-dg-vip.<domain>Node 2: <eth2_ip_prodvm2-dg> → prodvm2-dg.<domain><eth2_ip_prodvm2-dg-vip> → prodvm2-dg-vip.<domain> |
| Database | db_name: db112adb_unique_name: db112aInstances: db112a1, db112a2 |
RAC Standby Nodes (db112a_stb)
| Category | Details |
|---|---|
| Public IPs / eth0 | Node 1:<eth0_ip_stbyvm1> → stbyvm1.<domain><eth0_ip_stbyvm1-vip> → stbyvm1-vip.<domain>Node 2: <eth0_ip_stbyvm2> → stbyvm2.<domain><eth0_ip_stbyvm2-vip> → stbyvm2-vip.<domain> |
| SCAN | <ip_scan_stbyvmscan1> → stbyvmscan1.<domain> |
| Data Guard IPs / eth2 | Node 1:<eth2_ip_stbyvm1-dg> → stbyvm1-dg<eth2_ip_stbyvm1-dg-vip> → stbyvm1-dg-vip.<domain>Node 2:• <eth2_ip_stbyvm2-dg> → stbyvm2-dg<eth2_ip_stbyvm2-dg-vip> → stbyvm2-dg-vip.<domain> |
| Database | db_name: db112adb_unique_name: db112a_stbInstances: db112a1, db112a2 |
2. Register the DG network in Clusterware (grid home)
Next, add the new network configuration to the Oracle GRID environment. This network will run on eth2 using the subnet <192.nnn.nnn.0>. In this setup, the same network is shared between the Primary and Standby sites since no router is present—the connection is handled directly through a network switch. This design simplifies connectivity and ensures lower latency for Data Guard log shipping.
At the Primary site, log in to one of the cluster nodes and use the srvctl command to create the new network resource. Defining this resource ensures that Oracle Clusterware recognizes the dedicated log-shipping network, keeping it highly available and properly managed during switchover or failover operations.
On each site (run once per cluster):
Production
# Add network resource (example key -k 2, device eth2, subnet/mask placeholders)
srvctl add network -netnum 2 -subnet <192.x.y.0>/<mask nnn.nnn.nnn.0>/eth2 -nettype static -verbose
crsctl stat res -t # confirm ora.net2.network exists
Output
[root@prodvm1 ~]# srvctl add network -netnum 2 -subnet 192.168.56.0/255.255.255.0/eth2 -nettype static -verbose
Successfully added Network.
[root@grid1vm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
ora.net2.network
OFFLINE OFFLINE prodvm1
OFFLINE OFFLINE prodvm2
Standby
[root@stbyvm1 ~]# srvctl add network -k 2 -S <192.nnn.nn.0>/<mask nnn.nnn.nnn.0>/eth2 -w static -v
[root@stbyvm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
ora.net2.network
OFFLINE OFFLINE stbyvm1
OFFLINE OFFLINE stbyvm2
Start it:
crsctl start res ora.net2.network
crsctl stat res -t # ora.net2.network ONLINE on all nodes
Production Output
[root@prodvm1 ~]# crsctl start res ora.net2.network
CRS-2672: Attempting to start 'ora.net2.network' on 'prodvm1'
CRS-2672: Attempting to start 'ora.net2.network' on 'prodvm2'
CRS-2676: Start of 'ora.net2.network' on 'prodvm2' succeeded
CRS-2676: Start of 'ora.net2.network' on 'prodvm1' succeeded
[root@prodvm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
ora.net2.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
..
.
ora.db112a.db
1 ONLINE ONLINE prodvm1 Open
2 ONLINE ONLINE prodvm2 Open
Standby Site Output
[root@stbyvm1 ~]# crsctl start res ora.net2.network
CRS-2672: Attempting to start 'ora.net2.network' on 'stbyvm1'
CRS-2672: Attempting to start 'ora.net2.network' on 'stbyvm2'
CRS-2676: Start of 'ora.net2.network' on 'stbyvm2' succeeded
CRS-2676: Start of 'ora.net2.network' on 'stbyvm1' succeeded
[root@stbyvm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
ora.net2.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
..
.
ora.db112a_stb.db
1 ONLINE INTERMEDIATE stbyvm1 Mounted (Closed)
2 ONLINE INTERMEDIATE stbyvm2 Mounted (Closed)
If you receive this error
crsctl start res ora.net2.network
CRS-4995: The command ‘Start resource’ is invalid in crsctl. Use srvctl for this command.
Please add VIP resource for the 2nd network, then start the VIP resource via srvctl start vip command as root user.The network resource will be started as a dependency from the VIP resource.
3. Create DG VIPs on the DG network (per cluster)
Add VIPs tied to -k 2 (the DG network):
# At the Primary site from one of the cluster nodes
srvctl add vip -n prodvm1 -A <eth2_ip_prodvm1-dg-vip>/<mask> -k 2
srvctl add vip -n prodvm2 -A <eth2_ip_prodvm2-dg-vip>/<mask> -k 2
# Standby site from one of the cluster nodes
srvctl add vip -n stbyvm1 -A <eth2_ip_stbyvm1-dg-vip>/<mask> -k 2
srvctl add vip -n stbyvm2 -A <eth2_ip_stbyvm2-dg-vip>/<mask> -k 2
srvctl start vip -i stbyvm1-dg-vip
srvctl start vip -i stbyvm2-dg-vip
Start prodction site VIP
srvctl start vip -i prodvm1-dg-vip
srvctl start vip -i prodvm2-dg-vip
Production status
[root@prodvm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
ora.net2.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
..
.
ora.db112a.db
1 ONLINE ONLINE prodvm1 Open
2 ONLINE ONLINE prodvm2 Open
ora.prodvm1-dg-vip.vip
1 ONLINE ONLINE prodvm1
ora.prodvm1.vip
1 ONLINE ONLINE prodvm1
ora.prodvm2-dg-vip.vip
1 ONLINE ONLINE prodvm2
ora.prodvm2.vip
Start standby site VIP from one of the cluster nodes
[root@stbyvm1 ~]# srvctl start vip -i stbyvm2-dg-vip
[root@stbyvm1 ~]# crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.net1.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
ora.net2.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
..
.
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
..
.
ora.db112a_stb.db
1 ONLINE INTERMEDIATE stbyvm1 Mounted (Closed)
2 ONLINE INTERMEDIATE stbyvm2 Mounted (Closed)
ora.stbyvm1-dg-vip.vip
1 ONLINE ONLINE stbyvm1
ora.stbyvm1.vip
1 ONLINE ONLINE stbyvm1
ora.stbyvm2-dg-vip.vip
1 ONLINE ONLINE stbyvm2
ora.stbyvm2.vip
1 ONLINE ONLINE stbyvm2
Verify with crsctl stat res -t—you should see ora.<host>-dg-vip.vip ONLINE.
4. Create LISTENER_DG on the DG network (grid home)
On the Primary site, start from the first node and create a dedicated Data Guard listener in the GRID home using NETCA. Configure the listener to run on the new network interface with the TCP protocol and assign it to port 1555. For clarity and consistency, name the new listener LISTENER_DG.
netca # Oracle Net Configuration Assistant → create LISTENER_DG on network2 (eth2)

crsctl stat res -t # ora.LISTENER_DG.lsnr ONLINE on all nodes
[oracle@prodvm1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.LISTENER.lsnr
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
ora.LISTENER_DG.lsnr
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
..
.
ora.net1.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
ora.net2.network
ONLINE ONLINE prodvm1
ONLINE ONLINE prodvm2
..
.
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE prodvm1
ora.db112a.db
1 ONLINE ONLINE prodvm1 Open
2 ONLINE ONLINE prodvm2 Open
ora.prodvm1-dg-vip.vip
1 ONLINE ONLINE prodvm1
ora.prodvm1.vip
1 ONLINE ONLINE prodvm1
ora.prodvm2-dg-vip.vip
1 ONLINE ONLINE prodvm2
ora.prodvm2.vip
1 ONLINE ONLINE prodvm2
ora.oc4j
1 OFFLINE OFFLINE
ora.scan1.vip
1 ONLINE ONLINE prodvm1
On the Standby site, begin from the first node and configure a dedicated Data Guard listener in the GRID home using NETCA. Set the listener to use the TCP protocol on port 1555, and name it LISTENER_DG to match the Primary configuration.
[oracle@stbyvm1 ~]$ crsctl stat res -t
--------------------------------------------------------------------------------
NAME TARGET STATE SERVER STATE_DETAILS
--------------------------------------------------------------------------------
Local Resources
--------------------------------------------------------------------------------
..
.
ora.LISTENER.lsnr
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
ora.LISTENER_DG.lsnr
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
..
.
ora.net1.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
ora.net2.network
ONLINE ONLINE stbyvm1
ONLINE ONLINE stbyvm2
..
.
--------------------------------------------------------------------------------
Cluster Resources
--------------------------------------------------------------------------------
ora.LISTENER_SCAN1.lsnr
1 ONLINE ONLINE stbyvm1
ora.db112a_stb.db
1 ONLINE ONLINE stbyvm1 Open
2 ONLINE ONLINE stbyvm2 Open
ora.stbyvm1-dg-vip.vip
1 ONLINE ONLINE stbyvm1
ora.stbyvm1.vip
1 ONLINE ONLINE stbyvm1
ora.stbyvm2-dg-vip.vip
1 ONLINE ONLINE stbyvm2
ora.stbyvm2.vip
1 ONLINE ONLINE stbyvm2
..
.
ora.scan1.vip
1 ONLINE ONLINE stbyvm1
SCAN listeners remain for public client traffic (port 1521). LISTENER_DG is in addition and bound to the DG network.
For reliable log transport, ensure that log shipping between the Primary and Standby sites uses the default database service. This guarantees that the service remains available throughout the entire switchover process. The default database service should be registered in the listeners using the db_unique_name value for both the Primary and Standby databases.
The Primary Site listener used in log shipping will show
[grid@prodvm1 ~]$ lsnrctl services listener_dg
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 19-SEP-2014 11:01:07
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_DG)))
Services Summary...
Service "db112a.<domain>" has 2 instance(s).
Instance "db112a1", status READY, has 2 handler(s) for this service...
Handler(s):
"DEDICATED" established:6 refused:0 state:ready
LOCAL SERVER
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<eth2_ip_prodvm1-dg-vip>)(PORT=1555)))
Instance "db112a2", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:1 refused:0 state:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<eth2_ip_prodvm2-dg-vip>)(PORT=1555)))
The Standy Site listener used in log shipping will show
[grid@stbyvm1 ~]$ lsnrctl services listener_dg
LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 20-SEP-2014 05:29:40
Copyright (c) 1991, 2011, Oracle. All rights reserved.
Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=IPC)(KEY=LISTENER_DG)))
Services Summary...
Service "db112a_stb.<domain>" has 2 instance(s).
Instance "db112a1", status READY, has 2 handler(s) for this service...
Handler(s):
"DEDICATED" established:5 refused:0 state:ready
LOCAL SERVER
"DEDICATED" established:0 refused:0 state:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<eth2_ip_stbyvm1-dg-vip>)(PORT=1555)))
Instance "db112a2", status READY, has 1 handler(s) for this service...
Handler(s):
"DEDICATED" established:2 refused:0 state:ready
REMOTE SERVER
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=<eth2_ip_stbyvm2-dg-vip>)(PORT=1555)))
5. TNS aliases for shipping & Broker
Create the required TNS alias entries for log shipping and listener registration for each instance in both the Primary and Standby clusters. These entries must be added to the tnsnames.ora file located in the RDBMS home from which the database instances run. Once updated, ensure that this tnsnames.ora file is replicated across all cluster nodes in both the Primary and Standby sites to maintain consistency.
Place in RDBMS home’s tnsnames.ora on all nodes (both sites). Adjust names/ports:
# Public via SCAN
DB112A_PRM =
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prodvmscan1.<domain>)(PORT=1521))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db112a.<domain>)))
DB112A_STB =
(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvmscan1.<domain>)(PORT=1521))
(CONNECT_DATA=(SERVICE_NAME=db112a_stb.<domain>)))
# DG/Broker on private network (eth2, port 1555) with DG VIPs
DB112A_PRM_DGMGRL =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm1-dg-vip.<domain>)(PORT=1555))
(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db112a_dgmgrl.<domain>)))
DB112A_STB_DGMGRL =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm1-dg-vip.<domain>)(PORT=1555))
(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db112a_stb_dgmgrl.<domain>)))
# Redo shipping endpoints (default service names for transport)
DB112A_PRM_SHIP =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm1-dg-vip.<domain>)(PORT=1555))
(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db112a.<domain>)))
DB112A_STB_SHIP =
(DESCRIPTION=
(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm1-dg-vip.<domain>)(PORT=1555))
(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=db112a_stb.<domain>)))
# LISTENER_NETWORKS Aliases used to implement service registrations with both local and remote listeners across the cluster nodes and data guard environment.
prodVM1_LOCAL_NET1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth0_ip_prodvm1> )(PORT = 1521)))
prodVM1_LOCAL_NET2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_prodvm1-dg-vip> )(PORT = 1555)))
prodVM2_LOCAL_NET1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth0_ip_prodvm2> )(PORT = 1521)))
prodVM2_LOCAL_NET2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_prodvm2-dg-vip> )(PORT = 1555)))
prod_REMOTE_NET2 =
(DESCRIPTION_LIST =
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_prodvm1-dg-vip> )(PORT = 1555)))
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_prodvm2-dg-vip> )(PORT = 1555))))
stbyVM1_LOCAL_NET1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth0_ip_stbyvm1>)(PORT = 1521)))
stbyVM1_LOCAL_NET2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST =<eth2_ip_stbyvm1-dg-vip> )(PORT = 1555)))
stbyVM2_LOCAL_NET1 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth0_ip_stbyvm2> )(PORT = 1521)))
stbyVM2_LOCAL_NET2 =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_stbyvm2-dg-vip>)(PORT = 1555)))
stby_REMOTE_NET2 =
(DESCRIPTION_LIST =
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_stbyvm1-dg-vip>)(PORT = 1555)))
(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = <eth2_ip_stbyvm2-dg-vip> )(PORT = 1555))))
6. Configuring Static Listener Endpoints in listener.ora for Automatic RDBMS Restart After Switchover
To ensure that RDBMS instances restart automatically after a switchover, you must configure static connection endpoints and services for the new listener (LISTENER_DG). Add the required static entry to the listener.ora file in the GRID home on every node of the cluster, both at the Primary and Standby sites. This guarantees consistent behavior across the environment during switchover operations.
For Primary site node 1 and instance 1
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db112a_dgmgrl.<domain>)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_2)
(SID_NAME = db112a1)
)
)
For Primary site node 2 and instance 2
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db112a_dgmgrl.<domain>)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_2)
(SID_NAME = db112a2)
)
)
For Standby site node 1 and instance 1
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db112a_stb_dgmgrl.<domain>)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_2)
(SID_NAME = db112a1)
)
)
For Standby site node 2 and instance 2
SID_LIST_LISTENER_DG =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = db112a_stb_dgmgrl.<domain>)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/dbhome_2)
(SID_NAME = db112a2)
)
)
6) LISTENER_NETWORKS for instance registrations (per instance)
Create local/remote aliases in tnsnames.ora (as shown in your source), then set LISTENER_NETWORKS so each instance registers to:
- network1 → public listener/SCAN (1521)
- network2 → LISTENER_DG (1555) for DG/Broker
Run on each instance SID:
Production
-- Primary
ALTER SYSTEM SET listener_networks=
'((NAME=network1)(LOCAL_LISTENER=prodVM1_LOCAL_NET1)(REMOTE_LISTENER=prodvmscan1:1521))',
'((NAME=network2)(LOCAL_LISTENER=prodVM1_LOCAL_NET2)(REMOTE_LISTENER=prod_REMOTE_NET2))'
SCOPE=BOTH SID='db112a1';
ALTER SYSTEM SET listener_networks=
'((NAME=network1)(LOCAL_LISTENER=prodVM2_LOCAL_NET1)(REMOTE_LISTENER=prodvmscan1:1521))',
'((NAME=network2)(LOCAL_LISTENER=prodVM2_LOCAL_NET2)(REMOTE_LISTENER=prod_REMOTE_NET2))'
SCOPE=BOTH SID='db112a2';
Stnadby
-- Standby (adjust aliases accordingly)
ALTER SYSTEM SET listener_networks=
'((NAME=network1)(LOCAL_LISTENER=stbyVM1_LOCAL_NET1)(REMOTE_LISTENER=stbyvmscan1:1521))',
'((NAME=network2)(LOCAL_LISTENER=stbyVM1_LOCAL_NET2)(REMOTE_LISTENER=stby_REMOTE_NET2))'
SCOPE=BOTH SID='db112a1';
ALTER SYSTEM SET listener_networks=
'((NAME=network1)(LOCAL_LISTENER=stbyVM2_LOCAL_NET1)(REMOTE_LISTENER=stbyvmscan1:1521))',
'((NAME=network2)(LOCAL_LISTENER=stbyVM2_LOCAL_NET2)(REMOTE_LISTENER=stby_REMOTE_NET2))'
SCOPE=BOTH SID='db112a2';
8) Enable Data Guard Broker on both sites
Set broker files to cluster-aware storage (ASM is ideal):
Primary:
ALTER SYSTEM SET dg_broker_config_file1='+DATA/db112a/dg_broker1.dat' SCOPE=SPFILE SID='*';
ALTER SYSTEM SET dg_broker_config_file2='+FRA/db112a/dg_broker2.dat' SCOPE=SPFILE SID='*';
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=SPFILE SID='*';
Standby:
ALTER SYSTEM SET dg_broker_config_file1='+DATA/db112a_stb/dg_broker1.dat' SCOPE=SPFILE SID='*';
ALTER SYSTEM SET dg_broker_config_file2='+DATA/db112a_stb/dg_broker2.dat' SCOPE=SPFILE SID='*';
ALTER SYSTEM SET dg_broker_start=TRUE SCOPE=SPFILE SID='*';
Bounce instances if required for SPFILE parameters to take effect.
9) Create Broker configuration (from primary)
[root@prodvm1 trace]# su - oracle
[oracle@prodvm1 ~]$ . oraenv
ORACLE_SID = [oracle] ? db112a1
The Oracle base has been set to /u01/app/oracle
[oracle@prodvm1 ~]$ dgmgrl
DGMGRL for Linux: Version 11.2.0.2.0 - 64bit Production
Copyright (c) 2000, 2009, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
DGMGRL> connect /
Connected.
DGMGRL> create configuration dg112 as
> primary database is db112a connect identifier is db112a_prm_ship;
Configuration "dg112" created with primary database "db112a".
DGMGRL> add database db112a_stb as connect identifier is db112a_stb_ship maintained as physical;
Database "db112a_stb" added.
Set StaticConnectIdentifier (one per instance on each site) so Broker can always reach them:
EDIT INSTANCE db112a1 ON DATABASE db112a
SET PROPERTY StaticConnectIdentifier =
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm1-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVICE_NAME=db112a_dgmgrl.<domain>)(INSTANCE_NAME=db112a1)(SERVER=DEDICATED)))';
EDIT INSTANCE db112a2 ON DATABASE db112a
SET PROPERTY StaticConnectIdentifier =
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=prodvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVICE_NAME=db112a_dgmgrl.<domain>)(INSTANCE_NAME=db112a2)(SERVER=DEDICATED)))';
EDIT INSTANCE db112a1 ON DATABASE db112a_stb
SET PROPERTY StaticConnectIdentifier =
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm1-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVICE_NAME=db112a_stb_dgmgrl.<domain>)(INSTANCE_NAME=db112a1)(SERVER=DEDICATED)))';
EDIT INSTANCE db112a2 ON DATABASE db112a_stb
SET PROPERTY StaticConnectIdentifier =
'(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=stbyvm2-dg-vip.<domain>)(PORT=1555))
(CONNECT_DATA=(SERVICE_NAME=db112a_stb_dgmgrl.<domain>)(INSTANCE_NAME=db112a2)(SERVER=DEDICATED)))';
Enable:
ENABLE CONFIGURATION;
After initiating the setup, allow some time for the Data Guard Broker to complete the configuration. During this process, the broker generates the necessary configuration files and propagates them to both the Primary and Standby sites.
If all TNS aliases, connect strings, and RDBMS instance parameters are correctly defined, the broker configuration will be enabled successfully without errors. Proper validation of these components is critical to ensure a smooth and reliable Data Guard deployment.
Expected:
DGMGRL> show configuration;
Configuration - dg112
Protection Mode: MaxPerformance
Databases:
db112a - Primary database
db112a_stb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
DGMGRL> show database verbose db112a
Database - db112a
Role: PRIMARY
Intended State: TRANSPORT-ON
Instance(s):
db112a1
db112a2
Properties:
DGConnectIdentifier = 'db112a_prm_ship'
ObserverConnectIdentifier = ''
LogXptMode = 'ASYNC'
DelayMins = '0'
Binding = 'optional'
MaxFailure = '0'
MaxConnections = '1'
ReopenSecs = '300'
NetTimeout = '30'
RedoCompression = 'DISABLE'
LogShipping = 'ON'
PreferredApplyInstance = ''
ApplyInstanceTimeout = '0'
ApplyParallel = 'AUTO'
StandbyFileManagement = 'MANUAL'
ArchiveLagTarget = '0'
LogArchiveMaxProcesses = '4'
LogArchiveMinSucceedDest = '1'
DbFileNameConvert = ''
LogFileNameConvert = ''
FastStartFailoverTarget = ''
InconsistentProperties = '(monitor)'
InconsistentLogXptProps = '(monitor)'
SendQEntries = '(monitor)'
LogXptStatus = '(monitor)'
RecvQEntries = '(monitor)'
SidName(*)
StaticConnectIdentifier(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value
Database Status:
SUCCESS
DGMGRL> show database verbose db112a_stb
Database - db112a_stb
Role: PHYSICAL STANDBY
Intended State: APPLY-ON
Transport Lag: 0 seconds
Apply Lag: 0 seconds
Real Time Query: OFF
Instance(s):
db112a1 (apply instance)
db112a2
Properties:
DGConnectIdentifier = 'db112a_stb_ship'
ObserverConnectIdentifier = ''
LogXptMode = 'ASYNC'
DelayMins = '0'
Binding = 'optional'
MaxFailure = '0'
MaxConnections = '1'
ReopenSecs = '300'
NetTimeout = '30'
RedoCompression = 'DISABLE'
LogShipping = 'ON'
PreferredApplyInstance = ''
ApplyInstanceTimeout = '0'
ApplyParallel = 'AUTO'
StandbyFileManagement = 'MANUAL'
ArchiveLagTarget = '0'
LogArchiveMaxProcesses = '4'
LogArchiveMinSucceedDest = '1'
DbFileNameConvert = ''
LogFileNameConvert = ''
FastStartFailoverTarget = ''
InconsistentProperties = '(monitor)'
InconsistentLogXptProps = '(monitor)'
SendQEntries = '(monitor)'
LogXptStatus = '(monitor)'
RecvQEntries = '(monitor)'
SidName(*)
StaticConnectIdentifier(*)
StandbyArchiveLocation(*)
AlternateLocation(*)
LogArchiveTrace(*)
LogArchiveFormat(*)
TopWaitEvents(*)
(*) - Please check specific instance for the property value
Database Status:
SUCCESS
10) Validate redo transport via DG listener
Check lsnrctl services LISTENER_DG on both sites—you should see the default database services (db112a.<domain> / db112a_stb.<domain>) registered with handlers pointing to the DG VIPs:1555. This ensures redo keeps flowing during switchovers.
Switchover/Failover notes
- Use
dgmgrlfor role transitions; static entries + LISTENER_NETWORKS keep services reachable. - Confirm
StandbyFileManagement(AUTO is recommended for easier file management; your sample shows MANUAL—choose based on policy). - Consider ASYNC vs SYNC (
LogXptMode) per your RPO/RTO.
Troubleshooting quick hits
- Broker won’t enable: verify
tnsnames.orasymmetry, listener static entries, reachable DG VIPs/ports, andLISTENER_NETWORKS. - Services missing in LISTENER_DG: recheck
LOCAL_LISTENERaliases andlsnrctl reload. - Transport OK but apply lag: confirm
APPLY-ON, check I/O, parallel apply (ApplyParallel=AUTO). - SCAN confusion: SCAN listeners serve client connections; redo/Broker use LISTENER_DG on the dedicated network.
- Monitor
alert_*andlistener_*logs underdiag/tnslsnr/*/listener_dg/alert.
Disclaimer
Environment names and values above mirror a lab example. Replace placeholders (<domain>, IPs, ports, db_unique_name, etc.) with your actual settings.





Comments 2