Oracle Data Guard (8/5) : Re-convertir la Base Primaire en Standby après un Failover

Si vous me suivez au delà de ce blog, vous aurez remarqué mon intérêt pour les séries d’article. Cela permet de creuser un sujet sur plusieurs semaines et de partager des expériences parfois délicates… Et vous ne savez pas tout ;-).

Parmi ces séries et leurs séquelles plus ou moins référencées, vous trouverez notamment une série d’articles sur les installations en ligne de commande. Plus qu’une série, il y a mon blog de 37 articles dédiés à Oracle Streams et, plus récemment, une série de 7 articles à propos des bases de données Standby et Data Guard.

Faire et défaire… bref …

Pourtant malgré les articles, vous tombez toujours sur de nouvelles questions. Par exemple, dans le dernier article consacré à Data Guard, vous constatez que redémarrer la base de données primaire basculée automatiquement par l’Observer Data Guard la ré-instancie automatiquement. Alors qu’en est-il lorsque l’observer n’est pas actif ? Une recherche dans la documentation propose la méthode « 13.2 Converting a Failed Primary Into a Standby Database Using Flashback Database » soit une méthode en 5 étapes… Pourtant depuis Oracle 11.2, il existe beaucoup mieux !

Note:
On supposera que l’ensemble des pré-requis pour la ré-instantiation sont réunis et notamment que les bases de données primaires et standby ont leurs flashback logs actifs. Pour plus de détails reportez-vous à la section 5.5.8 Reinstating the Former Primary Database in the Broker Configuration du document « Oracle Data Guard Broker – 11g Release 2 (11.2) »

Scénario initial

Supposez que vous ayez 2 bases de données nommées BLACK et WHITE; BLACK est la base de données primaire et WHITE sa standby. Toutes les 2 ont leurs flashback logs actifs et le broker data guard est correctement configuré. La configuration initiale ressemble à celle-ci :

dgmgrl sys/change_on_install@black

show configuration verbose

Configuration - worldwide

Protection Mode: MaxPerformance
Databases:
black - Primary database
white - Physical standby database

Properties:
FastStartFailoverThreshold = '30'
OperationTimeout = '30'
FastStartFailoverLagLimit = '30'
CommunicationTimeout = '180'
FastStartFailoverAutoReinstate = 'TRUE'
FastStartFailoverPmyShutdown = 'TRUE'
BystandersFollowRoleChange = 'ALL'

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

Vous allez, pour les besoins du scénario, arrêter la base de données primaire et basculer sur la standby. Voici le script correspondant :

ps -ef |grep [s]mon |grep BLACK | 
awk '{print "kill -9",$2}'|sh

dgmgrl sys/change_on_install@white

show configuration

Configuration - worldwide

Protection Mode: MaxPerformance
Databases:
black - Primary database
white - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
ORA-01034: ORACLE not available
ORA-16625: cannot reach database "black"
DGM-17017: unable to determine configuration status


failover to white;
Performing failover NOW, please wait...
Failover succeeded, new primary is "white"


show configuration

Configuration - worldwide

Protection Mode: MaxPerformance
Databases:
white - Primary database
black - Physical standby database (disabled)
ORA-16661: the standby database needs to be reinstated

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS

Vous voilà prêt pour la partie intéressante de cet article. La ré-instantiation de la base de données primaire ou les 5 étapes présentées en début d’articles.

Ré-instanciation

Si vous redémarrez la base de données primaire par inadvertance, l’existence du broker l’empêche de s’ouvrir comme vous le constatez ci-dessous. Pourtant, la base de données reste une base de données primaire :

. oraenv
BLACK

sqlplus / as sysdba

Connected to an idle instance.

startup
ORACLE instance started.

Total System Global Area 1603411968 bytes
Fixed Size 2228784 bytes
Variable Size 402656720 bytes
Database Buffers 1191182336 bytes
Redo Buffers 7344128 bytes
Database mounted.
ORA-16649: possible failover to another database prevents this database from
being opened


select OPEN_MODE, DATABASE_ROLE
from v$database;

OPEN_MODE DATABASE_ROLE
-------------------- ----------------
MOUNTED PRIMARY

Et maintenant, ré-instanciez la base de données ; il suffit, pour cela, de se connecter à la nouvelle base de données primaire, c’est à dire WHITE et de lancer la commande REINSTATE DATABASE comme ci-dessous :

dgmgrl sys/change_on_install@white

reinstate database black;
Reinstating database "black", please wait...
Operation requires shutdown of instance "BLACK" on database "black"
Shutting down instance "BLACK"...
ORA-01109: database not open

Database dismounted.
ORACLE instance shut down.
Operation requires startup of instance "BLACK" on database "black"
Starting instance "BLACK"...
ORACLE instance started.
Database mounted.
Continuing to reinstate database "black" ...
Reinstatement of database "black" succeeded

Comme vous le constatez ci-dessous, la configuration est à nouveau opérationnelle et prête à une prochaine bascule, planifiée ou non :

show configuration

Configuration - worldwide

Protection Mode: MaxPerformance
Databases:
white - Primary database
black - Physical standby database

Fast-Start Failover: DISABLED

Configuration Status:
SUCCESS