Skip to main content

Oracle Data Guard test of switchover and failover



Active DataGuard failover:
check the status before switchover or failover:
SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
SELECT NAME, VALUE, DATUM_TIME FROM V$DATAGUARD_STATS;
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
Switchover steps:
Old Primary:
ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
SHUTDOWN ABORT;
STARTUP MOUNT;
 
New primary:
SELECT SWITCHOVER_STATUS FROM V$DATABASE;  -- value should be TO PRIMARY or SESSIONS ACTIVE
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
ALTER DATABASE OPEN;
Bounce the database – this is important, without this step, the v$archive_dest_status will show “bad parameter” and no redo apply on standby.
 
New standby:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
Select * from v$dataguard_stats;
SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
 
 
Failover steps:
 
Old primary:
Mount database
ALTER SYSTEM FLUSH REDO TO target_db_name;
alter system set log_archive_dest_2=''  scope=both;
 
Old standby:
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
SELECT SWITCHOVER_STATUS FROM V$DATABASE;
alter system set log_archive_dest_2=''  scope=both;
ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
or
ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
 
ALTER DATABASE OPEN;
 
Now test the switchover from test to test_stby:
 
On the old primary:
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY WITH SESSION SHUTDOWN;
 
Database altered.
 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED
 
SQL>
On the old standby:
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
SWITCHOVER_STATUS
--------------------
TO PRIMARY
SQL> ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY WITH SESSION SHUTDOWN;
 
Database altered.
 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
 
SQL> ALTER DATABASE OPEN;
 
Database altered.
 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
SWITCHOVER_STATUS
--------------------
NOT ALLOWED
 
SQL>
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
SWITCHOVER_STATUS
--------------------
RECOVERY NEEDED
 
SQL> shutdown abort;
ORACLE instance shut down.
SQL> startup mount
ORACLE instance started.
 
Total System Global Area 1068937216 bytes
Fixed Size                  2235208 bytes
Variable Size             729810104 bytes
Database Buffers          331350016 bytes
Redo Buffers                5541888 bytes
Database mounted.
SQL> alter database open;
 
Database altered.
 
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT;
 
Database altered.
 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
 
SWITCHOVER_STATUS
--------------------
TO PRIMARY
 
SQL>
 
On new primary:
SQL> SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
 
STATUS    GAP_STATUS
--------- ------------------------
BAD PARAM
 
SQL>
 
Bounce the new primary database solved the problem.
 
SQL> SELECT STATUS, GAP_STATUS FROM V$ARCHIVE_DEST_STATUS WHERE DEST_ID = 2;
VALID     NO GAP
 
 
Now test the switchover from test_stby to test:
Works as expected.
 
Now test the failover of test_stby:
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL;
 
Database altered.
 
SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH;
 
Database altered.
 
SQL> SELECT SWITCHOVER_STATUS FROM V$DATABASE;
TO PRIMARY
SQL> alter system set log_archive_dest_2=''  scope=both;
 
System altered.
 
SQL> ALTER DATABASE ACTIVATE PHYSICAL STANDBY DATABASE;
 
Database altered.
SQL> alter database open;
 
Database altered.
 
SQL> exec print_table('select * from v$database')
DBID                          : 2210233584
NAME                          : TEST
CREATED                       : 17-may-2016 13:32:32
RESETLOGS_CHANGE#             : 1897922
RESETLOGS_TIME                : 30-may-2016 15:37:41
PRIOR_RESETLOGS_CHANGE#       : 995548
PRIOR_RESETLOGS_TIME          : 17-may-2016 13:32:34
LOG_MODE                      : ARCHIVELOG
CHECKPOINT_CHANGE#            : 1897925
ARCHIVE_CHANGE#               : 0
CONTROLFILE_TYPE              : CURRENT
CONTROLFILE_CREATED           : 17-may-2016 13:32:32
CONTROLFILE_SEQUENCE#         : 913217881
CONTROLFILE_CHANGE#           : 1898008
CONTROLFILE_TIME              : 30-may-2016 15:39:36
OPEN_RESETLOGS                : NOT ALLOWED
VERSION_TIME                  : 27-may-2016 13:40:34
OPEN_MODE                     : READ WRITE
PROTECTION_MODE               : MAXIMUM PERFORMANCE
PROTECTION_LEVEL              : MAXIMUM PERFORMANCE
REMOTE_ARCHIVE                : ENABLED
ACTIVATION#                   : 2211353098
SWITCHOVER#                   : 2211353098
DATABASE_ROLE                 : PRIMARY
ARCHIVELOG_CHANGE#            : 0
ARCHIVELOG_COMPRESSION        : DISABLED
SWITCHOVER_STATUS             : NOT ALLOWED
DATAGUARD_BROKER              : DISABLED
GUARD_STATUS                  : NONE
SUPPLEMENTAL_LOG_DATA_MIN     : NO
SUPPLEMENTAL_LOG_DATA_PK      : NO
SUPPLEMENTAL_LOG_DATA_UI      : NO
FORCE_LOGGING                 : NO
PLATFORM_ID                   : 13
PLATFORM_NAME                 : Linux x86 64-bit
RECOVERY_TARGET_INCARNATION#  : 3
LAST_OPEN_INCARNATION#        : 3
CURRENT_SCN                   : 1898135
FLASHBACK_ON                  : NO
SUPPLEMENTAL_LOG_DATA_FK      : NO
SUPPLEMENTAL_LOG_DATA_ALL     : NO
DB_UNIQUE_NAME                : test_stby
STANDBY_BECAME_PRIMARY_SCN    : 1897910
FS_FAILOVER_STATUS            : DISABLED
FS_FAILOVER_CURRENT_TARGET    :
FS_FAILOVER_THRESHOLD         : 0
FS_FAILOVER_OBSERVER_PRESENT  :
FS_FAILOVER_OBSERVER_HOST     :
CONTROLFILE_CONVERTED         : NO
PRIMARY_DB_UNIQUE_NAME        : test
SUPPLEMENTAL_LOG_DATA_PL      : NO
MIN_REQUIRED_CAPTURE_CHANGE#  :
-----------------
 
