Steps to configure Oracle Data Guard 12.2 for non-multitenant database

 This document describes the configuration of the Oracle Data Guard Version 12.2. We will configure a standby for a non-multitenant database.

Our test environment consists of two Linux (OEL 7.3) servers: oradg1 and oradg2. I already created the non-multitenant database on the server oradg1. We will configure the standby database on the server oradg2. We will use a new feature of 12.2 by creating a physical standby via dbca – oracle database creation assistant.

Environment overview:

Primary server name/os: oradg1/Oracle Linux Server 7.3 (64 bit)

Standby server name/os: oradg2/Oracle Linux Server 7.3 (64 bit) 

RDBMS Version (primary and standby): 12.2.0.1.0 

ORACLE_HOME (primary and standby): /u01/app/oracle/product/12.2.0/dbhome_1 

Primary ORACLE_SID/DB_UNIQUE_NAME: ORCL1/ORCL1PRM 

Standby ORACLE_SID/DB_UNIQUE_NAME: ORCL1/ORCL1STB 

Listener name/port (primary and standby): LISTENER/1521 

Path to DB files (primary and standby): /u01/app/oracle/oradata/orcl1 

Recovery area (primary and standby): /u01/app/oracle/fast_recovery_area/orcl1

Blueprint:

Preparing the primary database

All steps will be executed on the server oradg1 as OS user oracle. Set the environment and start SQLPlus:

[oracle@oradg1 ~]$ . oraenv
ORACLE_SID = [orcl1] ? orcl1

[oracle@oradg1 ~]$ sqlplus / as sysdba

Enable the archivelog modus – in my configuration is already done:

SQL> archive log list

Database log mode     Archive Mode
Automatic archival     Enabled
Archive destination     USE_DB_RECOVERY_FILE_DEST
Oldest online log sequence 8
Next log sequence to archive 10
Current log sequence     10

Enable force logging and flashback on the primary:

SQL> alter database force logging;
SQL> alter database flashback on;

Create standby redologs

— Check the number of groups and a size of redolog files:

SQL> select GROUP#,THREAD#,BYTES from v$log;

GROUP# THREAD#     BYTES
---------- ---------- ----------
     1     1 209715200
     2     1 209715200
     3     1 209715200

SQL> select member from v$logfile;

MEMBER
-----------------------------------------------------------------------
/u01/app/oracle/oradata/orcl1/redo01.log
/u01/app/oracle/oradata/orcl1/redo02.log
/u01/app/oracle/oradata/orcl1/redo03.log

— Create:

SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb01.log' size 209715200;

SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb02.log' size 209715200;

SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb03.log' size 209715200;

Adjust some initialization parameters:

SQL> show parameter db_name

NAME                 TYPE     VALUE
----------------------------------------------
db_name              string     orcl1

SQL> show parameter db_unique_name

NAME                 TYPE     VALUE
-----------------------------------------------
db_unique_name             string     ORCL1PRM

-- remote_login_password:
SQL> show parameter remote_login_password

NAME                 TYPE     VALUE
-----------------------------------------------
remote_login_passwordfile     string     EXCLUSIVE

-- LOG_ARCHIVE_CONFIG:
SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl1prm,orcl1stb)' scope = spfile;

-- LOG_ARHIVE_DEST_1:
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl1prm' scope = spfile;

-- Parameter for Swith- Failover -These parameters take effect when the primary database is transitioned to the standby role:
SQL> alter system set FAL_SERVER='orcl1stb' scope = spfile;
SQL> alter system set STANDBY_FILE_MANAGEMENT=AUTO scope = spfile;

Now we will restart the database und check parameters:

SQL> shutdown immediate
SQL> startup

SQL> set linesize 500 pages 100
SQL> col name for a30
SQL> col value forma a100
SQL>
select name, value
from v$parameter
where name in ('db_name','db_unique_name','log_archive_config',
'log_archive_dest_1','log_archive_dest_2',
'log_archive_dest_state_1','log_archive_dest_state_2',
'remote_login_passwordfile', 'log_archive_format', 'log_archive_max_processes',
'fal_server','db_file_name_convert', 'log_file_name_convert', 'standby_file_management');

