Mise en place d'Oracle Data Guard (standby physique)
Symptôme
Objectif : mettre en place la reprise après sinistre et la haute disponibilité pour Oracle avec une standby physique (Data Guard) ; pouvoir basculer sur la standby en cas de défaillance de la base primaire.
1. Passez la base primaire en mode FORCE LOGGING et ARCHIVELOG
Pour que la standby reste cohérente avec la base primaire, toutes les modifications doivent être écrites dans le redo. FORCE LOGGING journalise même les opérations NOLOGGING. Pour le mode ARCHIVELOG, la base est démarrée à l'état MOUNT.
Oracle
ALTER DATABASE FORCE LOGGING;
-- For ARCHIVELOG:
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
ALTER DATABASE OPEN;2. Ajoutez des fichiers standby redo log
Les standby redo logs (SRL) doivent compter un groupe de plus que les online redo logs, avec la même taille. Ils sont créés sur la base primaire comme sur la standby ; ils sont requis pour le real-time apply. Dans l'exemple, si l'online redo fait 200M, les SRL font aussi 200M.
Oracle
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl01.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl02.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl03.log') SIZE 200M;
ALTER DATABASE ADD STANDBY LOGFILE ('/u01/oradata/srl04.log') SIZE 200M;3. Définissez log_archive_dest et les paramètres associés
Sur la base primaire, définissez dest_2 pour transmettre le redo à la standby. Configurez DB_UNIQUE_NAME, LOG_ARCHIVE_CONFIG (le db_unique_name des deux côtés), FAL_SERVER et STANDBY_FILE_MANAGEMENT=AUTO. Les fichiers sont ainsi créés automatiquement sur la standby.
Oracle
ALTER SYSTEM SET LOG_ARCHIVE_CONFIG='DG_CONFIG=(orcl_prim,orcl_stby)';
ALTER SYSTEM SET LOG_ARCHIVE_DEST_2='SERVICE=orcl_stby ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) DB_UNIQUE_NAME=orcl_stby';
ALTER SYSTEM SET FAL_SERVER='orcl_stby'; -- for role changes; on the standby FAL_SERVER='orcl_prim'
ALTER SYSTEM SET STANDBY_FILE_MANAGEMENT=AUTO;4. Créez la standby avec RMAN DUPLICATE FOR STANDBY
Une fois le fichier de mots de passe et le listener statique/tnsnames configurés sur le serveur standby, RMAN se connecte à la base primaire et à la standby (AUXILIARY). FROM ACTIVE DATABASE copie via le réseau sans sauvegarde ; DORECOVER applique le redo.
Oracle
rman TARGET sys/password@orcl_prim AUXILIARY sys/password@orcl_stby
RUN {
DUPLICATE TARGET DATABASE FOR STANDBY FROM ACTIVE DATABASE
DORECOVER
NOFILENAMECHECK;
}5. Démarrez l'application du redo (MRP) et vérifiez
Démarrez le managed recovery pendant que la standby est à l'état MOUNT ; utilisez USING CURRENT LOGFILE pour le real-time apply. Vérifiez avec v$managed_standby que le processus d'application (MRP0) tourne.
Oracle
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE USING CURRENT LOGFILE DISCONNECT FROM SESSION;
SELECT process, status, sequence# FROM v$managed_standby WHERE process LIKE 'MRP%';6. Activez Data Guard Broker
Le broker centralise la configuration et réduit le failover/switchover à une seule commande. Définissez DG_BROKER_START=TRUE sur les deux instances, puis créez et activez la configuration avec dgmgrl. En 12c+, le broker gère le transport du redo : si LOG_ARCHIVE_DEST_2 a été défini manuellement, ADD DATABASE échoue avec ORA-16698 ; videz-le d'abord avec ALTER SYSTEM SET LOG_ARCHIVE_DEST_2=''.
Oracle
ALTER SYSTEM SET DG_BROKER_START=TRUE;
-- In dgmgrl:
CREATE CONFIGURATION dgconf AS PRIMARY DATABASE IS orcl_prim CONNECT IDENTIFIER IS orcl_prim;
ADD DATABASE orcl_stby AS CONNECT IDENTIFIER IS orcl_stby;
ENABLE CONFIGURATION;7. Surveillez l'écart de synchronisation et terminez les tests
L'écart de séquence entre la base primaire et la standby doit être surveillé en continu ; un écart croissant indique un goulet réseau/d'application. dgmgrl SHOW CONFIGURATION doit afficher 'SUCCESS'. Testez éventuellement un changement de rôle avec un switchover.
Oracle
-- dgmgrl (SHOW DATABASE shows the Transport Lag / Apply Lag values):
SHOW CONFIGURATION;
SHOW DATABASE orcl_stby;
-- SQL (standby): SELECT name, value FROM v$dataguard_stats WHERE name LIKE '%lag';