Skip to main content

HA niveau 3 - Standby DataGuard database sur 11g Enterprise Edition

La création d'un base Standby en Enterprise Edition est à peu près identique à celle sur une base Standard Edition, à ceci prêt que c'est une option payante... Et qu'on peut activer la réplication automatique, contrairement à la version gratuite SE.

Contexte :

Primary database :
Host: ocm1.odlabs.net
DB_NAME = PRITST
DB_UNIQUE_NAME=PRITST

Standby database :
Host: ocm2.odlabs.net
DB_NAME = PRITST
DB_UNIQUE_NAME = STDBYTST

Préparation de la réplication

Préparation de la base primaire

Vérifier que la base primaire est bien démarrée et configurée ! Puis effectuer les actions suivantes sur la base primaire pour qu’elle soit capable de communiquer et d’échanger avec la base standby.

Activez la force logging

[ocm1.odlabs.net]$ sqlplus / as sysdba
SQL> alter database force logging;           

Ajoutez les standby logfiles

Doubler les REDO LOGS par des STANDBY REDO LOGS de taille identiques, mais créer un groupe de plus que les REDO standards :

SQL> select group#, thread#, bytes/1024/1024 from v$log;
SQL> alter database add standby logfile '/u01/app/oracle/oradata/pritst/stby_redo01.log' size 50M;
SQL> alter database add standby logfile '/u01/app/oracle/oradata/pritst/stby_redo02.log' size 50M;
SQL> alter database add standby logfile '/u01/app/oracle/oradata/pritst/stby_redo03.log' size 50M;
SQL> alter database add standby logfile '/u01/app/oracle/oradata/pritst/stby_redo04.log' size 50M;

Paramètre log_archive_config

Ce paramètre est permet d’activer la fonctionnalité de la data Guard, il accepte en argument les db_unique_name de base primaire et secondaire (standby) :

SQL> alter system set log_archive_config='dg_config=(pritst,stbytst)';

Paramètre log_archive_dest_2

SQL> alter system set log_archive_dest_2='service=OEMR_STBY LGWR async valid_for=(online_logfiles,primary_role) db_unique_name=stbytst';

Paramètre standby_file_management

Ce paramètre apporte automatiquement les modifications  sur la base de secours lorsqu’un fichier de données a été ajouté ou supprimé sur la base primaire (fal_server), il permet aussi à la base primaire d’être prête à changer le rôle primaire à standby et vice-et-versa.

SQL> alter system set standby_file_management = AUTO scope=both ;

Paramètre REMOTE_LOGIN_PASSWORDFILE

Vérifiez  que le paramètre REMOTE_LOGIN_PASSWORDFILE est positionné à la valeur EXCLUSIVE. Sinon exécuter cette commande :

SQL> alter system set remote_login_passwordfile=exclusive scope=spfile;

Activez l’archivage

SQL> archive log list ;

-- S'il n'est pas "Enabled" :
SQL> shutdown immediate
SQL> startup mount
SQL> alter database archivelog;
SQL> alter database open;

Ajouter une entrée pour la base standby dans le tnsnames.ora du serveur primaire

STDBYTST=
  (DESCRIPTION =
    (ADDRESS_LIST =
      (ADDRESS = (PROTOCOL = TCP)(HOST = ocm2.odlabs.net)(PORT = 1521))
    )
    (CONNECT_DATA =
      (SERVICE_NAME = PRITST)
    )
  )

Tester :

[ocm1.odlabs.net]$ tnsping STDBYTST

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm2.odlabs.net)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICTED) (SERVICE_NAME = STDBYST)))

OK (20 msec)

Copier le tnsnames.ora et le fichier passwd vers la base standby

[ocm1.odlabs.net]$ scp orapwpritst oracle@ocm2.odlabs.net:/u01/app/oracle/product/db/11.2.0.3/dbs/

Préparation de la base de secours (standby)

Sur ce serveur on a juste installé le software Oracle 11gR2 et on a que le fichier mot de passe et le tnsnames.ora copiés de la base primaire.

Création de listener dans $ORACLE_HOME/network/admin

LISTENER =
  (ADDRESS_LIST=
       (ADDRESS=(PROTOCOL=tcp)(HOST=ocm2.odlabs.net)(PORT=1521)))
  )
ADR_BASE_LISTENER = /u01/app/oracle
INBOUND_CONNECT_TIMEOUT_LISTENER=120
DIAG_ADR_ENABLED_LISTENER=OFF
SUBSCRIBE_FOR_NODE_DOWN_EVENT_LISTENER=OFF