NAME             VALUE

--------------------------------------------------------------------------
log_archive_dest_1     LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl1prm

log_archive_dest_state_1 enable
log_archive_dest_state_2 enable
fal_server         orcl1stb
log_archive_config     DG_CONFIG=(orcl1prm,orcl1stb)
log_archive_format     %t_%s_%r.dbf
log_archive_max_processes 4
standby_file_management AUTO
remote_login_passwordfile EXCLUSIVE
db_name          orcl1
db_unique_name         ORCL1PRM

Network configuration

Now we will edit two configuration files: listener.ora and tnsnames.ora:

[oracle@oradg1 dbhome_1]$ cd $ORACLE_HOME/network/admin

Edit file listener.ora, add following lines:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl1prm)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
(SID_NAME = orcl1)
)

(SID_DESC =
(GLOBAL_DBNAME = orcl1prm_dgmgrl)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
(SID_NAME = orcl1)
)
)

Add following lines to the file tnsnames.ora:

# Data Guard
ORCL1PRM =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl1prm)
(UR=A)
)
)

ORCL1STB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl1stb)
(UR=A)
)
)

LISTENER_ORCL1 =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg1)(PORT = 1521))

Restart the listener:

[oracle@oradg1 admin]$ lsnrctl stop
[oracle@oradg1 admin]$ lsnrctl start

Creating a physical standby database

Now we will create the physical standby database on the server oradg2. We will use oracle database creation assistant – dbca – it is a new feature in the RDBMS 12.2.

We will set the environment and start the listener:

[oracle@oradg2 ~]$ export ORACLE_HOME=/u01/app/oracle/product/12.2.0/dbhome_1
[oracle@oradg2 ~]$ export PATH=$ORACLE_HOME/bin:$PATH
[oracle@oradg2 ~]$ lsnrctl start

Now we can start the dbca.

The syntax is:

dbca -createDuplicateDB
-gdbName global_database_name
-primaryDBConnectionString easy_connect_string_to_primary
-sid database_system_identifier
[-createAsStandby
[-dbUniqueName db_unique_name_for_standby]]

In our case we will start the dbca with following arguments:

[oracle@oradg2 ~]$ dbca -silent -createDuplicateDB -gdbName orcl1 -primaryDBConnectionString oradg1:1521/orcl1prm -sid orcl1 -createAsStandby -dbUniqueName orcl1stb

Output:

Enter SYS user password:
Listener config step
33% complete
Auxiliary instance creation
66% complete
RMAN duplicate
100% complete
Look at the log file "/u01/app/oracle/cfgtoollogs/dbca/orcl1stb/orcl10.log" for further details.

The physical standby database is now created.

The spfile and password file are automatically created in the $ORACLE_HOME/dbs directory:

[oracle@oradg2 ~]$ cd $ORACLE_HOME/dbs
[oracle@oradg2 dbs]$ ll *orcl1*

-rw-rw----. 1 oracle oinstall 1544 14. Aug 18:42 hc_orcl1.dat
-rw-r-----. 1 oracle oinstall 94 14. Aug 18:41 initorcl1.ora
-rw-r-----. 1 oracle oinstall 3584 14. Aug 18:41 orapworcl1
-rw-r-----. 1 oracle oinstall 3584 14. Aug 18:42 spfileorcl1.ora

Check the database role on the standby:

[oracle@oradg2 ~]$ . oraenv
ORACLE_SID = [oracle] ? orcl1
[oracle@oradg2 ~]$ sqlplus / as sysdba

SQL> select database_role from v$database;

DATABASE_ROLE
----------------
PHYSICAL STANDBY

Configuring a physical standby database

Set database parameters:

[oracle@oradg2 dbs]$ . oraenv
ORACLE_SID = [oracle] ? orcl1
[oracle@oradg2 dbs]$ sqlplus / as sysdba

SQL> show parameter db_name

NAME                 TYPE     VALUE
----------------------------------------------- 
db_name              string     orcl1

SQL> show parameter db_unique_name

NAME                 TYPE     VALUE
----------------------------------------------- 
db_unique_name             string     orcl1stb

SQL> -- remote_login_password:
SQL> show parameter remote_login_password