PL/SQL procedure successfully completed.

Comments

Popular posts from this blog

non-existent process lock port on windows server

I have a database link created between oracle and sqlserver using oracle tg4odbc, the product is installed on windows server and run as service "OracleOraGtw11g_home1TNSListener", but sometime the service cannot started, the root cause of this problem is that the port number 1521 is used by an non-existent process. The first step is to use netstat -bano|find "1521" to get the process id, in my case it's 5844, which shows the connection is from my oracle server 10.8.0.169 H:\>netstat -bano|find "1521"   TCP    0.0.0.0:1521           0.0.0.0:0              LISTENING       5844   TCP    10.14.45.33:1521       10.8.0.169:42987       ESTABLISHED     5844 however the process id does not show in either task manager or process explorer. The next step is to run tcpview, which shows non-existent under process column, there are three rows, two show status as "listening", the other one shows status "established", right click and k

Opatch apply/lsinventory error: oneoff is corrupted or does not exist

I am applying the quarterly patch for 19c RDBMS, I tried using napply but failed, but somehow it corrupted the inventory though nothing applied. further apply and lsinventory command ran into error like this: $ ./OPatch/opatch lsinventory Oracle Interim Patch Installer version 12.2.0.1.21 Copyright (c) 2020, Oracle Corporation.  All rights reserved. Oracle Home       : /u02/app/oracle/19.0.0 Central Inventory : /u01/app/oraInventory    from           : /u02/app/oracle/19.0.0/oraInst.loc OPatch version    : 12.2.0.1.21 OUI version       : 12.2.0.7.0 Log file location : /u02/app/oracle/19.0.0/cfgtoollogs/opatch/opatch2020-09-08_13-35-59PM_1.log Lsinventory Output file location : /u02/app/oracle/19.0.0/cfgtoollogs/opatch/lsinv/lsinventory2020-09-08_13-35-59PM.txt -------------------------------------------------------------------------------- Inventory load failed... OPatch cannot load inventory for the given Oracle Home. LsInventorySession failed: Unable to create patchObject Possible ca

shell script to clean up oracle dumpfile

https://github.com/iacosta/personal/blob/master/shells/cleanhouse.sh #!/bin/ksh # # Script used to cleanup any Oracle environment. # # Cleans:      audit_file_dest #              background_dump_dest #              core_dump_dest #              user_dump_dest #              Clusterware logs # # Rotates:     Alert Logs #              Listener Logs # # Scheduling:  00 00 * * * /networkdrive/dba/scripts/purge/cleanup.sh -d 7 > /u01/dba/bin/cleanup.log 2>&1 # # Created By:  Lei Dao # # # RM="rm -f" RMDIR="rm -rf" LS="ls -l" MV="mv" TOUCH="touch" TESTTOUCH="echo touch" TESTMV="echo mv" TESTRM=$LS TESTRMDIR=$LS SUCCESS=0 FAILURE=1 TEST=0 HOSTNAME=`hostname` ORAENV="oraenv" TODAY=`date +%Y%m%d` ORIGPATH=/usr/local/bin:$PATH ORIGLD=$LD_LIBRARY_PATH export PATH=$ORIGPATH # Usage function. f_usage(){   echo "Usage: `basename $0` -d DAYS [-a DAYS] [-b DAYS] [