DBAtlas · Atlas d'exploitation des bases de données

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';
Ouvrir dans DBAtlas →