NAME                 TYPE     VALUE
----------------------------------------------- 
remote_login_passwordfile     string     EXCLUSIVE

SQL> alter system set LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl1stb,orcl1prm)' scope = spfile;
SQL> alter system set LOG_ARCHIVE_DEST_1='LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl1stb' scope = spfile;
SQL> alter system set FAL_SERVER='orcl1prm' scope = spfile;
SQL> alter system set STANDBY_FILE_MANAGEMENT=AUTO scope = spfile;

Shutdown the database and start it in the mount modus:

SQL> shutdown immediate
SQL> startup mount

Check parameters:

SQL> set linesize 500 pages 100
SQL> col name for a30
SQL> col value forma a100
SQL>
select name, value
from v$parameter
where name in ('db_name','db_unique_name','log_archive_config',
'log_archive_dest_1','log_archive_dest_2',
'log_archive_dest_state_1','log_archive_dest_state_2',
'remote_login_passwordfile', 'log_archive_format', 'log_archive_max_processes',
'fal_server','db_file_name_convert', 'log_file_name_convert', 'standby_file_management');

NAME             VALUE
------------------------------ ----------------------------------------------------------------------------------------------------
db_file_name_convert
log_file_name_convert
log_archive_dest_1     LOCATION=USE_DB_RECOVERY_FILE_DEST VALID_FOR=(ALL_LOGFILES,ALL_ROLES) DB_UNIQUE_NAME=orcl1stb
log_archive_dest_2
log_archive_dest_state_1 enable
log_archive_dest_state_2 enable
fal_server         orcl1prm
log_archive_config     dg_config=(orcl1stb,orcl1,orcl1prm)
log_archive_format     %t_%s_%r.dbf
log_archive_max_processes 4
standby_file_management AUTO
remote_login_passwordfile EXCLUSIVE
db_name          orcl1
db_unique_name         orcl1stb


Create standby logfiles:

SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb01.log' size 209715200;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb02.log' size 209715200;
SQL> ALTER DATABASE ADD STANDBY LOGFILE '/u01/app/oracle/oradata/orcl1/redostb03.log' size 209715200;

Network configuration

We will configure the network configuration for a data guard.

[oracle@oradg2]$ cd $ORACLE_HOME/network/admin

Edit file listener.ora, add following lines:

SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = orcl1stb)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
(SID_NAME = orcl1)
)

(SID_DESC =
(GLOBAL_DBNAME = orcl1stb_dgmgrl)
(ORACLE_HOME = /u01/app/oracle/product/12.2.0/dbhome_1)
(SID_NAME = orcl1)
)
)

Add following lines to the file tnsnames.ora:

# Data Guard
ORCL1PRM =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg1)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl1prm)
(UR=A)
)
)

ORCL1STB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = oradg2)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = orcl1stb)
(UR=A)
)
)

LISTENER_ORCL1 = (ADDRESS = (PROTOCOL = TCP)(HOST = oradg1)(PORT = 1521))

Restart the listener:

[oracle@oradg2 admin]$ lsnrctl stop
[oracle@oradg2 admin]$ lsnrctl start

Enabling Data Guard configuration

Enable the data guard broker via SQLPlus (on both servers: oradg1/oradg2):

Server oradg1:

[oracle@oradg1 ~]$ . oraenv
ORACLE_SID = [orcl1] ?
[oracle@oradg1 ~]$ sqlplus / as sysdba
SQL> alter system set dg_broker_start=true scope=both;

Server oradg2:

[oracle@oradg2 ~]$ . oraenv
ORACLE_SID = [orcl1] ?
[oracle@oradg2]$ sqlplus / as sysdba
SQL> alter system set dg_broker_start=true scope=both;

Creating a Data Guard configuration via a tool DGMGRL on the Server oradg1:

[oracle@oradg1 ~]$ . oraenv
ORACLE_SID = [orcl1] ?
The Oracle base remains unchanged with value /u01/app/oracle
[oracle@oradg1]$ dgmgrl /
DGMGRL> create configuration orcl1 as primary database is orcl1prm connect identifier is orcl1prm;
DGMGRL> add database orcl1stb as connect identifier is orcl1stb maintained as physical;
DGMGRL> enable configuration;

