2 node RAC with Dataguard Configuration (DGMGRL)

This guide will take you through the steps configure Oracle Grid Infrastructure 12c and Database 12c including RAC to RAC Data Guard and Data Broker configuration in a Primary and Physical Standby environment for high availability.

  1. Prerequisites

You need to download the following software if you do not have already.

1
2
3
Oracle Linux 6 (64-bit)
Oracle Grid Infrastructure 12c (64-bit)
Oracle Database 12c (64-bit)
  1. Environment
    You need four (Physical or Virtual) machines with 2 network adapters and at least 4GB memory requirement on each machine.
  • Production database is up and running with 2 node RAC
    Grid Version : 12.1.0.2.0
    Oracle Version : 12.1.0.2
  1. Standby Grid Infrastructure is installed.
  2. ASM is up and running.
  3. Oracle Binaries are installed.
1
2
3
4
5
6
7
1.  Step : Check standby database cluster services are running
 
[oracle@dgrac1 ~]$ crsctl check crs
CRS-4638: Oracle High Availability Services is online
CRS-4537: Cluster Ready Services is online
CRS-4529: Cluster Synchronization Services is online
CRS-4533: Event Manager is online
1
2
3
4
5
2.  Step : Prepare the Primary Database :
Check force logging at primary database and enable it if not enabled.
 
SQL> ALTER DATABASE FORCE LOGGING;
SQL> SELECT FORCE_LOGGING FROM V$DATABASE;
1
2
3
4
5
6
7
8
9
10
11
12
13
14
3.  Step : Check the archive log enabled or not enable it.
SQL> select name,open_mode,log_mode from v$database;
 
NAME      OPEN_MODE        LOG_MODE
-------- - ----------  -------------------
RACDB     READ WRITE           ARCHIVELOG
 
SQL> archive log list
Database log mode          Archive Mode
Automatic archival         Enabled
Archive destination        USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence     31
Next log sequence to archive   33
Current log sequence           33
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
4.  Step : Check details no of redo log files and size of each redo log file.
 
SQL> SELECT GROUP#,BYTES/1024/1024 AS MB FROM V$LOG ;
 
GROUP#     MB
-------  --------
  1       50
  2       50
  3       50
  1       50
  2       50
  3       50
 
SQL> SELECT THREAD#,INSTANCE FROM GV$THREAD;
 
   THREAD#     INSTANCE
 -------------------------
   1           racdb1
   2           racdb2

We can see here 6 redo log files and with each file having size 50 MB. So we will create 8 standby redo log files.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 '+DATA' SIZE 50M;
Database altered.
SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 2 '+DATA' SIZE 50M;
Database altered.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
5.  Step : Set initialization parameters necessary for data guard environment.
 
SQL> ALTER SYSTEM SET DB_UNIQUE_NAME=RACDB SCOPE=SPFILE SID='*';
System altered.
 
SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=DGRACDB LGWR SYNC AFFIRM VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=DGRACDB' SID='*';
System altered.
 
SQL> ALTER SYSTEM SET FAL_SERVER=DGRACDB SID='*';
System altered.
 
SQL> ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='dg_config=(RACDB,DGRACDB) SID='*';
 System altered.
 
SQL> ALTER SYSTEM SET FAL_CLIENT=RACDB SID='*';
System altered.
 
SQL> ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO SID='*';
System altered.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
6.  Step : Set tnsnames.ora file and listener file.
 
Tnsnames .ora
RACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = rac-scan.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = racdb)
    )
  )
 
DGRACDB =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = dgrac-scan.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = dgracdb)
    )
  )
 
 
