Oracle 11g - Dataguard
Ecole INSTA – Paris
http://www .insta.fr/site/
!
!
Document et projet réalisé Candy Scordia
le 29/07/2011 par
!
!
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
=> Configuration de Oracle Net (services réseaux)
!
Listener.ora Tnsnames.ora
!
!
Configuration
!
De la De la
base base
de données principale (primaire) de données de secours (standby)
!
!
Création de la base de secours à partir de la base principale
!
Oracle Net
Base de données
1
Base de données
2
Le client demande de se connecter à une base de données.
de connexion est située dans le fichier tnsnames.ora. Oracle vérifie que la chaîne 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.
client tnsnames.ora
Listener serveur
Configuration
SID_LIST_LISTENER = (SID_LIST =
(SID_DESC =
(SID_NAME = INSTA)
du listener
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1)
Définitions des
instances situées sur le serveur
)
(SID_DESC =
(SID_NAME = INSTADG)
(ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1) )
)
Configuration réseau LISTENER =
(DESCRIPTION_LIST = (DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
Utilisation du protocole TCP
Nom de la machine ou adresse IP
(HOST (PORT =
= scordiac-SATELLITE-U500) 1521)
) Port utilisé
) )
Configuration du tnsname
INSTAPRI =
(DESCRIPTION = (ADDRESS =
(PROTOCOL = TCP)
(HOST = scordiac-SATELLITE-U500) (PORT = 1521)
) (CONNECT_DATA =
(SERVER = DEDICATED) (SERVICE_NAME = INSTA) )
)
Configuration du service
Correspondant à la base primaire INSTAPRI = nom du service
SERVICE_NAME = nom de l'instance
INSTADGLOC = (DESCRIPTION =
(ADDRESS =
(PROTOCOL = TCP)
(HOST = scordiac-SATELLITE-U500) (PORT = 1521)
)
(CONNECT_DATA = (SERVER = DEDICATED)
(SERVICE_NAME = INSTADG) )
)
Configuration du service
Correspondant à la base de secours INSTADGLOC = nom du service
SERVICE_NAME = nom de l'instance
Démarrage
oracle@scordiac-SATELLITE-U500:~$ lsnrctl
du listener
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 Durée 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 /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 Récapitulatif d'écoute des points d'extrémité...
(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 De la
base base
de données principale (primaire) 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 (situé dans 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éation de la base de secours à partir de la base principale
!
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 données 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é créé à 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 données 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
=> Définition du switchover
!
Etapes de réalisation du switchover
!
Le switchover
Action qui consiste à transformer la base de données
secours (standby) et inversement primaire en base de
!
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 procédures 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
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PHYSICAL STANDBY;
Base de données modifiée.
SQL>SHUTDOWN IMMEDIATE Instance ORACLE arrêtée.
base qu'elle peut
!
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 primaire
SQL>ALTER SYSTEM SET LOG_ARCHIVE_DEST_STATE_2=DEFER;
Système modifié.
en base
!
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 arrêter la base
SQL>ALTER DATABASE COMMIT TO SWITCHOVER TO PRIMARY;
Base de données modifiée.
et
!
SQL>SHUTDOWN IMMEDIATE Instance ORACLE arrêtée.
Ensuite on l'ouvre en primaire (normalement) et l'on remodifie changé auparavant
SQL>STARTUP
Instance ORACLE lancée.
le paramètre
!
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 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.
la base de données dans les
!