En Mars, l'ami-dba maintient le rythme.
http://www.lami-dba.com/2018/02/dataguard-resolve-gap-revover-from-service.html
Aimez, partagez, critiquez & inscrivez vous à la newsletter.
@+
LAO
En Mars, l'ami-dba maintient le rythme.
http://www.lami-dba.com/2018/02/dataguard-resolve-gap-revover-from-service.html
Aimez, partagez, critiquez & inscrivez vous à la newsletter.
@+
LAO
Hello,
Dans les précedents articles nous avons vu comment créer une standby physique et également comment faire un switchover. Nous allons maintenant parler de Dataguard Active et comment l'activer.
Bien que je vieillise, j'en suis pas encore à radoter, alors je vous invite à lire un article qui présente ce qu'est Dataguard Active : Oracle 11g & Dataguard Active
Alors juste pour remettre le contexte, le but est de pouvoir disposer de la standby en lecture seule sans stopper le mécanisme d'application des transactions entre la primaire & la standby.
Avant de commencer réellement, nous allons créer un petit schema de test.
sqlplus system/*****@femme1 SQL> create user test identified by test; Utilisateur cree. SQL> grant connect,resource to test; Autorisation de privileges (GRANT) acceptee. SQL> alter user test default tablespace users; Utilisateur modifie. SQL> alter user test quota unlimited on users; Utilisateur modifie. SQL> connect test/test Connecte. SQL> create table ma_table (i number) tablespace users; SQL> insert into ma_table values (4); 1 ligne creee. SQL> commit; Validation effectuee.
Histoire de ... vérifions que notre dataguard mis en place la dernière fois fonctionne toujours...
dgmgrl sys/*****@FEMME1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme1 - Primary database femme2 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS DGMGRL> exit
Maintenant démarrons notre base standby en lecture seule.
sqlplus sys/*****@femme2 as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 7 17:54:51 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter database open read only; Base de donnees modifiee. SQL> connect test/test@femme2 Connecte. SQL> select count(*) from ma_table; COUNT(*) ---------- 1
Pas de surprise, ma base s'ouvre et ma table crée sur ma base primaire est présente avec une ligne. Depuis la primaire, nous allons insérer de nouvelles lignes.
sqlplus test/test@femme1 SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 7 18:00:55 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> insert into ma_table values (8); 1 ligne creee. SQL> insert into ma_table values (9); 1 ligne creee. SQL> commit; Validation effectuee.
sqlplus test/test@femme2 SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 7 18:02:45 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select count(*) from ma_table; COUNT(*) ---------- 3
Petite surprise... je vois les deux lignes que je viens d’insérer sur la primaire alors que pourtant ma base secondaire est en lecture seule !!!! Génial ! me direz vous car finalement c'est cela le Dataguard Active.
Pas faux ! sauf que si vous avez relu l'article qui présente le Dataguard Active, il ne vous a pas échappé que ca n'était pas gratuit.... Du coup potentiellement, je peux juste activer une option payante et ca:
-1/ Sans savoir que le dataguard Active existe
-2 /Je sais que ca existe, mais pas forcement que c'est une option payante.
C'est Oracle qui sera content au prochain audit de licences....
Depuis le broker, nous allons stopper la mise à jour de la standby
dgmgrl sys/*****@FEMME1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> edit database femme2 set state ='APPLY-OFF'; Succeeded.
Ajoutons des lignes à ma table sur la primaire
sqlplus test/test@femme1 SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 7 18:19:28 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> insert into ma_table select * from ma_table; 3 ligne(s) creee(s). SQL> commit; Validation effectuee. SQL> select count(*) from ma_table; COUNT(*) ---------- 6
sqlplus test/test@femme2 SQL*Plus: Release 11.2.0.1.0 Production on Sun Apr 7 18:22:36 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select count(*) from ma_table; COUNT(*) ---------- 3
Tout se passe comme prévu, je ne vois pas les nouvelles lignes... et c'est mieux ainsi si je ne dispose pas de la licence adéquate. Je peux toujours avoir ma base standby en lecture seule mais avec des données statiques. Il faut aussi tenir compte du fait que pendant tout le temps ou la base est en lecture seule, les transactions de la primaire ne sont plus appliquées. Et que cela rendra un switchover ou failover d'autant plus long.
Il nous reste plus qu'a remettre notre dataguard en dans son mode d'origine.
dgmgrl sys/****@femme2 DGMGRL> edit database 'femme2' set state ='APPLY-OFF'; Succeeded. DGMGRL> shutdown immediate; Database closed. Database dismounted. ORACLE instance shut down. DGMGRL> startup mount; ORACLE instance started. Database mounted. DGMGRL> edit database 'femme2' set state ='APPLY-ON'; Succeeded. DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme1 - Primary database femme2 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS
Peut être que je m'y suis mal pris (ca n'est pas à exclure, n’hésitez pas à me faire part de vos remarques), toujours est-il que je me suis retrouvé relativement facilement avec l'option Dataguard qui est une option payante de l'Enterprise.
Ceci étant dit, on voit bien l’intérêt du Dataguard Active. Non seulement, on dispose d'un serveur de secours (classique) mais qui peut se transformer en serveur décisionnel.
Et si finalement le cout de cette cette licence permettait de faire sauter un serveur qui sert pour du décisionnel...
@+ LAO
Hello;
Dans l'article précedent (cliquer ici), nous avons vu comment mettre en place une standby. Tout ceci est très bien. Encore faut-il que nous soyons en mesure de basculer rapidement sur notre environnement de secours. Histoire de se remettre tout en mémoire, connectons nous depuis un des deux serveurs au broker.
dgmgrl sys/manager@femme1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme1 - Primary database femme2 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS
La situation est claire, tout semble OK. Mon "FEMME1" est ma base primaire et "FEMME2" ma base de secours, le tout dans un mode de protection dut de "Max Performance".
Histoire de vérifier que tout fonctionne correctement, je vais d'abord créer un schema avec quelques données.
sqlplus system/******@femme1 SQL> create user lao identified by lao; Utilisateur cree. SQL> grant connect,resource to lao; Autorisation de privileges (GRANT) acceptee. SQL> connect lao/lao Connecte. SQL> create table test (i number); Table creee. SQL> insert into test values (5); 1 ligne creee. SQL> commit; Validation effectuee. SQL> exit
Voila, nous sommes prêt à faire ce que l'on appelle un switchover, c'est à dire que nous allons inverser les rôle entre les deux bases. "FEMME1" deviendra la primaire et "FEMME2" ma base primaire. Ce qui par exemple permettra d'effectuer une maintenance hardware sur mon serveur principal en limitant l'indisponibilité à la base.
Pour cela nous allons tout simplement nous connecter au broker et lancer l'ordre de switchover.
dgmgrl sys/******@femme1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> switchover to FEMME2;
L'opération ne dure pas très longtemps, et finalement "FEMME2" devient la base primaire.
Performing switchover NOW, please wait... New primary database "femme2" is opening... Operation requires shutdown of instance "FEMME1" on database "femme1" Shutting down instance "FEMME1"... ORA-01109: base de donnees non ouverte Database dismounted. ORACLE instance shut down. Operation requires startup of instance "FEMME1" on database "femme1" Starting instance "FEMME1"... ORACLE instance started. Database mounted. Switchover succeeded, new primary is "femme2"
On peut d'ailleurs très facilement le vérifier d'abord depuis le broker
DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme2 - Primary database femme1 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS
Mais également en se connectant à sqlplus sur mon instance FEMME2 et vérifier que mes objets créés précedemment sont toujours la.
sqlplus system/manager@FEMME2 SQL> select host_name from v$instance; HOST_NAME ---------------------------------------------------------------- londres.localdomain --> je suis bien sur mon serveur de secours SQL> select count(*) from lao.test; COUNT(*) ---------- 1 Je crée une nouvelle table. SQL> create table lao.test2 as select * from lao.test; Table creee.
Une fois ma maintenance effectuée sur mon serveur primaire (paris), il me suffit de refaire l'opération inverse.
dgmgrl sys/******@femme1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> switchover to FEMME1
De la même façon, je peux vérifier via le broker et sqlplus que tout est OK une fois le switch effectué.
DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme1 - Primary database femme2 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS
Depuis sqlplus
sqlplus system/manager@FEMME1 SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 1 17:51:29 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> select host_name from v$instance; HOST_NAME ---------------------------------------------------------------- paris.localdomain SQL> select table_name from dba_tables where owner='LAO'; TABLE_NAME ------------------------------ TEST2 TEST
Comme vous avez pu le constaté, l'opération de switchover se fait rapidement avec une simple commande. Dans un prochain article, nous verrons comment changer le mode de protection sur notre environnement et les conséquences du choix entre (max performance, max protection et max availability).
@+ LAO
Hello,
Dataguard... Simple, compliqué, les avis divergent. J'espère qu'après ce petit tuto (valable pour 11gR2 et plus) pour mettre en place une standby physique, j'aurai pu convaincre les sceptiques que la mise en place n'est pas si compliquée que cela. Pour cela, je dispose de deux VM en linux. Ma base primaire que j'ai nommé FEMME1 se trouve sur le serveur "paris" et ma base de secours "FEMME2" sera sur le serveur "londres". Avant de me traiter de sexiste ou madcho, rien ne vous empeche d'appeler vos bases "HOMME1" et "HOMME2"
Sans rentrer dans le détail (la doc Oracle fait ca très bien), l'idée de Dataguard est de pouvoir bénéficier d'une base de secours en rejouant les transactions de la base primaire sur la base dite de secours.
Pour que tout cela fonctionne, il faut que notre base primaire soit en mode Archivelog. J'ai décicdé d'utiliser la FRA (). Donc si votre base n'est pas en archive log.
export ORACLE_SID=FEMME1 sqlplus / as sysdba SQL> alter system set db_recovery_file_dest_size=20g scope=both; SQL> alter system set db_recovery_file_dest='/u01/FEMME1/FRA' scope=both; SQL> shutdown immediate; Base de donnees fermee. Base de donnees demontee. Instance ORACLE arretee. SQL> startup mount; Instance ORACLE lancee. Total System Global Area 1653518336 bytes Fixed Size 2213896 bytes Variable Size 956303352 bytes Database Buffers 687865856 bytes Redo Buffers 7135232 bytes Base de donnees montee. SQL> alter database archivelog; Base de donnees modifiee. SQL> alter database open; Base de donnees modifiee.
Ceci est nécessaire mais pas suffisant. Afin de ne pas perdre des informations entre la primaire et la base standby à cause d'opération non journalisées, nous allons également passer la base en mode "FORCE LOGGING". Vérifions que ca n'est pas déjà le cas.
SQL> select Force_logging from v$database; FOR --- NO
Et donc passons la base en "FORCE LOGGING"
SQL> alter database force logging; Base de donnees modifiee.
La confiance n'exclue pas le contrôle.
SQL> select Force_logging from v$database; FOR --- YES
Si l'on ne veut pas de mauvaises surprises au moment d'ajouter un datafile à notre base primaire il faut passer le paramètre standby_file_management à auto.
sqlplus sys/******@femme1 as sysdba SQL*Plus: Release 11.2.0.1.0 Production on Mon Apr 1 20:22:12 2013 Copyright (c) 1982, 2009, Oracle. All rights reserved. Connecte a : Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production With the Partitioning, OLAP, Data Mining and Real Application Testing options SQL> alter system set standby_file_management='auto' scope=both; Systeme modifie.
Nos deux bases primaire & standby vont être amenées à communiquer via la couche SQL NET,il convient donc de configurer le tnsnames.ora ($ORACLE_HOME/network/admin/ )et d'y inscrire deux alias (un pour la primaire et un pour la standby)
FEMME1 = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = paris.localdomain)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SID = FEMME1) ) ) FEMME2 = (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = londres.localdomain)(PORT = 1521)) ) (CONNECT_DATA = (SID = FEMME2) ) )
Lors des changements de rôles (on n'en reparlera plus tard), des arrêts / redémarrages d'instance à distance seront nécessaire, il faut donc enregistrer statiquement notre base FEMME1 dans le listener.
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = FEMME1) ) )
Ne pas oublier de recharger le listener pour la prise en compte des modifications.
lsnrctl reload
Maintenant, nous pouvons créer un fichier de mot de passe sur la primaire
orapwd file=$ORACLE_HOME/dbs/orapwFEMME1 password=******
Encore un petit effort pour les préparatifs.... Nous allons maintenant créer les SRL (Standby Redo Log). Il faut qu'ils soient au moins de la même taille que les redos et Oracle recommande d'en créer un de plus...
SQL> alter database add standby logfile '/u01/FEMME1/oradata/srl_01.log' size 50m; SQL> alter database add standby logfile '/u01/FEMME1/oradata/srl_02.log' size 50m; SQL> alter database add standby logfile '/u01/FEMME1/oradata/srl_03.log' size 50m; SQL> alter database add standby logfile '/u01/FEMME1/oradata/srl_04.log' size 50m;
Bonne nouvelle c'est terminé pour la primaire. Nous pouvons passer à la préparation de la standby en commencant par copier le fichier de password et le tnsnames.ora
scp $ORACLE_HOME/dbs/orapwFEMME1 oracle@192.168.0.24:/$ORACLE_HOME/dbs/orapwFEMME2 scp $ORACLE_HOME/network/admin/tnsnames.ora oracle@192.168.0.24:/$ORACLE_HOME/network/admin
De la même façon que effectué sur le primaire, nous allons enregistrer notre instance standby dans le listener du serveur de secours.
SID_LIST_LISTENER = (SID_LIST = (SID_DESC = (ORACLE_HOME = /home/oracle/app/oracle/product/11.2.0/dbhome_1) (SID_NAME = FEMME2) ) )
On recharge le listener sur notre serveur de secours
lsnrctl reload
enfin, on crée l’arborescence qui abritera la base standby. Dans mon cas cela donne
mkdir -p /u01/FEMME2/admin mkdir -p /u01/FEMME2/FRA mkdir -p /u01/FEMME2/oradata
il ne reste plus qu'à créer un pfile réduit à sa plus simple expression et d'enregistrer notre base dans /etc/oratab
echo 'DB_NAME=FEMME2' > $ORACLE_HOME/dbs/initFEMME2.ora echo 'FEMME2:/home/oracle/app/oracle/product/11.2.0/dbhome_1:Y' > /etc/oratab
Nous allons maintenant utiliser rman pour instancier notre base de secours.
rman Recovery Manager: Release 11.2.0.1.0 - Production on Mon Apr 1 15:28:41 2013 Copyright (c) 1982, 2009, Oracle and/or its affiliates. All rights reserved. RMAN> connect target sys/manager@femme1 connected to target database: FEMME1 (DBID=3372798706) RMAN> connect auxiliary sys/manager@femme2 connected to auxiliary database (not started) RMAN> startup clone nomount; Oracle instance started Total System Global Area 217157632 bytes Fixed Size 2211928 bytes Variable Size 159387560 bytes Database Buffers 50331648 bytes Redo Buffers 5226496 bytes RMAN>
Et c'est parti pour un petit duplicate....
RMAN> duplicate target database for standby from active database db_file_name_convert 'FEMME1','FEMME2' spfile parameter_value_convert 'FEMME1','FEMME2' set log_file_name_convert 'FEMME1','FEMME2' set db_unique_name 'FEMME2' nofilenamecheck;
Au bout d'un moment (ca depend un peu de la taille de votre base..) le duplicate doit se terminer par quelque chose dans le genre
Finished Duplicate Db at 01-APR-13
Une petite vérification rapide nous montre bien que la base est instancié et que le clonage s'est bien passé
ls -lh /u01/FEMME2/oradata/ total 2,0G -rw-r----- 1 oracle oinstall 9,3M avril 1 15:46 control01.ctl -rw-r----- 1 oracle oinstall 9,3M avril 1 15:46 control02.ctl -rw-r----- 1 oracle oinstall 51M avril 1 15:37 redo01.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 redo02.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 redo03.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 srl_01.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 srl_02.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 srl_03.log -rw-r----- 1 oracle oinstall 51M avril 1 15:37 srl_04.log -rw-r----- 1 oracle oinstall 601M avril 1 15:37 sysaux01.dbf -rw-r----- 1 oracle oinstall 701M avril 1 15:36 system01.dbf -rw-r----- 1 oracle oinstall 311M avril 1 15:37 undotbs01.dbf -rw-r----- 1 oracle oinstall 5,1M avril 1 15:37 users01.dbf ps -ef |grep pmon oracle 24124 1 0 15:34 ? 00:00:00 ora_pmon_FEMME2
Ceci étant fait, nous allons maintenant créer notre configuration dataguard et pour cela nous allons utiliser le "broker". Encore faut-il le démarrer sur les deux instances (primaire et standby)
sqlplus sys/*****@FEMME1 as sysdba alter system set dg_broker_start=true scope=both; exit; sqlplus sys/*****@FEMME2 as sysdba alter system set dg_broker_start=true scope=both; exit;
Un dernier effort, il nous reste à créer la configuration et de l'activer. Tout ceci se fera depuis l'utilitaire dgmgrl en quelques lignes de commandes. Avec deux bases qui s'appellent FEMME1 et FEMME2 j'ai décidé d'appeler ma configuration "plaisir"
dgmgrl sys/******@femme1 DGMGRL for Linux: Version 11.2.0.1.0 - 64bit Production Copyright (c) 2000, 2009, Oracle. All rights reserved. Welcome to DGMGRL, type "help" for information. Connected. DGMGRL> create configuration plaisir as primary database is FEMME1 connect identifier is FEMME1; Configuration "plaisir" created with primary database "femme1" DGMGRL>
Il ne reste plus qu'à ajouter notre femme (eh, je voulais dire base) de secours et à activer la configuration.
DGMGRL> add database FEMME2 as connect identifier is FEMME2 maintained as physical; Database "femme2" added DGMGRL> enable configuration Enabled.
Il est tout à fait possible de vérifier l'état de la configuration.
DGMGRL> show configuration Configuration - plaisir Protection Mode: MaxPerformance Databases: femme1 - Primary database femme2 - Physical standby database Fast-Start Failover: DISABLED Configuration Status: SUCCESS
En 11.2 arrive un nouveau paramètre "StaticConnectIdentifier", qui est destiné au broker et qui sera utilisé pour les startup / shutdown des instances.
DGMGRL> edit database femme1 set property StaticConnectIdentifier='FEMME1'; Property "staticconnectidentifier" updated DGMGRL> edit database femme2 set property StaticConnectIdentifier='FEMME2'; Property "staticconnectidentifier" updated DGMGRL>
Et voila ! une belle standby en place prête à vous rendre service en cas d'indisponibilité de votre base primaire. Quelques remarques :
Remarque 1: Dataguard implique la version Enterprise d'Oracle. Dataguard Active implique la version Enterprise + une option payante !
Remarque 2: L'installation que je viens de faire est sous linux, mais la même chose serait valable sous windows. Il faudrait évidemment créer le service sur la standby avec oradim et faire attention aux chemins et nom de fichier pour le fichier de mot de passe
Remarque 3: Par fainéantise, j'ai copié le tnsnames.ora depuis la primaire, mais si votre serveur de secours a déjà une configuration, il faut modifier le tnsnames.ora plutot que de l'écraser avec celui de la base primaire.
Remarque 4: Afin de connaitre les nouveautés du broker en 11gR2, un petit tour du coté de la doc Oracle (http://docs.oracle.com/cd/E14072_01/server.112/e10702/whatsnew.htm)
J'espère que cet article vous aura permis de créer votre standby assez rapidement et sans trop de problème. Un prochain article (qui arrivera rapidement) parlera du changement de rôle des base, et également du mode de configuration du votre dataguard. Pour rappel, il existe trois mode
Remarque 5: J'ai choisi l'option pour ma standby d'avoir une instance de nom différente, et j'ai adapté les repertoires en conséquence. Dans la mesure ou je suis sur un serveur différent pour la standby, le choix d'une même instance et surtout d'une arboresence aurait été possible, voir plus simple....
@bientôt;
LAO.
Remarque : Nouvel article, création d'une standby en 11g R2 avec broker : cliquer ici.
Bonjour,
Nous allons plonger dans le vif du sujet, et effectuer la mise en place d'une architecture Dataguard pas à pas constituée d'une base primaire et d'une base "physical standby".
Pour créer cet environnement dataguard, il me faut donc deux machines (physques ou virtuelles).
La base principale (DB1) sera crée sur une machine XP (ORA1) et ma base de secours (DB2 ) se trouvera également sur une machine XP (ORA2).
Mon ORACLE_HOME pour les deux machines sera E:\oracle\product\10.2.0\db_1.
La version utilisée est une 10.2.0.4.
Sur les deux machines un listener écoutant sur le port 1521 à été crée.
Afin de permettre à qui le voudra d'effectuer la mise en place de ce type d'environnement dataguard, je vais inclure (une dernière fois) dans l'article la création de la base DB1.
Création d'une base oracle:
Préparation des répertoires:
MKDIR E:\oracle\product\10.2.0\oradata\DB1
MKDIR E:\oracle\product\10.2.0\admin\DB1\bdump
MKDIR E:\oracle\product\10.2.0\admin\DB1\cdump
MKDIR E:\oracle\product\10.2.0\admin\DB1\pfile
MKDIR E:\oracle\product\10.2.0\admin\DB1\udump
MKDIR E:\oracle\product\10.2.0\arch\DB1
Création de l'instance
ORADIM -new -sid DB1
Création d'un fichier pfile (init.ora) à placer dans E:\oracle\product\10.2.0\admin\DB1\pfile
##############################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
##############################################################################
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_file_multiblock_read_count=16
###########################################
# File Configuration
###########################################
control_files=("E:\oracle\product\10.2.0\ORADATA\DB1\control01.ctl")
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=E:\oracle\product\10.2.0\admin\DB1\bdump
core_dump_dest=E:\oracle\product\10.2.0\admin\DB1\cdump
user_dump_dest=E:\oracle\product\10.2.0\admin\DB1\udump
###########################################
# Miscellaneous
###########################################
compatible=10.2.0.1.0
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Database Identification
###########################################
db_domain=""
db_name=DB1
db_unique_name=DB1
###########################################
# SGA Memory
###########################################
sga_target=256M
###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1
###########################################
# Shared Server
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=DB1XDB)"
###########################################
# Security and Auditing
###########################################
audit_file_dest=E:\oracle\product\10.2.0\admin\DB1\adump
remote_login_passwordfile=EXCLUSIVE
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=20M
Remarque : Afin de devoir éviter de spécifier le chemin de pfile pour un démarrage de la base, on peut ajouter la ligne suivante dans le fichier E:\oracle\product\10.2.0\db_1\database\initDB1.ora (fichier à créer)
ifile=e:\oracle\product\10.2.0\admin\DB1\pfile\init.ora
Démarage de l'instance
SQLPLUS /nolog
CONNECT / as sysdba
STARTUP NOMOUNT;
Création de la base.
Create DATABASE DB1
USER SYS IDENTIFIED BY oracle
USER SYSTEM IDENTIFIED BY oracle
MAXDATAFILES 200
MAXINSTANCES 1
CHARACTER SET AL32UTF8
NATIONAL CHARACTER SET UTF8
LOGFILE
GROUP 1 ('E:\oracle\product\10.2.0\oradata\DB1\redo01.rdo') SIZE 50M,
GROUP 2 ('E:\oracle\product\10.2.0\oradata\DB1\redo02.rdo') SIZE 50M,
GROUP 3 ('E:\oracle\product\10.2.0\oradata\DB1\redo03.rdo') SIZE 50M
MAXLOGFILES 20
MAXLOGMEMBERS 5
NOARCHIVELOG
EXTENT MANAGEMENT LOCAL
DATAFILE 'E:\oracle\product\10.2.0\oradata\DB1\system.dbf' SIZE 512M
SYSAUX DATAFILE 'E:\oracle\product\10.2.0\oradata\DB1\sysaux.dbf' SIZE 512M
DEFAULT TEMPORARY TABLESPACE TEMP
TEMPFILE 'E:\oracle\product\10.2.0\oradata\DB1\temp.dbf' SIZE 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
UNDO TABLESPACE UNDOTBS1
DATAFILE 'E:\oracle\product\10.2.0\oradata\DB1\UNDOTBS1.dbf' SIZE 20M;
Passage des script catalog.sql et catproc.sql
@?\rdbms\admin\catalog.sql
@?\rdbms\admin\catproc.sql
Et voila à partir de maintenant nous disposons donc d'une base de données DB1. Cela signifie t'il qu'elle est prête à servir de base primaire dans un environnement DATAGUARD ?
La réponse est non, mais il n'y a cependant pas énormément de manipulations pour rendre cela possible:
-1/ Passer la base en FORCE LOGGING.
SET ORACLE_SID=DB1
SQLPLUS /nolog
CONNECT / AS SYSDBA
STARTUP;
ALTER DATABASE FORCE LOGGING;
-2/ Creation de SRL (Standby Redo Logs)
ALTER DATABASE ADD STANDBY LOGFILE GROUP 4 'E:\oracle\product\10.2.0\oradata\DB1\lgf01.log' SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 5 'E:\oracle\product\10.2.0\oradata\DB1\lgf02.log' SIZE 50M;
ALTER DATABASE ADD STANDBY LOGFILE GROUP 6 'E:\oracle\product\10.2.0\oradata\DB1\lgf03.log' SIZE 50M;
Remarque : J'ai crée autant de SRL qu'il existe de fichiers REDO et bien evidemment avec la même taille.
-3/ Passage de la base en mode ARCHIVELOG
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
ALTER DATABASE ARCHIVELOG;
-4/ Création d'un fichier CONTROLFILE spécifique à une base "standby".
Toujours en mode MOUNT.
ALTER DATABASE CREATE STANDBY CONTROLFILE AS 'C:\TEMP\CONTROL01.CTL';
SHUTDOWN IMMEDIATE;
EXIT;
-5/ Ajout de paramètres liés à l'archivelog et spéficiques à une base primaire le fichier init.ora
LOG_ARCHIVE_CONFIG='DG_CONFIG=(DB1,DB2)'
LOG_ARCHIVE_DEST_1='LOCATION=e:\oracle\product\10.2.0\arch\db1
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=DB1'
LOG_ARCHIVE_DEST_2=
'SERVICE=DB2 LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=DB2'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=5
-6/ Ajout de paramètre liés à une base de secours (lorsque la base primaire deviendra à son tour une base de secours).
fal_server=DB2
fal_client=DB1
standby_file_management=autostra
db_file_name_convert='DB2','DB1'
log_file_name_convert='DB2','DB1'
-7/ Création d'un fichier spfile
SQLPLUS /nolog
CONNECT / as sysdba
CREATE spfile FROM pfile='e:\oracle\product\10.2.0\admin\DB1\pfile\init.ora';
-8/ Création d'un fichier de mot de passe
ORAPWD file=e:\oracle\product\10.2.0\db_1\database\pwdDB1.ora password=oracle
Remarque : Afin de ne pas avoir de mauvaise surprise plus tard, vérifier que le fichier a bien été crée à l'endroit voulu.
-9/ ajout dans le tnsnames.ora d'une entrée pour pouvoir se connecter à la base de secours.
DB2 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora2)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DB2)
)
)
Notre base primaire est maintenant prête. Nous n'allons pas la démarrer, car nous devons préparer notre base de secour. Pour cela il faut dupliquer DB1 vers DB2. D'habitude, j'utilise RMAN et la commande DUPLICATE. Histoire de changer un peu, je vais cette fois utiliser une simple copie de fichier.
CD e:\oracle\Product\10.2.0\DB1\oradata
COPY lgf01.log c:\temp
COPY lgf02.log c:\temp
COPY lgf03.log c:\temp
COPY REDO01.RDO c:\temp
COPY REDO02.RDO c:\temp
COPY REDO03.RDO c:\temp
COPY SYSAUX.dbf c:\temp
COPY SYSTEM.dbf c:\temp
COPY UNDOTBS1.dbf c:\temp
Création de la base de secours.
-1/ Création de l'arborescence.
MKDIR E:\oracle\product\10.2.0\oradata\DB2
MKDIR E:\oracle\product\10.2.0\admin\DB2\bdump
MKDIR E:\oracle\product\10.2.0\admin\DB2\cdump
MKDIR E:\oracle\product\10.2.0\admin\DB2\pfile
MKDIR E:\oracle\product\10.2.0\admin\DB2\udump
MKDIR E:\oracle\product\10.2.0\arch\DB2
-2/ Création de l'instance DB2
ORADIM -new -sid DB2
-3/ Création d'un fichier d'initialisation init.ora pour DB2.
Le fichier est à placer dans E:\oracle\product\10.2.0\admin\DB2\pfile\
Comme pour l'instance primaire on peut ajouter la ligne suivante dans e:\oracle\product\10.2.0\db_1\database\initDB2.ora afin d'éviter de préciser le chemin du fichier init.ora
ifile=e:\oracle\product\10.2.0\admin\DB2\pfile\init.ora
##############################################################################
# Copyright (c) 1991, 2001, 2002 by Oracle Corporation
##############################################################################
###########################################
# Cache and I/O
###########################################
db_block_size=8192
db_file_multiblock_read_count=16
###########################################
# File Configuration
###########################################
control_files=("E:\oracle\product\10.2.0\ORADATA\DB2\control01.ctl")
###########################################
# Cursors and Library Cache
###########################################
open_cursors=300
###########################################
# Diagnostics and Statistics
###########################################
background_dump_dest=E:\oracle\product\10.2.0\admin\DB2\bdump
core_dump_dest=E:\oracle\product\10.2.0\admin\DB2\cdump
user_dump_dest=E:\oracle\product\10.2.0\admin\DB2\udump
###########################################
# Miscellaneous
###########################################
compatible=10.2.0.1.0
###########################################
# Job Queues
###########################################
job_queue_processes=10
###########################################
# Database Identification
###########################################
db_domain=""
db_name=DB1
db_unique_name=DB2
###########################################
# SGA Memory
###########################################
sga_target=256M
###########################################
# Processes and Sessions
###########################################
processes=150
###########################################
# System Managed Undo and Rollback Segments
###########################################
undo_management=AUTO
undo_tablespace=UNDOTBS1
###########################################
# Shared Server
###########################################
dispatchers="(PROTOCOL=TCP) (SERVICE=DB2XDB)"
###########################################
# Security and Auditing
###########################################
audit_file_dest=E:\oracle\product\10.2.0\admin\DB2\adump
remote_login_passwordfile=EXCLUSIVE
###########################################
# Sort, Hash Joins, Bitmap Indexes
###########################################
pga_aggregate_target=20M
###########################################
#
###########################################
LOG_ARCHIVE_CONFIG='DG_CONFIG=(DB1,DB2)'
LOG_ARCHIVE_DEST_1=
LOCATION=E:\oracle\product\10.2.0\arch\db2
VALID_FOR=(ALL_LOGFILES,ALL_ROLES)
DB_UNIQUE_NAME=DB2'
LOG_ARCHIVE_DEST_2=
'SERVICE=DB1 LGWR ASYNC
VALID_FOR=(ONLINE_LOGFILES,PRIMARY_ROLE)
DB_UNIQUE_NAME=DB1'
LOG_ARCHIVE_DEST_STATE_1=ENABLE
LOG_ARCHIVE_DEST_STATE_2=ENABLE
REMOTE_LOGIN_PASSWORDFILE=EXCLUSIVE
LOG_ARCHIVE_FORMAT=%t_%s_%r.arc
LOG_ARCHIVE_MAX_PROCESSES=30
# Standby role parameters
*.fal_server=DB1
*.fal_client=DB2
*.standby_file_management=auto
*.db_file_name_convert=('DB1','DB2')
*.log_file_name_convert=('DB1','DB2')
-4/ Copie des fichiers de bases de données de DB1 ainsi que du fichier CONTROLFILE crée pour une base standby.
CD Z:\ (Z étant le montage d'un lecteur logique sur \\ORA1\c$\temp
COPY * e:\oracle\product\10.2.0\oradata\DB2
-5/ Création d'un fichier de mot de passe
ORAPWD file=e:\oracle\product\10.2.0\db_1\database\pwdDB2.ora password=oracle
-6/ création d'un fichier spfile.
SQLPLUS /nolog
CONNECT / as sysdba
CREATE spfile FROM pfile='e:\oracle\product\10.2.0\admin\DB2\pfile\init.ora';
-7/ ajout dans le tnsnames.ora d'une entrée pour pouvoir se connecter à DB1
DB1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = ora1)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = DB1)
)
)
On commence à voir la fin de la mise en place de notre architecture dataguard.
Il ne nous reste plus qu'a démarrer tout ca:
Démarrage de la base de secours (sur ORA2)
SET ORACLE_SID=DB2
SQLPLUS /nolog
CONNECT / as sysdba
STARTUP MOUNT;
ALTER DATABASE RECOVER MANAGED STANDBY DATABASE DISCONNECT FROM SESSION;
Démarrage de la base primaire (sur ORA1)
SET ORACLE_SID=DB1
SQLPLUS /nolog
CONNECT / as sysdba
STARTUP;
Et voila,la mise en place de notre architetecture DATAGUARD incluant une base primaire et une base de secours est en place et prêt à fonctionner... Mais nous verrons cela dans un prochain article.
Mais pour ne pas rester sur notre faim, et s'assurer que tout (ou presque) fonctionne, je vous propose de vous connecter sur la base primaire et de créer par exemple un tablespace.
CREATE TABLESPACE my_tbs
DATAFILE 'e:\oracle\product\10.2.0\oradata\DB1\my_tbs01.dbf' size 20M
EXTENT MANAGEMENT LOCAL UNIFORM SIZE 1M
SEGMENT SPACE MANAGEMENT AUTO;
Histoire de générer un petit fichier d'archive log, continuons avec l'instruction suivante:
ALTER SYSTEM SWITCH LOGFILE;
Et alors si tout s'est bien passé, non seulement le tablespace my_tbs est crée sur la base primaire, mais si vous allez dans le répertoire oradata de votre base de secours, vous allez également voir l'apparition du fichier my_tbs01.dbf
Si jamais ce n'est pas le cas, je vous invite à aller jeter un oeil dans les fichier alert.log de vos bases primaire et standby afin de voir ce qui cloche...
Globalement, si vous suivez bien les instructions pas à pas, et que vous disposez déjà des machines virtuelles windows, la mise en place de l'architecture dataguard devrait mettre moins d'une heure.
Dans les prochains articles portant sur l'environnement Dataguard, je reviendrai un peu plus en détail sur les différents paramètres et leur rôle.
LAO.