Vous êtes sur la page 1sur 25

Oracle 11g - Dataguard

Ecole INSTA – Paris

http://www.insta.fr/site/

IN STA – Paris  h tt p :// w w w .i n st a

Document et projet réalisé le 29/07/2011 par

Candy Scordia

Dataguard Oracle 11g R2 Kubuntu 11.04 – 64 bits

Téléchargement de Oracle 11g R2 pour linux

http://www.oracle.com/technetwork/database/enterprise-edition/downloads/index.html

Installation de la base de données

http://blog.arkzoyd.com/2011/05/installer-oracle-112-sur-ubuntu-1104.html

Création d'une base de données à l'aide de l'outil DBCA

Cette commande se lance dans un terminal

root$ xhost +

root$ su – oracle (connexion au compte oracle)

oracle$ dbca

A la douzième étape, demander de générer un script et non de créer la base

Se placer dans le répertoire où a été généré le script et exécuter

oracle$ cd /u01/app/oracle/admin/nombase/scripts

oracle$ ./nombase.sh

Il vous est demandé de taper les mots de passe pour les comptes Oracle principaux

Laisser tourner le script jusqu'à la fin

Dataguard Oracle 11g R2 Kubuntu 11.04 – 64 bits

Variables d'environnements ( /home/oracle/.bash_profile )

TMP=/tmp; export TMP

TMPDIR=$TMP; export TMPDIR

ORACLE_HOSTNAME=scordiac-SATELLITE-U500; export ORACLE_HOSTNAME

ORACLE_UNQNAME=INSTA; export ORACLE_UNQNAME

ORACLE_BASE=/u01/app/oracle; export ORACLE_BASE

ORACLE_HOME=$ORACLE_BASE/product/11.2.0/db_1; export ORACLE_HOME

ORACLE_SID=INSTA; export ORACLE_SID

ORACLE_DBS=$ORACLE_HOME/dbs; export ORACLE_DBS

ORACLE_TRACE=$ORACLE_BASE/diag/rdbms; export ORACLE_TRACE

ORACLE_DATA=$ORACLE_BASE/oradata; export ORACLE_DATA

DISPLAY=:0; export DISPLAY

TNS_ADMIN=$ORACLE_HOME/network/admin; export TNS_ADMIN

NLS_LANG=FRENCH_FRANCE.UTF8; export NLS_LANG

PATH=/usr/sbin:$PATH; export PATH

PATH=$ORACLE_HOME/bin:$PATH; export PATH

LD_LIBRARY_PATH=$ORACLE_HOME/lib:/lib:/usr/lib; export LD_LIBRARY_PATH

CLASSPATH=$ORACLE_HOME/jlib:$ORACLE_HOME/rdbms/jlib; export CLASSPATH

Création d'une base de secours physique sur le même ordinateur

SOMMAIRE

=> ConfigurationdeOracleNet(servicesréseaux)

Listener.ora

Tnsnames.ora

Configuration

De la base de données principale (primaire)

De la base de données de secours (standby)

Création de la base de secours à partir de la base principale

Oracle Net

Base de données Listener 1 client serveur tnsnames.ora Base de données 2
Base de
données
Listener
1
client
serveur
tnsnames.ora
Base de
données
2

Le client demande de se connecter à une base de dones. Oracle vérifie que la chaîne de connexion est située dans le fichier tnsnames.ora.

Le fichier tnsnames.ora définit les bases de données autorisées à accéder par l'utilisateur.

Le service listener écoute les demandes et renvoie la requête du client sur l'instance autorisée demanée par le client.

Le listener crée un processus serveur qui va faire la relation entre la base de données et le client.

Configuration du listener

SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (SID_NAME = INSTA) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

)

(SID_DESC = (SID_NAME = INSTADG) (ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)

)

)

LISTENER = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = scordiac-SATELLITE-U500) (PORT = 1521)

)

)

(HOST = scordiac-SA T E L LI TE-U50 0) (PORT = 1 52 1) ) )
(HOST = scordiac-SA T E L LI TE-U50 0) (PORT = 1 52 1) ) )

Définitions des instances situées sur le serveur

Configuration réseau

Utilisation du protocole TCP

Nom de la machine ou adresse IP

Port utilisé

Configuration du tnsname

INSTAPRI = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = scordiac-SATELLITE-U500) (PORT = 1521)

)

(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INSTA)

)

)

INSTADGLOC = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP) (HOST = scordiac-SATELLITE-U500) (PORT = 1521)

)

(CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = INSTADG)

)

)

Configuration du service Correspondant à la base primaire INSTAPRI = nom du service SERVICE_NAME =
Configuration du service
Correspondant à la base primaire
INSTAPRI = nom du service
SERVICE_NAME = nom de l'instance
Configuration du service Correspondant à la base de secours INSTADGLOC = nom du service SERVICE_NAME
Configuration du service
Correspondant à la base de secours
INSTADGLOC = nom du service
SERVICE_NAME = nom de l'instance

Démarrage du listener

oracle@scordiac-SATELLITE-U500:~$ lsnrctl

LSNRCTL> START (commande pour démarrer le listener, STOP pour l'arrêter et RELOAD pour le recharger)

Lancement de /u01/app/oracle/product/11.2.0/db_1/bin/tnslsnr: Veuillez patienter TNSLSNR for Linux: Version 11.2.0.1.0 - Production Le fichier de paramètres système est /u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora Messages de journalisation écrits dans /u01/app/oracle/diag/tnslsnr/scordiac-SATELLITE-U500/listener/alert/log.xml

Ecoute sur : (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scordiac-SATELLITE-U500)(PORT=1521))) Connexion à (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=scordiac-SATELLITE-U500)(PORT=1521))) STATUT du PROCESSUS D'ECOUTE

------------------------

Alias Version Date de départ Due d'activité Niveau de trace Sécurité SNMP

LISTENER TNSLSNR for Linux: Version 11.2.0.1.0 - Production 28-JUIL.-2011 10:08:10 0 jours 0 heures 0 min. 0 sec off ON: Local OS Authentication OFF

Fichier de paramètres du processus d'écoute Fichier journal du processus d'écoute Récapitulatif d'écoute des points d'extrémité

/u01/app/oracle/product/11.2.0/db_1/network/admin/listener.ora

/u01/app/oracle/diag/tnslsnr/scordiac-SATELLITE-U500/listener/alert/log.xml

(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=scordiac-SATELLITE-U500)(PORT=1521)))

Récapitulatif services

Le service "INSTA" comporte 1 instance(s). L'instance "INSTA", statut UNKNOWN, comporte 1 gestionnaire(s) pour ce service

Le service "INSTADG" comporte 1 instance(s). L'instance "INSTADG", statut UNKNOWN, comporte 1 gestionnaire(s) pour ce service

La commande a réussi

Création d'une

sur

le base de secours physique

même ordinateur

SOMMAIRE

Configuration de Oracle Net (services réseaux)

Listener.ora

Tnsnames.ora

=> Configuration

De la base de données principale (primaire)

De la base de données de secours (standby)

Création de la base de secours à partir de la base principale

Configuration de la base Primaire

Dans le répertoire ”dbs” situé dans $ORACLE_HOME :

- copier le fichier initINSTATemp.ora (sitdans le répertoire ”scripts”)

- le renommer en initINSTA.ora

- initialiser des paramètres en les ajoutant dans ce fichier :

control_files='/u01/app/oracle/oradata/INSTA/control01.ctl','/u01/app/oracle/flash_recovery_area/INSTA/control02.ctl'

db_unique_name = INSTA instance_name='INSTA'

FAL_Client='INSTAPRI'

FAL_Server='INSTADGLOC'

Log_archive_format='INSTA_%t_%s_%r.arc'

Log_archive_config='DG_CONFIG=(INSTA,INSTADG)'

Log_archive_dest_1='Location=/u01/app/oracle/oradata/INSTA/backup VALID_FOR=(ALL_LOGFILES,ALL_ROLES) db_unique_name=INSTA'

Log_archive_dest_2='Service=INSTADGLOC LGWR ASYNC VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE) db_unique_name=INSTADG delay=1'

Log_archive_dest_state_1='ENABLE'

Log_archive_dest_state_2='ENABLE'

log_file_name_convert='/u01/app/oracle/oradara/INSTADG','/u01/app/oracle/oradata/INSTA'

db_file_name_convert='/u01/app/oracle/oradara/INSTADG','/u01/app/oracle/oradata/INSTA'

remote_login_passwordfile='EXCLUSIVE'

Standby_File_Management='auto'

Configuration de la base Standby

dupliquer le fichier initINSTA.ora au même endroit en l'appelant initINSTADG.ora

remplacer le terme INSTA par INSTADG et inversement

inverser les termes INSTAPRI et INSTADGLOC qui correspondent aux services (tnsnames.ora)

le répertoire /u01/app/oracle/admin contient un sous répertoire INSTA

