1) PREREQUISITES: Requirements before starting the DATA GUARD CONFIGURATION.


NOTE:
1) In PRIMARY SERVER DG11 we need to install the BINARIES OF ORACLE 19c and then create only 1 PRIMARY DB NAMED ORCL by using ./dbca or manually as required. 2) In STANDBY SERVER DG11S we only need to install the BINARIES OF ORACLE 19c. Do not create any STANDBY DB as we will created in during CONFIDURATION of DATA GUARD which is discussed ahead.
2) COMPLETE STEP BY STEP CONFIGURATION FOR PRIMARY DATABASE.
The high level steps require to configure a Primary DB are given below. These are as follow:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | Step 01: Create LISTENER for PRIMARY DB and start the LISTENER by DISABLING FIREWALL. Step 02: Create TNSNAMES.ORA FILE for PRIMARY DB and check TNSPING for PRIMARY DB and STANDBY DB. Step 03: ENABLE ARCHIVE LOG for Primary DB. Step 04: ENABLE FORCE LOGGING for Primary DB. Step 05: Check DB_NAME and DB_UNIQUE_NAME for the Primary DB. Step 06: Set LOG_ARCHIVE_CONFIG parameter for Primary DB. Step 07: Set the LOG_ARCHIVE_DEST parameter for the Primary DB. Step 08: Set the LOG_ARCHIVE_DEST_STATE parameter to ENABLE for the Primary DB. Step 09: Set the LOG_ARCHIVE_FORMAT parameter for the Primary DB. Step 10: Set the LOG_ARCHIVE_MAX_PROCESSES parameter to 30 for the Primary DB. Step 11: Set the REMOTE_LOGIN_PASSWORDFILE parameter to EXCLUSIVE for the Primary DB. Step 12: Set the FAL_SERVER and FAL_CLIENT parameter for the Primary DB. Step 13: Set the STANDBY_FILE_MANAGEMENT parameter to AUTO for Primary DB. Step 14: Add STANDBY REDOLOG FILES (SRLs) to the Primary DB while the STANDBY_FILE_MANAGEMENT=MANUAL Step 15: Send PASSWORD FILE from PRIMARY DB to the STANDBY DB. |
STEP 1: Create LISTENER for PRIMARY DB and start the LISTENER by DISABLING FIREWALL.
A) Create a LISTENER for PRIMARY DB
1 2 3 4 5 6 7 8 9 10 11 12 | [oracle@dg11s admin]$ . oraenv ORACLE_SID = [oracle] ? orcl ORACLE_HOME = [/home/oracle] ? /u01/app/oracle/product/19.0.0/dbhome_1/ The Oracle base has been set to /u01/app/oracle [oracle@dg11 ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/ [oracle@dg11 admin]$ netmgr [oracle@dg11 admin]$ ll total 8 -rw-r--r--. 1 oracle oinstall 471 Sep 4 14:05 listener.ora drwxr-xr-x. 2 oracle oinstall 64 Apr 17 2019 samples -rw-r--r--. 1 oracle oinstall 1536 Feb 14 2018 shrept.lst |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [oracle@dg11 admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcl) (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1) (SID_NAME = orcl) ) ) LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521)) ) ADR_BASE_LISTENER = /u01/app/oracle |
B) DISABLE the FIREWALL for the PRIMARY DB.
To disable the firewall for the Primary DB we need to first connect with the root user and then by
giving command we have to follow the below steps.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [oracle@dg11 ~]$ su root Password: oracle [root@dg11]# service firewalld stop [root@dg11]# systemctl disable firewalld [oracle@dg11 ~]$ su oracle [oracle@dg11 ~]$ service firewalld status Redirecting to /bin/systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) |
C) Start the LISTENER created for the PRIMARY DB.
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@dg11 admin]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 09:53:01 Copyright (c) 1991, 2019, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/dg11/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.36)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.36)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 07-SEP-2022 09:53:02 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/dg11/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.36)(PORT=1521))) Services Summary... Service "orcl" has 1 instance(s). Instance "orcl", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully |
STEP 2: Create TNSNAMES.ORA FILE for PRIMARY DB and check TNSPING for PRIMARY DB and STANDBY DB.
A) Creation of TNSNAMES.ORA FILE in Primary DB
1 2 3 4 5 6 7 8 | [oracle@dg11 admin]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/ [oracle@dg11 admin]$ netmgr [oracle@dg11 admin]$ ll total 12 -rw-r--r--. 1 oracle oinstall 471 Sep 4 14:05 listener.ora drwxr-xr-x. 2 oracle oinstall 64 Apr 17 2019 samples -rw-r--r--. 1 oracle oinstall 1536 Feb 14 2018 shrept.lst -rw-r--r--. 1 oracle oinstall 575 Sep 4 14:15 tnsnames.ora |
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 | [oracle@dg11 admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. ORCLS = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcls) ) ) ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) |
B) Check TNSPING for PRIMARY DB and STANDBY DB
Remember that to check the TNSPING for both, Primary DB and Standby DB, LISTENER and TNSNAMES.ORA files
should be created in both the DBs and LISTENER should be STARTED in both the DBs.
1 2 3 4 5 6 7 8 9 10 11 | SERVER DG11 =========== [oracle@dg11 ~]$ tnsping orcl TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:04:34 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (0 msec) |
1 2 3 4 5 6 7 8 9 10 11 | SERVER DG11S ============ [oracle@dg11 ~]$ tnsping orcls TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:04:44 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcls))) OK (10 msec) |
STEP 3: ENABLE ARCHIVE LOG for Primary DB.
If the Primary DB is in No Archive Log Mode, then we need to Enable it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SQL> select name,open_mode,database_role from v$database; NAME OPEN_MODE DATABASE_ROLE --------- -------------------- ---------------- ORCL READ WRITE PRIMARY SQL> archive log list Database log mode Archive Mode Automatic archival Enabled Archive destination USE_DB_RECOVERY_FILE_DEST Oldest online log sequence 3 Next log sequence to archive 5 Current log sequence 5 SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG |
Here the Archive log mode for the Primary DB is already Enabled, hence no need to enable the Archive log mode. If Archive log mode is Disabled, then Shutdown the DB. Start the DB in MOUNT mode. Enable the Archive log mode by giving command "SQL> ALTER DATABASE archivelog;" Check if Enabled by giving command "SQL> SELECT log_mode FROM v$database;" Alter the Primary DB in Open mode by giving command "SQL> ALTER DATABASE open;"
STEP 4: ENABLE FORCE LOGGING for Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> select FORCE_LOGGING from v$database; FORCE_LOGGING --------------------------------------- NO SQL> alter database FORCE LOGGING; Database altered. SQL> select FORCE_LOGGING from v$database; FORCE_LOGGING --------------------------------------- YES |
STEP 5: Check DB_NAME and DB_UNIQUE_NAME for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SQL> show parameter DB_NAME; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_name string orcl SQL> show parameter DB_UNIQUE_NAME; NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ db_unique_name string orcl SQL> show parameter NAME NAME TYPE VALUE ------------- -------- ------- db_name string orcl db_unique_name string orcl global_names boolean FALSE instance_name string orcl |
STEP 6: Set LOG_ARCHIVE_CONFIG parameter for Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter LOG_ARCHIVE_CONFIG NAME TYPE VALUE ------------------ --------- ------- log_archive_config string SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl,orcls)'; System altered. SQL> show parameter LOG_ARCHIVE_CONFIG NAME TYPE VALUE -------------------- ----------- -------------------- log_archive_config string DG_CONFIG=(orcl,orcls) |
STEP 7: Set the LOG_ARCHIVE_DEST parameter for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | SQL> show parameter LOG_ARCHIVE_DEST_2 NAME TYPE VALUE --------------------- --------- --------- log_archive_dest_2 string SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcls NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcls'; System altered. SQL> show parameter LOG_ARCHIVE_DEST_2 NAME TYPE VALUE ------------------- ----------- ------------------------------ log_archive_dest_2 string SERVICE=orcls NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRI MARY_ROLE) DB_UNIQUE_NAME=orcls |
STEP 8: Set the LOG_ARCHIVE_DEST_STATE parameter to ENABLE for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter LOG_ARCHIVE_DEST_STATE_2 NAME TYPE VALUE ------------------------- ----------- -------- log_archive_dest_state_2 string enable SQL> alter system set LOG_ARCHIVE_DEST_STATE_2=enable; System altered. SQL> show parameter LOG_ARCHIVE_DEST_STATE_2 NAME TYPE VALUE ---------------------- ----------- --------- log_archive_dest_state_2 string ENABLE |
STEP 9: Set the LOG_ARCHIVE_FORMAT parameter for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter LOG_ARCHIVE_FORMAT NAME TYPE VALUE ------------------ ----------- -------------------- log_archive_format string %t_%s_%r.dbf SQL> alter system set LOG_ARCHIVE_FORMAT='%t_%s_%r.arc' scope=spfile; System altered. SQL> show parameter LOG_ARCHIVE_FORMAT NAME TYPE VALUE ------------------- ----------- --------------- log_archive_format string %t_%s_%r.arc |
STEP 10: Set the LOG_ARCHIVE_MAX_PROCESSES parameter to 30 for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter LOG_ARCHIVE_MAX_PROCESSES NAME TYPE VALUE ------------------------- ----------- ------------- log_archive_max_processes integer 4 SQL> alter system set LOG_ARCHIVE_MAX_PROCESSES=30; System altered. SQL> show parameter LOG_ARCHIVE_MAX_PROCESSES NAME TYPE VALUE -------------------------- ----------- --------------- log_archive_max_processes integer 30 |
STEP 11: Set the REMOTE_LOGIN_PASSWORDFILE parameter to EXCLUSIVE for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter REMOTE_LOGIN_PASSWORDFILE NAME TYPE VALUE ----------------------- ----------- -------- remote_login_passwordfile string INCLUSIVE SQL> alter system set REMOTE_LOGIN_PASSWORDFILE=exclusive scope=spfile; System altered. SQL> show parameter REMOTE_LOGIN_PASSWORDFILE NAME TYPE VALUE -------------------------- ----------- ------------- remote_login_passwordfile string EXCLUSIVE |
STEP 12: Set the FAL_SERVER and FAL_CLIENT parameter for the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | SQL> show parameter FAL NAME TYPE VALUE --------------------- ----------- ------------------------------ fal_client string fal_server string SQL> alter system set FAL_CLIENT=orcl; System altered. SQL> alter system set FAL_SERVER=orcls; System altered. SQL> show parameter FAL NAME TYPE VALUE ------------------ ----------- ------------------------------ fal_client string ORCL fal_server string ORCLS |
STEP 13: Set the STANDBY_FILE_MANAGEMENT parameter to MANUAL for Primary DB.
To add Standby Redo Log files to the Primary DB, it is always necessary to first set the
STANDBY_FILE_MANAGEMENT parameter to MANUAL and then add SRL’s to the DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE ---------------------------- ----------- ------------- standby_file_management string AUTO SQL> alter system set STANDBY_FILE_MANAGEMENT=MANUAL; System altered. SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE --------------------------- ----------- ------------ standby_file_management string MANUAL |
STEP 14: Add STANDBY REDOLOG FILES (SRLs) to the Primary DB while the STANDBY_FILE_MANAGEMENT=MANUAL
A) Check the existing REDO LOG FILES in Primary DB.
1 2 3 4 5 6 7 8 | SQL> select a.GROUP#, a.THREAD#, a.BYTES/1024/1024, a.MEMBERS, a.SEQUENCE#, a.STATUS, b.TYPE, b.MEMBER from v$log a, v$logfile b where a.GROUP# = b.GROUP#; GROUP# THREAD# BYTES/1024/1024 MEMBERS SEQUENCE# STATUS TYPE MEMBER ------ ---------- ----------------- ---------- ---------- ---------------- ------- --------------------------------------- 3 1 200 1 12 INACTIVE ONLINE /u01/app/oracle/oradata/ORCL/redo03.log 2 1 200 1 14 CURRENT ONLINE /u01/app/oracle/oradata/ORCL/redo02.log 1 1 200 1 13 INACTIVE ONLINE /u01/app/oracle/oradata/ORCL/redo01.log |
Before adding any SRLs to the Primary DB, it is neccessary to check the existing Redo-log files in the
Primary DB because the GROUP NUMBER of the new SRLs we create should not overlap with the old ones i.e. 1,2,3.
Also the size of the new SRLs should be same as size of existing Redo-log files in the Primary DB i.e. 200MB.
B) Add new SRLs to the Primary DB.
1 2 3 4 5 6 7 8 9 10 11 | SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 4 ('/u01/app/oracle/oradata/ORCL/standby_redo04.log') SIZE 200M; Database altered. SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 5 ('/u01/app/oracle/oradata/ORCL/standby_redo05.log') SIZE 200M; Database altered. SQL> ALTER DATABASE ADD STANDBY LOGFILE THREAD 1 GROUP 6 ('/u01/app/oracle/oradata/ORCL/standby_redo06.log') SIZE 200M; Database altered. |
C) Verify if SRLs are added to the PRIMARY DB.
1 2 3 4 5 6 7 | SQL> SELECT GROUP#,THREAD#,SEQUENCE#,ARCHIVED,STATUS FROM V$STANDBY_LOG; GROUP# THREAD# SEQUENCE# ARC STATUS ---------- ---------- ---------- --- ---------- 4 1 0 YES UNASSIGNED 5 1 0 YES UNASSIGNED 6 1 0 YES UNASSIGNED |
Also in another tab check if physically the SRLs are created.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | [oracle@dg11 ~]$ cd /u01/app/oracle/oradata/ORCL/ [oracle@dg11 ORCL]$ ll total 3194868 -rw-r-----. 1 oracle oinstall 10600448 Sep 7 04:40 control01.ctl -rw-r-----. 1 oracle oinstall 209715712 Sep 7 02:01 redo01.log -rw-r-----. 1 oracle oinstall 209715712 Sep 7 04:40 redo02.log -rw-r-----. 1 oracle oinstall 209715712 Sep 7 02:01 redo03.log -rw-r-----. 1 oracle oinstall 209715712 Sep 7 04:39 standby_redo04.log -rw-r-----. 1 oracle oinstall 209715712 Sep 7 04:40 standby_redo05.log -rw-r-----. 1 oracle oinstall 209715712 Sep 7 04:40 standby_redo06.log -rw-r-----. 1 oracle oinstall 618668032 Sep 7 04:40 sysaux01.dbf -rw-r-----. 1 oracle oinstall 954212352 Sep 7 04:36 system01.dbf -rw-r-----. 1 oracle oinstall 136323072 Sep 4 14:05 temp01.dbf -rw-r-----. 1 oracle oinstall 298852352 Sep 7 04:36 undotbs01.dbf -rw-r-----. 1 oracle oinstall 5251072 Sep 7 02:01 users01.dbf |
STEP 15: Set the STANDBY_FILE_MANAGEMENT parameter to AUTO for Primary DB.
Now that we have added Standby Redo Log files to the Primary DB, it is always necessary to set the
STANDBY_FILE_MANAGEMENT parameter to AUTO in Primary DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE ------------------------- ----------- ----------- standby_file_management string MANUAL SQL> alter system set STANDBY_FILE_MANAGEMENT=AUTO; System altered. SQL> show parameter STANDBY_FILE_MANAGEMENT NAME TYPE VALUE -------------------------- ----------- ---------- standby_file_management string AUTO |
STEP 16: Send PASSWORD FILE from PRIMARY DB to the STANDBY DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | [oracle@dg11 ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/dbs/ [oracle@dg11 dbs]$ ll total 10376 -rw-rw----. 1 oracle oinstall 1544 Sep 7 21:20 hc_orcl.dat -rw-r--r--. 1 oracle oinstall 3079 May 14 2015 init.ora -rw-r--r--. 1 oracle oinstall 1395 Sep 7 22:04 initorcl.ora -rw-r-----. 1 oracle oinstall 24 Aug 17 14:30 lkORCL -rw-r-----. 1 oracle oinstall 2048 Aug 17 14:33 orapworcl -rw-r-----. 1 oracle oinstall 10600448 Sep 7 14:15 snapcf_orcl.f -rw-r-----. 1 oracle oinstall 3584 Sep 7 21:20 spfileorcl.ora [oracle@dg11 dbs]$ vi initorcl.ora [oracle@dg11 dbs]$ scp orapworcl oracle@192.168.1.37:/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapworcls oracle@192.168.1.37's password: orapworcl 100% 2048 1.3MB/s 00:00 [oracle@dg11 dbs]$ |
3) COMPLETE STEP BY STEP CONFIGURATION FOR STANDBY DATABASE.
The high level steps require to configure a Standby DB are given below. These are as follow:
1 2 3 4 5 6 7 8 9 | Step 01: Make entry in ORATAB FILE before restoring Standby DB. Step 02: Create LISTENER for STANDBY DB and start the LISTENER by DISABLING FIREWALL. Step 03: Create TNSNAMES.ORA FILE for STANDBY DB and check TNSPING for PRIMARY DB and STANDBY DB. Step 04: Set the ENVIRONMENT of Standby DB for 1st time by ECHOING. Step 05: Create a P-FILE for Standby DB and create required DIRECTORIES. Step 06: STARTUP the DB in NOMOUNT mode using new P-FILE created for the Standby DB. Step 07: Connect to AUXILIARY DB using RMAN PROMPT. Step 08: RUN the SCRIPT in RMAN PROMPT to CLONE the Primary DB to Standby DB. Step 09: STARTUP the DB in READ_ONLY mode and Validate some parameters. |
STEP 1: Make entry in ORATAB FILE before restoring Standby DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | [oracle@dg11s ~]$ vi /etc/oratab [oracle@dg11s ~]$ cat /etc/oratab # This file is used by ORACLE utilities. It is created by root.sh # and updated by either Database Configuration Assistant while creating # a database or ASM Configuration Assistant while creating ASM instance. # A colon, ':', is used as the field terminator. A new line terminates # the entry. Lines beginning with a pound sign, '#', are comments. # # Entries are of the form: # $ORACLE_SID:$ORACLE_HOME:<N|Y>: # # The first and second fields are the system identifier and home # directory of the database respectively. The third field indicates # to the dbstart utility that the database should , "Y", or should not, # "N", be brought up at system boot time. # # Multiple entries with the same $ORACLE_SID are not allowed. # orcls:/u01/app/oracle/product/19.0.0/dbhome_1:N |
STEP 2: Create LISTENER for STANDBY DB and start the LISTENER by DISABLING FIREWALL.
A) Create a LISTENER for STANDBY DB
1 2 3 4 5 6 7 8 9 10 | [oracle@dg11s ~]$ . oraenv ORACLE_SID = [oracle] ? orcls The Oracle base has been set to /u01/app/oracle [oracle@dg11s ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/ [oracle@dg11s admin]$ netmgr [oracle@dg11s admin]$ ll total 8 -rw-r--r--. 1 oracle oinstall 469 Sep 7 11:46 listener.ora drwxr-xr-x. 2 oracle oinstall 64 Apr 17 2019 samples -rw-r--r--. 1 oracle oinstall 1536 Feb 14 2018 shrept.lst |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [oracle@dg11s admin]$ cat listener.ora # listener.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora # Generated by Oracle configuration tools. SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = orcls) (ORACLE_HOME = /u01/app/oracle/product/19.0.0/dbhome_1) (SID_NAME = orcls) ) ) LISTENER = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521)) ) ADR_BASE_LISTENER = /u01/app/oracle |
B) DISABLE the FIREWALL for the PRIMARY DB.
To disable the firewall for the Primary DB we need to first connect with the root user and then by
giving command we have to follow the below steps.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | [oracle@dg11s ~]$ su root Password: oracle [root@dg11s Desktop]# service firewalld stop [root@dg11s Desktop]# systemctl disable firewalld [oracle@dg11s ~]$ su oracle [oracle@dg11s admin]$ service firewalld status Redirecting to /bin/systemctl status firewalld.service ● firewalld.service - firewalld - dynamic firewall daemon Loaded: loaded (/usr/lib/systemd/system/firewalld.service; disabled; vendor preset: enabled) Active: inactive (dead) Docs: man:firewalld(1) |
C) Start the LISTENER created for the STANDBY DB.
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@dg11s admin]$ lsnrctl start LSNRCTL for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 11:54:34 Copyright (c) 1991, 2019, Oracle. All rights reserved. Starting /u01/app/oracle/product/19.0.0/dbhome_1/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 19.0.0.0.0 - Production System parameter file is /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora Log messages written to /u01/app/oracle/diag/tnslsnr/dg11s/listener/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.37)(PORT=1521))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=192.168.1.37)(PORT=1521))) STATUS of the LISTENER ------------------------ Alias LISTENER Version TNSLSNR for Linux: Version 19.0.0.0.0 - Production Start Date 07-SEP-2022 11:54:35 Uptime 0 days 0 hr. 0 min. 0 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/listener.ora Listener Log File /u01/app/oracle/diag/tnslsnr/dg11s/listener/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=192.168.1.37)(PORT=1521))) Services Summary... Service "orcls" has 1 instance(s). Instance "orcls", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully |
STEP 3: Create TNSNAMES.ORA FILE for STANDBY DB and check TNSPING for PRIMARY DB and STANDBY DB.
A) Creation of TNSNAMES.ORA FILE in Standby DB
1 2 3 4 5 6 7 8 | [oracle@dg11s admin]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/ [oracle@dg11s admin]$ netmgr [oracle@dg11s admin]$ ll total 12 -rw-r--r--. 1 oracle oinstall 469 Sep 7 11:46 listener.ora drwxr-xr-x. 2 oracle oinstall 64 Apr 17 2019 samples -rw-r--r--. 1 oracle oinstall 1536 Feb 14 2018 shrept.lst -rw-r--r--. 1 oracle oinstall 566 Sep 7 12:00 tnsnames.ora |
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 | [oracle@dg11s admin]$ cat tnsnames.ora # tnsnames.ora Network Configuration File: /u01/app/oracle/product/19.0.0/dbhome_1/network/admin/tnsnames.ora # Generated by Oracle configuration tools. ORCLS = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcls) ) ) ORCL = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521)) ) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl) ) ) |
B) Check TNSPING for PRIMARY DB and STANDBY DB
Remember that to check the TNSPING for both, Primary DB and Standby DB, LISTENER and TNSNAMES.ORA files
should be created in both the DBs and LISTENER should be STARTED in both the DBs.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SERVER DG11S ============ [oracle@dg11s admin]$ tnsping orcls TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:02:58 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcls))) OK (10 msec) [oracle@dg11s admin]$ tnsping orcl TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:03:02 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (30 msec) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | SERVER DG11 =========== [oracle@dg11s admin]$ tnsping orcl TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:03:02 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.36)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcl))) OK (30 msec) [oracle@dg11s admin]$ tnsping orcls TNS Ping Utility for Linux: Version 19.0.0.0.0 - Production on 07-SEP-2022 12:02:58 Copyright (c) 1997, 2019, Oracle. All rights reserved. Used parameter files: Used TNSNAMES adapter to resolve the alias Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.1.37)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = orcls))) OK (10 msec) |
STEP 4: Set the ENVIRONMENT of Standby DB
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | [oracle@dg11s ~]$ . oraenv ORACLE_SID = [oracle] ? orcls The Oracle base has been set to /u01/app/oracle [oracle@dg11s ~]$ echo $ORACLE_HOME /u01/app/oracle/product/19.0.0/dbhome_1 [oracle@dg11s ~]$ echo $ORACLE_SID orcls [oracle@dg11s ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 7 12:14:24 2022 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to an idle instance. SQL> |
STEP 5: Create a P-FILE for Standby DB and create required DIRECTORIES.
A) Create a P-FILE for Standby DB with only GLOBAL_DB_Name inside it.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | [oracle@dg11s ~]$ cd /u01/app/oracle/product/19.0.0/dbhome_1/dbs/ [oracle@dg11s dbs]$ ll total 12 -rw-rw----. 1 oracle oinstall 1544 Aug 21 14:04 hc_orcl.dat -rw-rw----. 1 oracle oinstall 1544 Sep 7 11:21 hc_orcls.dat -rw-r--r--. 1 oracle oinstall 3079 May 14 2015 init.ora [oracle@dg11s dbs]$ vi initorcls.ora [oracle@dg11s dbs]$ ll total 16 -rw-rw----. 1 oracle oinstall 1544 Aug 21 14:04 hc_orcl.dat -rw-rw----. 1 oracle oinstall 1544 Sep 7 11:21 hc_orcls.dat -rw-r--r--. 1 oracle oinstall 3079 May 14 2015 init.ora -rw-r--r--. 1 oracle oinstall 17 Sep 7 12:20 initorcls.ora [oracle@dg11s dbs]$ cat initorcls.ora *.db_name='orcl' |
NOTE: We created a blank P-FILE for the Standby DB and just added the Global_DB_NAME as *.db_name='orcl' to it.
B) Create required directories needed for Standby DB Cloning.
1 2 3 | [oracle@dg11s dbs]$ mkdir -p /u01/app/oracle/admin/orcl/adump [oracle@dg11s dbs]$ mkdir -p /u01/app/oracle/oradata/ORCL [oracle@dg11s dbs]$ mkdir -p /u01/app/oracle/fast_recovery_area/ORCL/ |
NOTE: We are creating above directories keeping in mind that GLOBAL DB NAME 'orcl' is used instead of DB UNIQUE NAME 'orcls'. If we use DB UNIQUE NAME 'orcls' then the DUPLICATING/CLONING process of Primary DB to Standby DB may fail because the Primary DB does not have any directory named with DB UNIQUE NAME 'orcls'.
STEP 6: STARTUP the DB in NOMOUNT mode using new P-FILE created for the Standby DB.
1 2 3 4 5 6 7 8 9 10 | SQL> startup nomount pfile='/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initorcls.ora'; ORACLE instance started. Total System Global Area 243268216 bytes Fixed Size 8895096 bytes Variable Size 180355072 bytes Database Buffers 50331648 bytes Redo Buffers 3686400 bytes SQL> |
STEP 7: Connect to AUXILIARY DB using RMAN PROMPT.
1 2 3 4 5 6 7 8 9 10 11 | SQL> ! [oracle@dg11s ~]$ rman target sys/oracle@orcl auxiliary sys/oracle@orcls Recovery Manager: Release 19.0.0.0.0 - Production on Wed Sep 7 13:35:08 2022 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle and/or its affiliates. All rights reserved. connected to target database: ORCL (DBID=1640751544) connected to auxiliary database: ORCL (not mounted) |
STEP 8: RUN the SCRIPT in RMAN PROMPT to CLONE the Primary DB to Standby DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | RMAN> run { DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE SPFILE PARAMETER_VALUE_CONVERT='orcl','orcls' SET DB_NAME='orcl' SET DB_UNIQUE_NAME='orcls' SET STANDBY_FILE_MANAGEMENT='AUTO' set audit_file_dest ='/u01/app/oracle/admin/orcl/adump' set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/' set fal_server='orcl' set fal_client='orcls' set control_files='/u01/app/oracle/oradata/ORCL/control01.ctl','/u01/app/oracle/fast_recovery_area/ORCL/control02.ctl' NOFILENAMECHECK; } |
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 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 | +++++++++++++ OUTPUT OF SCRIPT ++++++++++++++++++++++++ RMAN> run { DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE SPFILE PARAMETER_VALUE_CONVERT='orcl','orcls' SET DB_NAME='orcl' SET DB_UNIQUE_NAME='orcls' SET STANDBY_FILE_MANAGEMENT='AUTO' set audit_file_dest ='/u01/app/oracle/admin/orcl/adump' set db_recovery_file_dest='/u01/app/oracle/fast_recovery_area/' set fal_server='orcl' set fal_client='orcls' set control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/fast_recovery_area/orcl/control02.ctl' NOFILENAMECHECK; }2> 3> 4> 5> 6> 7> 8> 9> 10> 11> 12> 13> 14> 15> Starting Duplicate Db at 07-SEP-22 using target database control file instead of recovery catalog allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=39 device type=DISK contents of Memory Script: { backup as copy reuse passwordfile auxiliary format '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/orapworcls' ; restore clone from service 'orcl' spfile to '/u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileorcls.ora'; sql clone "alter system set spfile= ''/u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileorcls.ora''"; } executing Memory Script Starting backup at 07-SEP-22 allocated channel: ORA_DISK_1 channel ORA_DISK_1: SID=139 device type=DISK Finished backup at 07-SEP-22 Starting restore at 07-SEP-22 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: restoring SPFILE output file name=/u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileorcls.ora channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 07-SEP-22 sql statement: alter system set spfile= ''/u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileorcls.ora'' contents of Memory Script: { sql clone "alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=orclsXDB)'' comment= '''' scope=spfile"; sql clone "alter system set db_name = ''orcl'' comment= '''' scope=spfile"; sql clone "alter system set db_unique_name = ''orcls'' comment= '''' scope=spfile"; sql clone "alter system set STANDBY_FILE_MANAGEMENT = ''AUTO'' comment= '''' scope=spfile"; sql clone "alter system set audit_file_dest = ''/u01/app/oracle/admin/orcl/adump'' comment= '''' scope=spfile"; sql clone "alter system set db_recovery_file_dest = ''/u01/app/oracle/fast_recovery_area/'' comment= '''' scope=spfile"; sql clone "alter system set fal_server = ''orcl'' comment= '''' scope=spfile"; sql clone "alter system set fal_client = ''orcls'' comment= '''' scope=spfile"; sql clone "alter system set control_files = ''/u01/app/oracle/oradata/orcl/control01.ctl'', ''/u01/app/oracle/fast_recovery_area/orcl/control02.ctl'' comment= '''' scope=spfile"; shutdown clone immediate; startup clone nomount; } executing Memory Script sql statement: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=orclsXDB)'' comment= '''' scope=spfile sql statement: alter system set db_name = ''orcl'' comment= '''' scope=spfile sql statement: alter system set db_unique_name = ''orcls'' comment= '''' scope=spfile sql statement: alter system set STANDBY_FILE_MANAGEMENT = ''AUTO'' comment= '''' scope=spfile sql statement: alter system set audit_file_dest = ''/u01/app/oracle/admin/orcl/adump'' comment= '''' scope=spfile sql statement: alter system set db_recovery_file_dest = ''/u01/app/oracle/fast_recovery_area/'' comment= '''' scope=spfile sql statement: alter system set fal_server = ''orcl'' comment= '''' scope=spfile sql statement: alter system set fal_client = ''orcls'' comment= '''' scope=spfile sql statement: alter system set control_files = ''/u01/app/oracle/oradata/orcl/control01.ctl'', ''/u01/app/oracle/fast_recovery_area/orcl/control02.ctl'' comment= '''' scope=spfile Oracle instance shut down connected to auxiliary database (not started) Oracle instance started Total System Global Area 1157627168 bytes Fixed Size 8895776 bytes Variable Size 704643072 bytes Database Buffers 436207616 bytes Redo Buffers 7880704 bytes duplicating Online logs to Oracle Managed File (OMF) location contents of Memory Script: { restore clone from service 'orcl' standby controlfile; } executing Memory Script Starting restore at 07-SEP-22 allocated channel: ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: SID=35 device type=DISK channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: restoring control file channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:02 output file name=/u01/app/oracle/oradata/orcl/control01.ctl output file name=/u01/app/oracle/fast_recovery_area/orcl/control02.ctl Finished restore at 07-SEP-22 contents of Memory Script: { sql clone 'alter database mount standby database'; } executing Memory Script sql statement: alter database mount standby database RMAN-05538: warning: implicitly using DB_FILE_NAME_CONVERT RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/system01.dbf conflicts with a file used by the target database RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/sysaux01.dbf conflicts with a file used by the target database RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/undotbs01.dbf conflicts with a file used by the target database RMAN-05158: WARNING: auxiliary (datafile) file name /u01/app/oracle/oradata/ORCL/users01.dbf conflicts with a file used by the target database RMAN-05158: WARNING: auxiliary (tempfile) file name /u01/app/oracle/oradata/ORCL/temp01.dbf conflicts with a file used by the target database contents of Memory Script: { set newname for tempfile 1 to "/u01/app/oracle/oradata/ORCL/temp01.dbf"; switch clone tempfile all; set newname for datafile 1 to "/u01/app/oracle/oradata/ORCL/system01.dbf"; set newname for datafile 3 to "/u01/app/oracle/oradata/ORCL/sysaux01.dbf"; set newname for datafile 4 to "/u01/app/oracle/oradata/ORCL/undotbs01.dbf"; set newname for datafile 7 to "/u01/app/oracle/oradata/ORCL/users01.dbf"; restore from nonsparse from service 'orcl' clone database ; sql 'alter system archive log current'; } executing Memory Script executing command: SET NEWNAME renamed tempfile 1 to /u01/app/oracle/oradata/ORCL/temp01.dbf in control file executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME executing command: SET NEWNAME Starting restore at 07-SEP-22 using channel ORA_AUX_DISK_1 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/ORCL/system01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:45 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/ORCL/sysaux01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/ORCL/undotbs01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15 channel ORA_AUX_DISK_1: starting datafile backup set restore channel ORA_AUX_DISK_1: using network backup set from service orcl channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set channel ORA_AUX_DISK_1: restoring datafile 00007 to /u01/app/oracle/oradata/ORCL/users01.dbf channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01 Finished restore at 07-SEP-22 sql statement: alter system archive log current contents of Memory Script: { switch clone datafile all; } executing Memory Script datafile 1 switched to datafile copy input datafile copy RECID=2 STAMP=1114784259 file name=/u01/app/oracle/oradata/ORCL/system01.dbf datafile 3 switched to datafile copy input datafile copy RECID=3 STAMP=1114784259 file name=/u01/app/oracle/oradata/ORCL/sysaux01.dbf datafile 4 switched to datafile copy input datafile copy RECID=4 STAMP=1114784259 file name=/u01/app/oracle/oradata/ORCL/undotbs01.dbf datafile 7 switched to datafile copy input datafile copy RECID=5 STAMP=1114784259 file name=/u01/app/oracle/oradata/ORCL/users01.dbf Finished Duplicate Db at 07-SEP-22 RMAN> |
Hence the PRIMARY DB has been successfully duplicated as STANDBY DB and can now be checked if both the DB's are in SYNC or not.
STEP 9: STARTUP the DB in READ_ONLY mode and VALIDATE some parameters and RECTIFY them if required.
A) STARTUP the DB in READ_ONLY mode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | RMAN> exit Recovery Manager complete. [oracle@dg11s ~]$ sqlplus / as sysdba SQL*Plus: Release 19.0.0.0.0 - Production on Wed Sep 7 18:53:18 2022 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0 SQL> alter database open; Database altered. SQL> select name, open_mode, DB_UNIQUE_NAME, DATABASE_ROLE from v$database; NAME OPEN_MODE DB_UNIQUE_NAME DATABASE_ROLE --------- -------------------- ------------------------------ ---------------- ORCL MOUNTED orcls PHYSICAL STANDBY |
B) Validate some Parameters in READ_ONLY mode.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | SQL> show parameter name NAME TYPE VALUE -------------------- ----------- ----------- cdb_cluster_name string cell_offloadgroup_name string db_file_name_convert string db_name string orcl db_unique_name string orcls global_names boolean FALSE instance_name string orcls lock_name_space string log_file_name_convert string pdb_file_name_convert string processor_group_name string service_names string orcls |
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 | SQL> show parameter control NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ control_file_record_keep_time integer 7 control_files string /u01/app/oracle/oradata/orcl/c ontrol01.ctl, /u01/app/oracle/ fast_recovery_area/orcl/contro l02.ctl control_management_pack_access string DIAGNOSTIC+TUNING SQL> show parameter spfile NAME TYPE VALUE ---------------- ----------- ------------------------------ spfile string /u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileorcls.ora SQL> select log_mode from v$database; LOG_MODE ------------ ARCHIVELOG SQL> select FORCE_LOGGING from v$database; FORCE_LOGGING --------------------------------------- YES SQL> show parameter LOG_ARCHIVE_CONFIG NAME TYPE VALUE --------------------- ----------- ------------------------------ log_archive_config string DG_CONFIG=(orcl,orcls) |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | SQL> show parameter dest NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ audit_file_dest string /u01/app/oracle/admin/orcl/adump background_dump_dest string /u01/app/oracle/product/19.0.0/dbhome_1/rdbms/log core_dump_dest string /u01/app/oracle/diag/rdbms/orcls/orcls/cdump cursor_bind_capture_destination string memory+disk db_recovery_file_dest string /u01/app/oracle/fast_recovery_area/ db_recovery_file_dest_size big integer 8256M diagnostic_dest string /u01/app/oracle log_archive_dest_2 string SERVICE=orcls NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcls log_archive_dest_state_2 string ENABLE log_archive_min_succeed_dest integer 1 user_dump_dest string /u01/app/oracle/product/19.0.0/dbhome_1/rdbms/log |
NOTE:
Here the ‘log_archive_dest_2’ is displaying name of STANDBY DB i.e ‘ORCLS’ which is WRONG.
—- Instead it should display the name of PRIMARY DB i.e ‘ORCL’. Hence we need to rectify this.
RESET the ‘log_archive_dest_2’ parameter
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 | RESET the 'log_archive_dest_2' parameter ======================================== SQL> ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='' scope=both; System altered. SQL> show parameter log_archive_dest_2 NAME TYPE VALUE ------------------- ----------- --------- log_archive_dest_2 string SET the new location of 'log_archive_dest_2' parameter ====================================================== SQL> alter system set LOG_ARCHIVE_DEST_2='SERVICE=orcl NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl'; System altered. SQL> show parameter log_archive_dest_2 NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ log_archive_dest_2 string SERVICE=orcl NOAFFIRM ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl |
Now the new location for ‘log_archive_dest_2’ parameter is set to PRIMARY DB which is ‘ORCL’.
Hence all parameters looks fine.
4) COMPLETE STEP BY STEP PROCESS FOR MAKING THE PRIMARY DATABASE and STANDBY DATABASE IN SYNC.
The high level steps require to configure a Primary DB are given below. These are as follow:
1 2 3 | Step 01: Check the MAXIMUM SEQUENCE of ARCHIVED LOGS applied in Primary DB and Standby DB. Step 02: START the MRP Process in the STANDBY DB for applying ARCHIVES of PRIMARY DB. Step 03: Check whether the REMAINING ARCHIVED LOGS are applied by MRP to the Standby DB. |
STEP 1: Check the MAXIMUM SEQUENCE of ARCHIVED LOGS applied in Primary DB and Standby DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | FOR PRIMARY DB - ORCL ===================== SQL> select MAX(SEQUENCE#) from v$archived_log; MAX(SEQUENCE#) -------------- 23 SQL> alter system switch logfile; System altered. SQL> alter system switch logfile; System altered. SQL> select MAX(SEQUENCE#) from v$archived_log; MAX(SEQUENCE#) -------------- 25 |
Here in PRIMARY DB the Maximum logs that were archived were 23.
So we did ‘alter system switch logfile’ twice to archive 2 more logs and thus the Maximum logs that were archived becomes 25.
Now these archives should be applied to the Standby DB also and the Maximum archived logs applied in the Standby DB should also be 25.
1 2 3 4 5 6 7 8 9 10 11 12 | FOR STANDBY DB - ORCLS ====================== SQL> show parameter standby NAME TYPE VALUE ------------------------------------ ----------- ------------------------------ enabled_PDBs_on_standby string * standby_db_preserve_states string NONE standby_file_management string AUTO standby_pdb_source_file_dblink string standby_pdb_source_file_directory string |
1 2 3 4 5 | SQL> select MAX(SEQUENCE#) from v$archived_log; MAX(SEQUENCE#) -------------- 23 |
This query verifies that archives from the Primary DB are being received by the RFS in Standby DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SQL> SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied", (ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference" FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH, (SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1; Thread Last Sequence Received Last Sequence Applied Difference ---------- ---------------------- --------------------- ---------- 1 25 23 2 |
Here we can see that since the ‘standby_file_management’ is ‘AUTO’, the Archives from the Primary DB are
being received by RFS of Standby DB but not getting applied in Standby DB.
Hence Max Sequence = 25 but Sequence Applied = 23 creating a difference of 2 Archives.
This is because the MRP process of the Standby DB is not started. When MRP process will be started then the remaining Archives will be taken from SRL by MRP and applied in the Standby DB.
This will make the Archive difference 0.
STEP 2: START the MRP Process in the STANDBY DB for applying ARCHIVES of PRIMARY DB.
FOR STANDBY DB – ORCLS
A) View to check if MRP process is running or not.
1 2 3 4 5 6 7 8 9 10 | SQL> select process, status,client_process, thread#, sequence#, block#, blocks from v$managed_standby where process='MRP0'; no rows selected +++++++ OR ++++++++++ [oracle@dg11s ~]$ ps -ef | grep mrp oracle 4223 4155 0 21:32 pts/1 00:00:00 grep --color=auto mrp Hence MRP process in the Standby DB is not yet Started. |
B) START the MRP process in the STANDBY DB and verify.
1 2 3 | SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE nodelay DISCONNECT FROM SESSION; Database altered. |
If we want to STOP the MRP process in the STANDBY DB
In case of you want to cancel apply process, issue following command:
1 2 3 | SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Database altered. |
C) Verify if MRP process in Standby DB is started or not.
1 2 3 4 5 6 7 8 9 10 11 12 13 | SQL> select process, status,client_process, thread#, sequence#, block#, blocks from v$managed_standby where process='MRP0'; PROCESS STATUS CLIENT_P THREAD# SEQUENCE# BLOCK# BLOCKS --------- ------------ -------- ---------- ---------- ---------- ---------- MRP0 APPLYING_LOG N/A 1 26 2044 409600 +++++++ OR ++++++++++ [oracle@dg11s dbs]$ ps -ef | grep mrp oracle 16276 1 0 00:09 ? 00:00:00 ora_mrp0_orcls oracle 16612 10046 0 00:14 pts/0 00:00:00 grep --color=auto mrp |
Hence the MRP process has STARTED in the STANDBY DB.
Now lets see if the remaining archives are being applied to the Standby DB by the MRP.
STEP 3: Check whether the REMAINING ARCHIVED LOGS are applied by MRP to the Standby DB.
A) Check SEQUENCE NUMBER of the archives received by Standby DB.
1 2 3 4 5 | SQL> select MAX(SEQUENCE#) from v$archived_log; MAX(SEQUENCE#) -------------- 25 |
B) Check SEQUENCE APPLIED is same as SEQUENCE NUMBER in Standby DB.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | SQL> SELECT ARCH.THREAD# "Thread", ARCH.SEQUENCE# "Last Sequence Received", APPL.SEQUENCE# "Last Sequence Applied", (ARCH.SEQUENCE# - APPL.SEQUENCE#) "Difference" FROM (SELECT THREAD# ,SEQUENCE# FROM V$ARCHIVED_LOG WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$ARCHIVED_LOG GROUP BY THREAD#)) ARCH, (SELECT THREAD# ,SEQUENCE# FROM V$LOG_HISTORY WHERE (THREAD#,FIRST_TIME ) IN (SELECT THREAD#,MAX(FIRST_TIME) FROM V$LOG_HISTORY GROUP BY THREAD#)) APPL WHERE ARCH.THREAD# = APPL.THREAD# ORDER BY 1; Thread Last Sequence Received Last Sequence Applied Difference ---------- ---------------------- --------------------- ---------- 1 25 25 0 |
Hence we can see that the Difference in Archive logs is 0 and hence the MRP is working properly
and applying the Archived logs of the Primary DB to the Standby DB efficiently.
Hope it helped ..