# Enregistrement statique auprès de Listener (l’enregistrement dynamique laisse la base inaccessible pendant un certain, d’où la nécessité de forcer l'enregistrement statique)
SID_LIST_LISTENER =
    (SID_LIST =
        (SID_DESC =
            (GLOBAL_NAME = STDBYTST)
            (ORACLE_HOME = /u01/app/oracle/product/db/11.2.0.3/)
            (SID_NAME = PRITST)
        )
    )

Tester le bon fonctionnement de tnsnames.ora

[ocm2.odlabs.net]$ tnsping STDBYTST

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm2.odlabs.net)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICTED) (SERVICE_NAME = STDBYTST)))

OK (0 msec)

[ocm2.odlabs.net]$ tnsping PRITST

Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = ocm1.odlabs.net)(PORT = 1521))) (CONNECT_DATA = (SERVICE_NAME = PRITST)))

OK (10 msec)

Création des répertoires de données et d’archivage (la structure physique qui va accueillir la base de données)

(A adapter selon l'arborescence du serveur primaire)

[ocm2.odlabs.net]$ mkdir -p /data01/ORADATA/pritst
[ocm2.odlabs.net]$ mkdir -p /archlog_primaire/ORADATA/pritst
[ocm2.odlabs.net]$ cd /u01/app/oracle/admin
[ocm2.odlabs.net]$ mkdir pritst; cd pritst
[ocm2.odlabs.net]$ mkdir pfile adump bdump cdump udump

Création du fichier d'initialisation init.ora pour la base standby

[ocm2.odlabs.net]$ cd $ORACLE_HOME/dbs
[ocm2.odlabs.net]$ echo DB_NAME=pritst> initpritst.ora

Lancer la base de données en mode nomount

[ocm2.odlabs.net]$ su - oracle
[ocm2.odlabs.net]$ sqlplus sys/Passw0rd@STDBYTST as sysdba

SQL> startup nomount pfile='initpritst.ora' ;

Duplication de la base de production par RMAN

Préparation du script RMAN duplicate duplicate_pritst.rman

run {
allocate auxiliary channel stdbytst type disk;
allocate channel pritst_1 device type disk;
allocate channel pritst_2 device type disk;
allocate channel pritst_3 device type disk;
allocate channel pritst_4 device type disk;
duplicate target database for standby from active database NOFILENAMECHECK
spfile
set control_files='/data01/ORADATA/pritst/control01.ctl','/data01/ORADATA/pritst/control02.ctl',
'/data01/ORADATA/pritst/control03.ctl'
set db_unique_name='STDBYTST'
set audit_file_dest='/u01/app/oracle/admin/pritst/adump'
set db_domain=''
set diagnostic_dest='/u01/app/oracle'
set log_archive_max_processes='5'
set fal_client='STDBYTST'
set fal_server='PRITST'
set standby_file_management='AUTO'
set log_archive_config='dg_config=(PRITST,STDBYTST)'
set log_archive_dest_2='service=RMAP LGWR ASYNC valid_for=(ONLINE_LOGFILE,PRIMARY_ROLE) DB_UNIQUE_NAME=PRITST'
 ;
}

Lancer la duplication

[ocm2.odlabs.net]$ rman target sys/Passw0rd@PRITST auxiliary sys/Passw0rd@STDBYTST

RMAN>@duplicate_pritst.rman

Activation de la réplication

Actions sur la base standby 

Démarrage du processus Redo Apply

[ocm2.odlabs.net]$ sqlplus sys/Passw0rd@STDBYTST as sysdba

SQL> alter database recover managed standby database using current logfile disconnect from session;
SQL> select sequence#,first_time,applied from v$archived_log order by 1;
SEQUENCE# FIRST_TI APPLIED
---------- -------- ---------
      1446 07/02/13 YES
      1447 07/02/13 YES

Vérifier le status de la base standby

SQL> select open_mode,database_role from v$database;
OPEN_MODE            DATABASE_ROLE
-------------------- ----------------
MOUNTED              PHYSICAL STANDBY

Tester l'application des archives sur la standby

Sur la base primaire :

[ocm1.odlabs.net]$ sqlplus / as sysdba

SQL> ALTER SYSTEM SWITCH LOGFILE;
SQL> ALTER SYSTEM SWITCH LOGFILE;

Sur la base standby, vérifier que 2 nouvelles archives ont été appliquées :

 [ocm2.odlabs.net]$ sqlplus / as sysdba

SQL> SELECT SEQUENCE#, FIRST_TIME, NEXT_TIME, APPLIED FROM V$ARCHIVED_LOG ORDER BY SEQUENCE#;

Post Installation

Le choix du mode de protection

Il y a trois modes de protection de données :

  1. Maximum Availability
  2. Maximum Performance
  3. Maximum Protection

Chaque mode nécessite une configuration particulière pour sa mise en œuvre.
https://docs.oracle.com/database/121/SBYDB/protection.htm#SBYDB02000