dupliquer cette arborescence en INSTADG sans les fichiers

Création d'une

sur

le base de secours physique

même ordinateur

SOMMAIRE

Configuration de Oracle Net (services réseaux)

Listener.ora

Tnsnames.ora

Configuration

De la base de données principale (primaire)

De la base de données de secours (standby)

=> Créationdelabasedesecoursàpartirdelabaseprincipale

Création de la base Standby (1)

Démarrer l'instance de la base primaire : $ORACLE_SID=INSTA

SQLPLUS /nolog

SQL> connect / as sysdba

SQL> STARTUP nomount ;

Monter la base de données

SQL> ALTER DATABASE MOUNT ;

Mettre la base de données en FORCE LOGGING et ARCHIVELOG

SQL> ALTER DATABASE FORCE LOGGING ;

Forcer la journalisation dans les fichiers redo logs

SQL> ALTER DATABASE ARCHIVELOG ;

Sert à activer le mode archive

Ouvrir la base de dones primaire

SQL> ALTER DATABASE OPEN ;

Archiver le redo log courant et activer le suivant

SQL> ALTER SYSTEM SWITCH LOGFILE ;

Création du fichier de contrôle pour la base standby depuis la primaire

SQL> ALTER DATABASE CREATE STANDBY CONTROLFILE AS '$ORACLE_BASE/oradata/INSTADG/controldg01.ctl' ;

Création de la base Standby (2)

Arrêter la base primaire

SQL> SHUTDOWN IMMEDIATE

Copier à froid les fichiers de données (.dbf) et les redos logs (.log) de la base primaire

/u01/app/oracle/oradata/INSTA

dans le répertoire (à créer) de la base secondaire

/u01/app/oracle/oradara/INSTADG

Copier le fichier de contrôle fraîchement créé dans le répertoire ci-dessus (si celui-ci à été cé à un autre endroit) et le dupliquer en controldg02.ctl dans le répertoire :

/u01/app/oracle/flash_recovery_area/INSTADG

ce répertoire est une duplication du répertoire

/u01/app/oracle/flash_recovery_area/INSTA

avec suppression du fichier de contrôle control02.ctl

Retourner sur sqlplus et créer le fichier d'initialisation automatique spfile à partir du fichier pfile (initINSTA.ora)

SQL> CREATE SPFILE FROM PFILE;

/!\ l'instance ne doit pas être démarrée

De même pour le spfileINSTADG.ora avec le pfile initINSTADG.ora

Création de la base Standby (3)

SQL> CREATE SPFILE='$ORACLE_HOME/dbs/spfileINSTADG.ora' FROM PFILE='$ORACLE_HOME/dbs/initINSTADG.ora' ;