We need to do a static entry of listener at standby database :   (That's is the most Important thing U need both node )
 
SID_LIST_LISTENER=
   (SID_LIST=
        (SID_DESC=
          (SID_NAME=dgracdb1)
          (ORACLE_HOME=/u02/oracle/product/11.2.0/dbhome_1)
        )
      )
1
2
3
7.  Step : Restart listener and restart database so parameters can take effect of new value.
 
srvctl reload listener -l LISTENER_NAME
1
2
3
8.  Now create pfile for standby database
 
SQL> create pfile='/u01/app/oracle/initdgracdb1.ora' from spfile;
1
2
3
4
5
9.  Now backup password file from primary database using the following commands. This will be required later on standby database configuration.
 
[oracle@rac1 ~]$ (set grid environment)
[oracle@rac1 ~]$ asmcmd pwget --dbuniquename racdb
[oracle@rac1 ~]$ asmcmd pwcopy --dbuniquename racdb '+DATA/RACDB/orapwracdb' '/u01/app/oracle/orapwdgracdb'
1
2
3
4
5
6
7
8
9
10. Step 11: Copy pfile and password file to both standby servers.
 
 
[oracle@rac1 ~]$ cd /u01/app/oracle
[oracle@rac1 oracle]$ scp initdgracdb1.ora rac1:$ORACLE_HOME/dbs/initdbracdb1.ora
[oracle@rac1 oracle]$ scp initdgracdb1.ora rac2:$ORACLE_HOME/dbs/initdbracdb1.ora
 
[oracle@rac1 oracle]$ scp orapwdgracdb dgrac1:$ORACLE_HOME/dbs/orapwdgracdb1
[oracle@rac1 oracle]$ scp orapwdgracdb dgrac2:$ORACLE_HOME/dbs/orapwdgracdb2
1
Data Guard Configuration - Standby Site

Login to DGRAC1, DGRAC2 using oracle user and perform the following tasks to prepare Standby site data guard configuration.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
The following highlighted parameters need to be modified in our parameter file initdgracdb.ora for standby database creation in a data guard environment.
 
[oracle@dgrac1 ~]$ cat  /u01/app/oracle/product/12.1.0/db_1/dbs/initdgrac1.ora
 
dgracdb1.__data_transfer_cache_size=0
dgracdb2.__data_transfer_cache_size=0
dgracdb1.__db_cache_size=184549376
dgracdb2.__db_cache_size=452984832
dgracdb1.__java_pool_size=16777216
dgracdb2.__java_pool_size=16777216
dgracdb1.__large_pool_size=419430400
dgracdb2.__large_pool_size=33554432
dgracdb1.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dgracdb2.__oracle_base='/u01/app/oracle'#ORACLE_BASE set from environment
dgracdb1.__pga_aggregate_target=520093696
dgracdb2.__pga_aggregate_target=570425344
dgracdb1.__sga_target=973078528
dgracdb2.__sga_target=922746880
dgracdb1.__shared_io_pool_size=0
dgracdb2.__shared_io_pool_size=33554432
dgracdb1.__shared_pool_size=335544320
dgracdb2.__shared_pool_size=369098752
dgracdb1.__streams_pool_size=0
dgracdb2.__streams_pool_size=0
*.audit_file_dest='/u01/app/oracle/admin/dgracdb/adump'
*.audit_trail='db'
*.cluster_database=true
*.compatible='12.1.0.0.0'
*.control_files='+DGDATA/CONTROLFILE/DGRACDB/control01.ctl','+DGDATA/CONTROLFILE/DGRACDB/control02.ctl'
*.db_block_size=8192
*.db_domain=''
*.db_name='racdb'
*.db_unique_name='dgracdb'
*.db_recovery_file_dest='+DGDATA'
*.db_recovery_file_dest_size=5025m
*.diagnostic_dest='/u01/app/oracle'
*.dispatchers='(PROTOCOL=TCP) (SERVICE=dgracdbXDB)'
*.fal_server='racdb'
dgracdb1.instance_number=1
dgracdb2.instance_number=2
*.log_archive_config='DG_CONFIG=(racdb,dgracdb)'
*.log_archive_dest_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=dgracdb'
*.log_archive_dest_2='service=racdb async valid_for=(online_logfile,primary_role) db_unique_name=racdb'
*.log_archive_format='%t_%s_%r.arc'
*.log_archive_max_processes=8
*.memory_target=1416m
*.open_cursors=300
*.processes=1024
*.remote_login_passwordfile='EXCLUSIVE'
*.sessions=1131
*.standby_file_management='AUTO'
dgracdb2.thread=2
dgracdb1.thread=1
dgracdb2.undo_tablespace='UNDOTBS2'
dgracdb1.undo_tablespace='UNDOTBS1'
1
2
3
4
5
6
7
8
9
10
11
11. Now we need to create the ASM directories on standby node DGRAC1 using the following commands.
 
[oracle@dgrac1 ~]$ mkdir /u01/app/oracle/admin/dgracdb/adump
[oracle@dgrac2 ~]$ mkdir /u01/app/oracle/admin/dgracdb/adump
 
[oracle@ dgrac1 ~]$ set Grid environment
[oracle@ dgrac1 ~]$ asmcmd mkdir DGDATA/DGRACDB
[oracle@ dgrac1 ~]$ asmcmd
 
ASMCMD> cd DGDATA/ DGRACDB
ASMCMD> mkdir PARAMETERFILE DATAFILE CONTROLFILE TEMPFILE ONLINELOG ARCHIVELOG STANDBYLOG
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
12. Step 10: Start the database in the nomount state using pfile. (prepare earlier from copy primary database.)
 
[oracle@ dgrac1 ~]$  cd /u01/app/oracle/product/12.1.0/db_1/dbs
[oracle@dgrac dbs]$ sqlplus / as sysdba
 
SQL*Plus: Release 12.1.0.2.0 Production on Wed Nov 6 15:50:33 2019
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.
 
SQL> startup nomount pfile ='initdgracdb1.ora'
ORACLE instance started.
Total System Global Area  238034944 bytes
Fixed Size          2252016 bytes
Variable Size         180355856 bytes
Database Buffers       50331648 bytes
Redo Buffers            5095424 bytes
SQL> exit
Disconnected from Oracle Database 11g Enterprise Edition Release 12.1.0.2.0 - 64bit Production
With the Partitioning, Real Application Clusters, OLAP, Data Mining
and Real Application Testing options
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
13. Step : Create a RMAN script to create a standby database using duplicate database command.
 
[oracle@dgrac1 ~]$ rman target sys/oracle@racdb auxiliary sys/oracle@dgracdb
Recovery Manager: Release 12.1.0.2.0 - Production on Wed Nov 6 14:01:15 2019
Version 12.1.0.2.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
connected to target database: RACDB(DBID=934175012)
connected to auxiliary database: RACDB (not start)
 
RMAN>run {
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
SPFILE
set 'db_unique_name'='dgracdb'
set instance_name='dgracdb1'
set instance_number='1'
set control_files='+DGDATA'
set remote_listener='dgrac-scan:1521'
set db_create_online_log_dest_1='+DGDATA'
set db_create_online_log_dest_2='+DGDATA'
set db_recovery_file_dest='+DGDATA'
set db_file_name_convert='+DATA','+DGDATA'
set log_file_name_convert='+DATA','+DGDATA'
set audit_file_dest='/u01/app/oracle/admin/racdb/adump'
set core_dump_dest='/u01/app/oracle/admin/racdb/cdump'
nofilenamecheck;
}
Disk group name in my standby database is DGDATA so I have used db_file_name_Convert and log_file_name_convert accordingly.
1
2
3
4
5
6
7
14. Step : Verify instance is running fine or not.
 
SQL>  SELECT NAME,DB_UNIQUE_NAME,INSTANCE_NAME,DATABASE_ROLE,OPEN_MODE FROM GV$DATABASE,GV$INSTANCE;
 
NAME      DB_UNIQUE_NAME     INSTANCE_NAME     DATABASE_ROLE      OPEN_MODE
-------  ------------------   ------------     --------------    -------------
RACDB     dgracdb            dgracdb1         PHYSICAL STANDBY     MOUNTED
1
2
3
4
5
6
7
8
15. Step : Add the database using srvctl
 
Now that the Standby database has been started with the cluster parameters enabled, we need to create spfile in the central location on ASM diskgroup.
 
SQL> create spfile='+DGDATA/DGRACDB/PARAMETERFILE/spfiledgracdb.ora' from pfile='/u01/app/oracle/products/12.1.0/db_1/dbs/initdgracdb1.ora';
 
SQL>  shutdown immediate;
SQL> exit

Now we need to check whether the standby database gets started using our new spfile which we have created on ASM diskgroup.

1
2
3
4
5
Rename the old pfile and spfile in $ORACLE_HOME/dbs directory as shown below
 
[oracle@dgrac1 ~]$ cd $ORACLE_HOME/dbs
[oracle@dgrac1 ~]$ mv initdgracdb1.ora initdgracdb.ora.orig
[oracle@dgrac1 ~]$ mv spfiledgracdb.ora spfiledgracdb.ora.orig
1
2
3
4
5
6
Now create the below initdgracdb1.ora file on dgrac1 and initdgracdb2.ora file on dgrac2 under $ORACLE_HOME/dbs with the spfile entry so that the instance can start with the newly created spfile.
 
[oracle@dgrac1 ~]$ cd $ORACLE_HOME/dbs
[oracle@dgrac1 ~]$ vi initdgracdb1.ora
 
spfile='+DGDATA/DGRACDB/PARAMETERFILE/spfiledgracdb.ora'
1
2
3
Copy initdgracdb1.ora to dgrac2 as $ORACLE_HOME/dbs/initdgracdb2.ora
 
[oracle@dgrac1 ~]$ scp -p $ORACLE_HOME/dbs/initdgracdb1.ora dgrac2:$ORACLE_HOME/dbs/initdgracdb2.ora
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[oracle@dgrac1 ~]$ SET DB ENVIRONMENT
 
[oracle@dgrac1 ~]$ sqlplus / as sysdba
 
 SQL> startup mount;
ORACLE instance started.
Total System Global Area 1358954496 bytes
Fixed Size                  2924208 bytes
Variable Size             469762384 bytes
Database Buffers          872415232 bytes
Redo Buffers               13852672 bytes
Database mounted.
 
SQL> select name, open_mode from v$database;
NAME      OPEN_MODE
--------- --------------------
racdb       MOUNTED
 
SQL> show parameter spfile;
NAME            TYPE                  VALUE
-----------    ---------           -------------------------------
  spfile        string         +DGDATA/DGRACDB/PARAMETERFILE/spfiledgracdb.ora

 Now that the database have been started using the spfile on shared location, we will add the database in cluster. Execute the below command to add the database and its instances in the cluster configuration.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
[oracle@dgrac1 ~]$ srvctl add database -db dgracdb -oraclehome $ORACLE_HOME -dbtype RAC -spfile +DGDATA/DGRACDB/PARAMETERFILE/spfiledgracdb.ora-role PHYSICAL_STANDBY -startoption MOUNT -stopoption IMMEDIATE -dbname racdb -diskgroup DGDATA
 
[oracle@dgrac1 ~]$ srvctl add instance -db dgracdb -i dgracdb1 -n dgrac1
[oracle@dgrac1 ~]$ srvctl add instance -db dgracdb -i dgracdb2 -n dgrac2
 
[oracle@dgrac1 ~]$ srvctl config database -d dgracdb
Database unique name: dgracdb
Database name: racdb
Oracle home: /u01/app/oracle/product/12.1.0/db_1
Oracle user: oracle
Spfile: +DGDATA/DGRACDB/PARAMETERFILE/spfiledgracdb.ora
Password file:
Domain:
Start options: open
Stop options: immediate
Database role: PHYSICAL_STANDBY
Management policy: AUTOMATIC
Server pools: dgracdb
Database instances: dgracdb1,dgracdb2
Disk Groups: DATA
Mount point paths:
Services:
Type: RAC
Start concurrency:
Stop concurrency: Database is administrator managed

From Primary node rac1 copy the password file again to the Standby node dgrac1.

Login on standby node dgrac1 and copy the password file to ASM disk group as shown below.

1
2
3
4
5
[oracle@dgrac1 ~]$ set GRID environment
[oracle@dgrac1 ~]$ asmcmd
 
ASMCMD> pwcopy /u01/app/oracle/product/12.1.0/db_1/dbs/orapwdgracdb GDATA/DGRACDB/PASWORDFILE/
copying /u01/app/oracle/product/12.1.0/db_1/dbs/orapwdgracdb -> +DGDATA/DGRACDB/PASWORDFILE /orapwdgracdb

Now we need to tell database where to look for password file using srvctl command as shown an example below

1
2
[oracle@dgrac1 ~]$ Set db_env
[oracle@dgrac1 ~]$ srvctl modify database -d dgracdb -pwfile +DGDATA/DGRACDB/PASWORDFILE /orapwdgracdb

At this point, start the standby RAC database  but before starting the standby RAC database, shutdown the already running instance as shown an example below

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
[oracle@dgrac1 ~]$ db_env
[oracle@dgrac1 ~]$ sqlplus / as sysdba
shutdown immediate;
ORA-01109: database not open
Database dismounted.
ORACLE instance shut down.
 
SQL> exit
 
Now we can start the database using the following command.
 
[oracle@dgrac1 ~]$ srvctl start database -d dgracdb
[oracle@dgrac1 ~]$ srvctl status database -d dgracdb
 
Output
Instance dgracdb1 is running on node dgrac1
Instance dgracdb2 is running on node dgrac2

Now that the standby single instance is converted to standby RAC database, the final step is to start the recovery (MRP) process using the following command on standby node.

1
2
3
[oracle@dgrac1 ~]$ sqlplus / as sysdba
SQL> alter database recover managed standby database disconnect from session;
SQL> exit

Data guard Broker Configuration 12c

Since our Primary and Standby databases are RAC, we will change the default location of DG Broker files to a centralized location as shown an example below

Add an entry similar to below at the end of listener.ora file on dgrac1 and dgrac2. It is required for data guard broker configuration.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
[oracle@dgrac1 ~]$ vi /u01/app/12.1.0/grid/network/admin/listener.ora
 
 SID_LIST_LISTENER =
 (SID_LIST =
  (SID_DESC =
   (SID_NAME = dgracdb)
    (GLOBAL_DBNAME=dgracdb_DGMGRL)
     (ORACLE_HOME=/u01/app/oracle/product/12.1.0/db_1)
             )
                   )
 
Save and close ( then Restart listener)
 
[oracle@dgrac1 ~]$ srvctl stop listener -listener LISTENER
[oracle@dgrac1 ~]$ srvctl start listener -listener LISTENER
 
[oracle@dgrac2 ~]$ vi /u01/app/12.1.0/grid/network/admin/listener.ora
 
SID_LIST_LISTENER =
 (SID_LIST =
  (SID_DESC =
   (SID_NAME = dgracdb)
    (GLOBAL_DBNAME = dgracdb_DGMGRL)
     (ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
         )
               )
 
Save and close
 
[oracle@dgrac2 ~]$ srvctl stop listener -listener LISTENER
[oracle@dgrac2 ~]$ srvctl start listener -listener LISTENER

At this stage, we have completed the RAC to RAC data guard configuration but still few more steps needed.

Login as oracle user on Primary node rac1 and execute the below commands.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
[oracle@rac1 ~]$ grid_env
[oracle@rac1 ~]$ asmcmd mkdir DATA/RACDB/DGBROKERCONFIGFILE
[oracle@rac1 ~]$ db_env
[oracle@rac1 ~]$ sqlplus / as sysdba
 
SQL> show parameter dg_broker_config
 
NAME                           TYPE        VALUE
------ -----------           -----------  -------------------
dg_broker_config_file1         string        /u01/app/oracle/products/12.1.0/db/dbs/dr1pdbrac.dat
dg_broker_config_file2         string        /u01/app/oracle/products/12.1.0/db/dbs/dr2pdbrac.dat
 
SQL>  alter system set dg_broker_config_file1='+ DATA/RACDB/DGBROKERCONFIGFILE /dr1pdbrac.dat';
 
SQL>  alter system set dg_broker_config_file2='+ DATA/RACDB/DGBROKERCONFIGFILE /dr2pdbrac.dat';
 
SQL>  alter system set dg_broker_start=TRUE;
 
SQL>  alter system set LOG_ARCHIVE_DEST_2='' scope=both;
 
SQL> exit

Similarly, change the settings on Standby database server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
[oracle@dgrac1 ~]$ grid_env
[oracle@dgrac1 ~]$ asmcmd mkdir DGDATA/DGRACDB/DGBROKERCONFIGFILE
 
[oracle@dgrac1 ~]$ db_env
 
[oracle@dgrac1 ~]$ sqlplus / as sysdba
 
SQL>  alter system set dg_broker_config_file1='+DGDATA/DGRACDB/DGBROKERCONFIGFILE /dr1dgracdb.dat';
 
SQL>  alter system set dg_broker_config_file2='+DGDATA/DGRACDB/DGBROKERCONFIGFILE /dr2dgracdb.dat';
 
SQL>  alter system set dg_broker_start=TRUE;
 
SQL>  alter system set LOG_ARCHIVE_DEST_2='' scope=both;
 
SQL> exit

Register the primary and standby databases in the broker configuration as shown an example below

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
[oracle@rac1 ~]$ dgmgrl
 Welcome to DGMGRL, type "help" for information.
 
DGMGRL> connect sys/oracle@racdb
Connected as SYSDBA.
 
 DGMGRL> CREATE CONFIGURATION dg_config AS PRIMARY DATABASE IS racdb CONNECT IDENTIFIER IS racdb;
 
 Output
Configuration "dg_config" created with primary database "racdb"
 
DGMGRL> ADD DATABASE dgracdb AS CONNECT IDENTIFIER IS dgracdb MAINTAINED AS PHYSICAL;
 
Output
Database "dgracdb" added

Now we need to enable the broker configuration and check if the configuration is enabled successfully or not.

1
2
3
4
5
6
7
8
9
10
11
12
13
DGMGRL> ENABLE CONFIGURATION;
Enabled.
 
DGMGRL> show configuration;
 
Configuration - dg_config
  Protection Mode: MaxPerformance
  Members:
  racdb  - Primary database
    dgracdb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS

Once the broker configuration is enabled, the MRP process should start on the Standby database server.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
DGMGRL> show database dgracdb
 
Database - dgracdb
Role:               PHYSICAL STANDBY
Intended State:     APPLY-ON
Transport Lag:      0 seconds (computed 0 seconds ago)
Apply Lag:          0 seconds (computed 0 seconds ago)
Average Apply Rate: 39.00 KByte/s
Real Time Query:    OFF
Instance(s):
    dgracdb1 (apply instance)
    dgracdb2
Database Status:
SUCCESS

Now that the MRP process is running, login to both Primary and Standby database and check whether the logs are in sync or not.

Below are some extra commands which you can use and check status of database.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
DGMGRL> VALIDATE DATABASE racdb;
 
Database Role:    Primary database
Ready for Switchover:  Yes
Flashback Database Status:
  racdb:  ON
 
 
 
DGMGRL> VALIDATE DATABASE dgracdb;
 
Database Role:     Physical standby database
Primary Database:  racdb
Ready for Switchover:  Yes
Ready for Failover:    Yes (Primary Running)
Flashback Database Status:
    racdb:  ON
    dgracdb:  Off

Perform switchover activity from primary database (racdb) to physical standby database (dgracdb) using DGMGRL prompt.

1
2
3
4
5
6
7
[oracle@rac1 admin]$ dgmgrl
DGMGRL for Linux: Version 12.1.0.2.0 - 64bit Production
Copyright (c) 2000, 2013, Oracle. All rights reserved.
Welcome to DGMGRL, type "help" for information.
 
DGMGRL> connect sys/oracle@racdb
Connected as SYSDBA.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DGMGRL> show configuration verbose;
 
Configuration - dg_config
  Protection Mode: MaxPerformance
  Members:
  racdb   - Primary database
    dgracdb - Physical standby database
  Properties:
    FastStartFailoverThreshold      = '30'
    OperationTimeout                = '30'
    TraceLevel                      = 'USER'
    FastStartFailoverLagLimit       = '30'
    CommunicationTimeout            = '300'
    ObserverReconnect               = '0'
    FastStartFailoverAutoReinstate  = 'TRUE'
    FastStartFailoverPmyShutdown    = 'TRUE'
    BystandersFollowRoleChange      = 'ALL'
    ObserverOverride                = 'FALSE'
    ExternalDestination1            = ''
    ExternalDestination2            = ''
    PrimaryLostWriteAction          = 'CONTINUE'
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS
1
2
3
4
5
6
7
8
9
10
DGMGRL> show database racdb
 
Database - racdb
  Role:               PRIMARY
  Intended State:     TRANSPORT-ON
  Instance(s):
    racdb1
    racdb2
Database Status:
SUCCESS
1
2
3
4
5
6
7
8
9
10
11
12
13
14
DGMGRL> show instance verbose 'racdb1' on database 'racdb';
 
Instance 'racdb1' of database 'racdb'
  Host Name: rac1.localdomain
  PFILE:
  Properties:
    StaticConnectIdentifier         = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.81)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=racdb_DGMGRL)(INSTANCE_NAME=racdb1)(SERVER=DEDICATED)))'
    StandbyArchiveLocation          = 'USE_DB_RECOVERY_FILE_DEST'
    AlternateLocation               = ''
    LogArchiveTrace                 = '0'
    LogArchiveFormat                = '%t_%s_%r.arc'
    TopWaitEvents                   = '(monitor)'