Check configuration:

DGMGRL> show configuration

Configuration - orcl1
Protection Mode: MaxPerformance
Members:
orcl1prm - Primary database
orcl1stb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 55 seconds ago)

DGMGRL> show database orcl1prm

Database - orcl1prm
Role: PRIMARY
Intended State: TRANSPORT-ON
Instance(s):
orcl1
Database Status:
SUCCESS

DGMGRL> show database orcl1stb
Database - orcl1stb
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: 11.00 KByte/s
Real Time Query: ON
Instance(s):
orcl1
Database Status:
SUCCESS

Set the parameter StaticConnectIdentifier to prevent errors during switchover

DGMGRL> edit database orcl1prm set property StaticConnectIdentifier="oradg1:1521/orcl1prm_dgmgrl";

DGMGRL> edit database orcl1stb set property StaticConnectIdentifier="oradg2:1521/orcl1stb_dgmgrl";

Check Data Guard in SQLPlus (on both servers oradg1/oradg2):

Database role/status:

Primary:

SQL> SELECT DATABASE_ROLE, DB_UNIQUE_NAME INSTANCE, OPEN_MODE, PROTECTION_MODE, PROTECTION_LEVEL, SWITCHOVER_STATUS FROM V$DATABASE;

DATABASE_ROLE     INSTANCE      OPEN_MODE   PROTECTION_MODE     PROTECTION_LEVEL     SWITCHOVER_STATUS
---------------- ------------- ----------- -------------------- -------------------- --------------------
PRIMARY           ORCL1PRM      READ WRITE  MAXIMUM PERFORMANCE MAXIMUM PERFORMANCE  TO STANDBY

Standby:

SQL> SELECT DATABASE_ROLE, DB_UNIQUE_NAME INSTANCE, OPEN_MODE, PROTECTION_MODE, PROTECTION_LEVEL, SWITCHOVER_STATUS FROM V$DATABASE;

DATABASE_ROLE     INSTANCE   OPEN_MODE            PROTECTION_MODE      PROTECTION_LEVEL     SWITCHOVER_STATUS
---------------- ---------- --------------------- -------------------- -------------------- --------------------
PHYSICAL STANDBY  orcl1stb   READ ONLY WITH APPLY MAXIMUM PERFORMANCE  MAXIMUM PERFORMANCE   NOT ALLOWED

Check sequence number of archived redologs:

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Output primary:

SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
15 14-AUG-17 14-AUG-17
16 14-AUG-17 14-AUG-17
17 14-AUG-17 14-AUG-17
18 14-AUG-17 14-AUG-17
19 14-AUG-17 15-AUG-17
20 15-AUG-17 15-AUG-17

Output standby:

SEQUENCE# FIRST_TIM NEXT_TIME
---------- --------- ---------
17 14-AUG-17 14-AUG-17
18 14-AUG-17 14-AUG-17
19 14-AUG-17 15-AUG-17
20 15-AUG-17 15-AUG-17 

Swithover test

Start DGMGRL and connect to Standby database as user sys:

[oracle@oradg1 ~]$ dgmgrl sys/oracle@orcl1stb

Check the configuration:

DGMGRL> show configuration

Configuration - orcl1
Protection Mode: MaxPerformance
Members:
orcl1prm - Primary database
orcl1stb - Physical standby database

Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 32 seconds ago)

Perform the swithover:

DGMGRL> switchover to orcl1stb

Output:

Performing switchover NOW, please wait...
New primary database "orcl1stb" is opening...
Operation requires start up of instance "orcl1" on database "orcl1prm"
Starting instance "orcl1"...
ORACLE instance started.
Database mounted.
Connected to "ORCL1PRM"
Switchover succeeded, new primary is "orcl1stb"

Check the configuration:

DGMGRL> show configuration

Configuration - orcl1
Protection Mode: MaxPerformance

Members:
orcl1stb - Primary database
orcl1prm - Physical standby database

Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 6 seconds ago)

 

Comments

Popular posts from this blog

Step by Step: How to troubleshoot a slow running query in Oracle

Register Archive log file manually in standby Database

How to check UNDO tablespace usage and who is using more undo