Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
28 mars 2013 4 28 /03 /mars /2013 13:51

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

  • Max performance (mode par défaut)
  • Max protection
  • Max availibility

 

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.

 

 

 

 

 

Partager cet article
Repost0

commentaires

E
<br /> Salutations,<br /> <br /> <br /> echo 'DB_NAME=FEMME2' > $ORACLE_HOME/dbs/initFEMME2.ora<br /> Ca devrait être FEMME1 ?<br /> <br /> <br /> Best<br />
Répondre
D
<br /> Hello,<br /> <br /> <br /> bien, bien ces histoires de femme1, 2, 3, 4...lol<br /> <br /> <br /> Par contre pour ne pas embrouiller les esprits comme le mien, eh oui, tu m'as fait douter, precises que les SRL en mode MaxPerf dans ton exemple ne sont pas nécessaires, mais uniquement en mode<br /> MaxProtec et MaxAvail...<br /> <br /> <br /> @Plus<br />
Répondre
L
<br /> <br /> Hello;<br /> <br /> <br /> Merci ! En fait, j'ai prévu d'ércrire encore quelques articles sur le changement de mode, et les snaphot. Je profiterai de ces articles pour préciser le rôle des SRL.<br /> <br /> <br />  <br /> <br /> <br /> @+<br /> <br /> <br /> <br />