Instance Status:
SUCCESS
1
2
3
4
5
6
7
8
9
10
11
12
13
DGMGRL> show instance verbose 'racdb2' on database 'racdb';
 
Instance 'racdb2' of database 'racdb'
  Host Name: rac2.localdomain
  PFILE:
  Properties:
    StaticConnectIdentifier         = '(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.56.82)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=racdb_DGMGRL)(INSTANCE_NAME=racdb2)(SERVER=DEDICATED)))'
    StandbyArchiveLocation          = 'USE_DB_RECOVERY_FILE_DEST'
    AlternateLocation               = ''
    LogArchiveTrace                 = '0'
    LogArchiveFormat                = '%t_%s_%r.arc'
    TopWaitEvents                   = '(monitor)'
Instance Status:
1
2
3
4
5
6
7
8
9
10
11
12
13
DGMGRL> switchover to dgracdb;
 
Performing switchover NOW, please wait...
Operation requires a connection to instance "dgracdb1" on database "dgracdb"
Connecting to instance "dgracdb1"...
Connected as SYSDBA.
New primary database "dgracdb" is opening...
Operation requires startup of instance "racdb2" on database "racdb"
Starting instance "racdb2"...
ORACLE instance started.
Database mounted.
Database opened.
Switchover succeeded, new primary is "dgracdb"
1
2
3
4
5
6
7
8
9
10
DGMGRL> show configuration;
 
Configuration - dg_config
  Protection Mode: MaxPerformance
  Databases:
  dgracdb - Primary database
    pdbrac - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS