Hi all,
A few weeks ago, I faced a problem switching from a primary to a standby database. It was not the first time it occurred to me, so I decided to write about it.
When executing the switchover, I faced an "ORA-03113: end-of-file on communication channel".
DGMGRL> switchover to stddb
Performing switchover NOW, please wait...
Error:
ORA-03113: end-of-file on communication channel
Process ID: 52627
Session ID: 1190 Serial number: 19862
Unable to switchover, primary database is still "pridb"
Despite the DGMRL saying that the primary database was not switched, it was not the reality. I logged into the databases and checked their roles; as we can see, their roles were reversed.
(SYS@pridb1,sid=10390)>select open_mode, database_role from gv$database;
OPEN_MODE DATABASE_ROLE
------------------------- ----------------------
READ ONLY WITH APPLY PHYSICAL STANDBY
READ ONLY WITH APPLY PHYSICAL STANDBY
READ ONLY WITH APPLY PHYSICAL STANDBY
(SYS@stddb1,sid=11881)>select open_mode, database_role from gv$database;
OPEN_MODE DATABASE_ROLE
-------------------- ----------------
READ WRITE PRIMARY
READ WRITE PRIMARY
READ WRITE PRIMARY
The DGMRL also did not update the databases' CRS information:
--output clipped
[oracle@PRISERVER01 admin]$ srvctl confidatabase -db pridb
Database unique name: pridb
Database name: pridb
Start options: open
Stop options: immediate
Database role: PRIMARY
--output clipped
oracle@STDSERVER01:/home/oracle $> srvctl config database -db stddb
Database unique name: stddb
Database name: pridb
Start options: read only
Stop options: immediate
Database role: PHYSICAL_STANDBY
Firstly I checked the current DGMGRL configuration and did take notes.
DGMGRL> show configuration
Configuration - dg_conf
Protection Mode: MaxPerformance
Members:
pridb - Primary database
stddb - Physical standby database
Secondly, I changed the databases' CRS configuration:
srvctl stop database -db pridb -stopoption immediate
srvctl stop database -db stddb -stopoption immediate
srvctl modify database -db pridb -startoption "read only"
srvctl modify database -db pridb -role physical_standby
srvctl config database -db pridb
srvctl modify database -db stddb -startoption open
srvctl modify database -db stddb -role primary
srvctl config database -db stddb
srvctl start database -db pridb
srvctl start database -db stddb
Lastly, I recreated the DGMGRL configuration:
dgmgrl sys/password
DGMGRL>remove configuration
DGMGRL>create configuration dg_conf as primary database is stddb connect identifier is stddb;
DGMGRL>add database pridb as connect identifier is pridb maintained as physical;
DGMGRL>enable configuration
DGMGRL>show configuration
Configuration - dg_conf
Protection Mode: MaxPerformance
Members:
stddb - Primary database
pridb - Physical standby database
Fast-Start Failover: DISABLED
Configuration Status:
SUCCESS (status updated 40 seconds ago)
DGMGRL> show database stddb
Database - stddb
Role: PRIMARY
Intended State: TRANSPORT-ON
Instance(s):
stddb1
stddb2
stddb3
Database Status:
SUCCESS
DGMGRL> show database pridb
Database - pridb
Role: PHYSICAL STANDBY
Intended State: APPLY-ON
Transport Lag: 0 seconds (computed 1 second ago)
Apply Lag: 0 seconds (computed 1 second ago)
Average Apply Rate: 10.06 MByte/s
Real Time Query: OFF
Instance(s):
pridb1 (apply instance)
pridb2
pridb3
Database Status:
SUCCESS
Those switchover errors occur to me more frequently than I would like, often due to processes preventing the database shutdown. So, before executing a switchover, I usually stop, then start the primary and standby databases, and this small procedure avoids so much pain during the night shifts. :-)
That's all, folks, and I hope I have helped.
Rodrigo Lima.