Ouvrir un troisième terminal (la première étant pour le démarrage du listener et la deuxième pour l'ouverture de la base primaire)

Modifier les variables d'environnement pour se placer sur l'instance de la base de secours (standby)

Export ORACLE_SID=INSTADG

Export ORACLE_UNQNAME=INSTADG

Se connecter à sqlplus

Sqlplus /nolog

SQL> connect / as sysdba

Démarrer l'instance

SQL> STARTUP NOMOUNT ;

Monter la base en standby

SQL> ALTER DATABASE MOUNT STANDBY DATABASE

Création de la base Standby (4)

Renommer les fichiers de données et les redo logs pour qu'ils pointent vers le répertoire INSTADG et non INSTA (dans le fichier de contrôle)

Placer les commandes ci-dessous dans un fichier .sql et l'exécuter dans sqlplus via la commande '@' ou 'start'

SQL> @ /home/oracle/renamefile.sql ;

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/redo02.log' TO

'/u01/app/oracle/oradata/INSTADG/redo02.log';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/system01.dbf' TO

'/u01/app/oracle/oradata/INSTADG/system01.dbf';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/undotbs01.dbf' TO

'/u01/app/oracle/oradata/INSTADG/undotbs01.dbf';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/redo01.log' TO

'/u01/app/oracle/oradata/INSTADG/redo01.log';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/redo03.log' TO

'/u01/app/oracle/oradata/INSTADG/redo03.log';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/sysaux01.dbf' TO

'/u01/app/oracle/oradata/INSTADG/sysaux01.dbf';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/temp01.dbf' TO

'/u01/app/oracle/oradata/INSTADG/temp01.dbf';

ALTER DATABASE RENAME FILE '/u01/app/oracle/oradata/INSTA/users01.dbf' TO

'/u01/app/oracle/oradata/INSTADG/users01.dbf'

Création de la base Standby (5)

Appliquer les changements effectués dans la base primaire sur la base de secours

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION ;

Vérifier, dans le fichier d'alerte de la base de secours (standby), si la commande ci- dessus s'est déroulée avec succès

/u01/app/oracle/diag/rdbms/instadg/INSTADG/trace/alter_INSTADG.log

Entre temps on peut créer une table dans la base primaire et vérifier que le ”recover” a terminé d'appliquer les changements

Ensuite il faut annuler (arrêter) la récupération des dones via la commande

SQL> ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL ;

/!\ attention, ne pas utiliser le terme FINISH au lieu de CANCEL, c'est du failover et ça signifie que la base standby est prête à être montée en tant que base primaire

Ouvrir la base en lecture seule

SQL> ALTER DATABASE OPEN READ ONLY ;

Vérifier que la table crée dans la base primaire se situe bien dans la base secondaire

SQL> DESC nouvelleTable

Effecuter un switchover

SOMMAIRE

=> finitionduswitchover

Etapes de réalisation du switchover

Le switchover

Action qui consiste à transformer la base de données primaire en base de secours (standby) et inversement

Opération planifiée et généralement utilisée lors d'une maintenance serveur

Attention, il est important de passer la base primaire en standby avant de passer la standby en primaire

Attention à ne pas utiliser de produres failover en faisant du switchover

ALTER DATABASE RECOVER MANAGED STANDBY DATABASE FINISH ;

ALTER DATABASE ACTIVATE STANDBY DATABASE ;

Effecuter un switchover

SOMMAIRE

Définition du switchover

=> Etapes de réalisation du switchover

Etape 1 : Récupérer les données sur la base de secours

Nous partons du principe que les bases de données (primaires et standby) sont ouvertes

Il faut obligatoirement récupérer les changements effectués sur la base primaire et les appliquer à la base de secours :

SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION; Base de données modifiée.

SQL>ALTER DATABASE RECOVER MANAGED STANDBY DATABASE CANCEL; Base de données modifiée.

Une fois cette opération terminée, on peut faire passer la base de données primaire en base de secours

Etape 2 : Passage de la base primaire en base de secours

On vérifie d'abord que la base primaire est prête à passer en base de secours

SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE; Le switchover_status est à TO_STANDBY.

Si le statut est TO_STANDBY ou SESSION ACTIVE, on dit à la passer en STANDBY et on arrête la base

base qu'elle peut

SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY; Base de données modifiée. SQL>SHUTDOWN IMMEDIATE Instance ORACLE arrêtée.

Ensuite on monte la base en STANDBY

SQL>STARTUP NOMOUNT Instance ORACLE lancée. SQL>ALTER DATABASE MOUNT STANDBY DATABASE; Base de données modifiée.

Puis on change un parametre pour pouvoir passer la base de secours en base primaire

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER; Système modifié.

Etape 2 : Passage de la base de secours en base primaire

On vérifie d'abord que la base de secours est prête à passer en primaire

SQL>SELECT SWITCHOVER_STATUS FROM V$DATABASE; Le SWITCHOVER_STATUS est à SWITCHOVER PENDING.

Si le statut est correct (SWITCHOVER PENDIND) on peut la basculer en primaire et arrêter la base

SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY; Base de données modifiée.

SQL>SHUTDOWN IMMEDIATE Instance ORACLE arrêtée.

Ensuite on l'ouvre en primaire (normalement) et l'on remodifie le paramètre chanauparavant

SQL>STARTUP Instance ORACLE lancée.

SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=ENABLE; Système modifié.

Etape 2 : Vérification du switchover

On peut vérifier dans un premier temps le rôle de la base de données dans les deux bases

SQL>SELECT DATABASE_ROLE FROM V$DATABASE; Le DATABASE_ROLE est à PRIMARY.

SQL>SELECT DATABASE_ROLE FROM V$DATABASE; Le DATABASE_ROLE est à PHYSICAL STANDBY.

On peut ensuite créer une table dans la nouvelle base de données primaire

Et faire un recover dans la nouvelle base de secours pour récupérer les changements.

Si la base de secours voit la nouvelle table, celà signifie que le switchover a fonctionné.

Fin

Nous vous remercions d'avoir pris le temps de lire ce document qui explique les différentes étapes de création de la dataguard.

Vous pouvez nous contacter à cette adresse mail :

- candy.scordia@gmail.com