7 Décembre 2015
Envie de construire rapidement, sans aucune indisponibilité et avec des données fraîches une base de données SINGLE (mono instance) depuis une base cluster ? Pas de problème cet article va vous y aider !
La fonctionnalité RMAN DUPLICATE FROM ACTIVE, introduite depuis la release 11GR1, permet de mettre à disposition une base de données PRIMAIRE ou STANDBY depuis une base source, le tout ONLINE et sans aucun backup RMAN.
Bien sûr, avec un backup RMAN (DISK ou SBT) une duplication classique permet d'arriver également au même résultat, mais imaginons qu'en pleine journée un client doit absolument debugger un programme dans la base, avec des données fraîches et sans être connecté sur la PROD, et comme souvent, il ne peut pas attendre ... Alors le DuPLICATE FROM ACTIVE a tout son intérêt..
Dans cet article, nous partons d'une base Cluster. Il est clair que les opérations de DUPLICATE sont moins complexes pour une base Single, mais j'aime me faire mal...
Quelques prérequis sont à respecter pour faire en sorte que la duplication se passe correctement, sans encombre...
1 - Ajout des alias dans le tnsnames et d'un listener STATIC dédié
Sur les 2 serveurs oracle, chaque tnsnames doit avoir l'alias de la base de données source et cible (destination), et un listener STATIC dédié doit être configuré.
Voici un exemple de listener Static à ajouter dans listener.ora du serveur SOURCE :
SID_LIST_LSNR_RMAN = (SID_LIST = (SID_DESC = (GLOBAL_DBNAME = MICKDB) (ORACLE_HOME = /oracle/product/11.2.0/db) (SID_NAME = MICKDB1) ) ) LSNR_RMAN = (DESCRIPTION_LIST = (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = srv1.mydomain.com)(PORT = 1522)) ) (DESCRIPTION = (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1522)) ) )
Dans le cas d'un RAC, le listener.ora à modifier est celui du GI HOME. La modification peut uniquement être faite sur un des noeuds du cluster.
Dans cet exemple, il s'agit uniquement d'un listener temporaire, je n'ai donc pas ajouté de ressource cluster, sachant que l'ajout d'un listener sur un RAC est de type dynamique et qu'il n'est pas gagné de le configurer en STATIC, mais ceci fera l'objet d'un autre article ;-)
Activation et test du listener :
[SRV1]<oracle>/home/oracle[+ASM1]:lsnrctl start LSNR_RMAN LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 25-MAR-2015 14:17:05 Copyright (c) 1991, 2011, Oracle. All rights reserved. Starting /oracle/product/11.2.0/grid/bin/tnslsnr: please wait... TNSLSNR for Linux: Version 11.2.0.3.0 - Production System parameter file is /oracle/product/11.2.0/grid/network/admin/listener.ora Log messages written to /oracle/product/11.2.0/grid/log/diag/tnslsnr/SRV1/lsnr_rman/alert/log.xml Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv1.mydomain.com)(PORT=1522))) Listening on: (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522))) Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv1.mydomain.com)(PORT=1522))) STATUS of the LISTENER ------------------------ Alias LSNR_RMAN Version TNSLSNR for Linux: Version 11.2.0.3.0 - Production Start Date 25-MAR-2015 14:17:06 Uptime 0 days 0 hr. 0 min. 1 sec Trace Level off Security ON: Local OS Authentication SNMP OFF Listener Parameter File /oracle/product/11.2.0/grid/network/admin/listener.ora Listener Log File /oracle/product/11.2.0/grid/log/diag/tnslsnr/SRV1/lsnr_rman/alert/log.xml Listening Endpoints Summary... (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=srv1.mydomain.com)(PORT=1522))) (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1522))) Services Summary... Service "MICKDB" has 1 instance(s). Instance "MICKDB1", status UNKNOWN, has 1 handler(s) for this service... The command completed successfully [SRV1]<oracle>/home/oracle[+ASM1]:lsnrctl service LSNR_RMAN LSNRCTL for Linux: Version 11.2.0.3.0 - Production on 25-MAR-2015 14:17:23 Copyright (c) 1991, 2011, Oracle. All rights reserved. Connecting to (DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=srv1.mydomain.com)(PORT=1522))) Services Summary... Service "MICKDB" has 1 instance(s). Instance "MICKDB1", status UNKNOWN, has 1 handler(s) for this service... Handler(s): "DEDICATED" established:0 refused:0 LOCAL SERVER The command completed successfully
OK, passons à l'étape de la mise à jour du tnsnames car je pars du principe où la même chose est faite sur le serveur CIBLE, moyennant quelques adaptations bien sûr.
Un exemple d'alias SOURCE / CIBLE à ajouter dans le tnsnames.ora de chaque serveur
Dans le cas d'un RAC, le tnsnames doit être dans le DATABASE HOME et non GI HOME.
MICKDB_PRA =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = SRV2.mydomain.com)(PORT = 1521))
)
(CONNECT_DATA =
(ORACLE_SID = MICKDB)
)
)
MICKDB_PROD =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = srv1.mydomain.com)(PORT = 1522))
)
(CONNECT_DATA =
(ORACLE_SID = MICKDB1)
)
)
Sur le serveur CIBLE, tester un tnsping et une connexion directe pour valider le bon fonctionnement du listener dédié et éviter toutes surprises :
[SRV2]<oracle>/home/oracle[MICKDB]:tnsping MICKDB_PROD TNS Ping Utility for Linux: Version 11.2.0.3.0 - Production on 25-MARS -2015 15:54:22 Copyright (c) 1997, 2011, Oracle. All rights reserved. Fichiers de paramètres utilisés : Adaptateur TNSNAMES utilisé pour la résolution de l'alias Tentative de contact de (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = srv1.mydomain.com)(PORT = 1522))) (CONNECT_DATA = (ORACLE_SID = MICKDB1))) OK (10 msec) [SRV2]<oracle>/home/oracle[MICKDB]:sqlplus system@MICKDB_PROD SQL*Plus: Release 11.2.0.3.0 Production on Mer. Mars 25 15:55:44 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. Entrez le mot de passe : Connecté à : Oracle Database 11g Release 11.2.0.3.0 - 64bit Production With the Real Application Clusters and Automatic Storage Management options SQL> select host_name from v$instance ; HOST_NAME ---------------------------------------------------------------- SRV1
Bien, nous pouvons maintenant passer aux étapes de configuration "pre duplication".
2 - Génération d'un fichier de password (passworfile) via OraPwd pour la base CIBLE
Afin de permettre une connexion en sysdba, un fichier de mot de passe doit être crée sur le serveur cible. Pour ce faire (je pars du principe où le fichier n'existe pas avant)
cd $ORACLE_HOME/dbs orapwd file=orapwMICKDB entries=8
Exemple :
[SRV2]<oracle>/oracle/product/11.2.0/dbs[MICKDB]:orapwd file=orapwMICKDB entries=8 Enter password for SYS: ***** [SRV2]<oracle>/oracle/product/11.2.0/dbs[MICKDB]:ls -l total 8 -rw-r--r-- 1 oracle dba 2851 15 mai 2009 init.ora -rw-r----- 1 oracle dba 2048 25 mars 14:25 orapwMICKDB
Note : Il est bien évidemment possible de faire un simple copier / coller... Merci au chef pour cette remarque…. C’est bien plus simple et sur que de faire le password file avec une erreur dans le nom, car pour que la duplication fonctionne, le nom du fichier passwordfile doit être identique sur les 2 serveurs.
3 - Configuration du fichier d'init.ora de la base CIBLE.
Un simple fichier init.ora avec comme paramètre « db_name » est suffisant. Pas besoin d’avoir d’autres paramètres, car depuis la 11g, le SPFILE ainsi que les adaptations peuvent directement être gérées depuis RMAN (et c'est d'ailleurs préconisé).
4 - Démarrage de l'instance CIBLE et connexion à RMAN :
[SRV2]<oracle>/home/oracle[MICKDB]:sqlplus / as sysdba SQL*Plus: Release 11.2.0.3.0 Production on Mer. Mars 25 15:50:34 2015 Copyright (c) 1982, 2011, Oracle. All rights reserved. Connecté à une instance inactive. SQL> startup nomount ; Instance ORACLE lancée. Total System Global Area 6664212480 bytes Fixed Size 2240944 bytes Variable Size 3456110160 bytes Database Buffers 3187671040 bytes Redo Buffers 18190336 bytes SQL> exit [SRV2]<oracle>/home/oracle[MICKDB]:rman Recovery Manager: Release 11.2.0.3.0 - Production on Mer. Mars 25 15:56:21 2015 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. RMAN> connect target sys/mypass1@MICKDB_PROD connecté à la base de données cible : MICKDB (DBID=4252297034) RMAN> connect auxiliary sys/mypass1@MICKDB_PRA connexion établie avec la base de données auxiliaire : MICKDB (non montée)
Bien, reste à préparer le bloc de commande RMAN pour dupliquer la base, et cela reste assez simple, qu'on parte d'un RAC ou d'une base single.
5 - Préparation du script RMAN :
Ma méthode de backup étant par défaut sur TAPE (sbt), j'alloue manuellement une channel de type disk (dommage pour le parallélisme, mais standard Edition oblige) , et je positionne les 2 paramètres db_file_name_convert et log_file_name_convert.
Attention dans le cas d'une duplication RAC vers SINGLE, il convient de désactiver le cluster_database=true au risque d'avoir ce type d'erreur quand le moteur Oracle du serveur CIBLE n'a pas l'option d'installée :
RMAN-05501: abandon de la duplication de la base de données cible RMAN-03015: une erreur s'est produite dans le script stocké Memory Script RMAN-04014: échec du démarrage : ORA-00439: feature not enabled: Real Application Clusters
Nota : Dans cet exemple je dois modifier certains paramètres car des emplacements diffèrent.
connect target sys/mypass1@MICKDB_PROD connect auxiliary sys/mypass1@MICKDB_PRA run { allocate channel c1 device type disk; allocate auxiliary channel d1 device type disk; DUPLICATE DATABASE TO MICKDB FROM ACTIVE DATABASE SPFILE set audit_file_dest='/oracle/admin/MICKDB/adump' set cluster_database='false' set diagnostic_dest='/oracle/admin/MICKDB/diag' set db_create_file_dest='/oradata/MICKDB' set log_archive_dest='/oradata/MICKDB/arch' set remote_listener='' set undo_tablespace='UNDOTBS1' set db_file_name_convert='+DATA/MICKDB/datafile','/oradata/MICKDB','+DATA/MICKDB/tempfile','/oradata/MICKDB' set log_file_name_convert='+DATA/MICKDB/onlinelog','/oradata/MICKDB' set control_files='/oradata/MICKDB/controlfile/cntrl01.ctl'; }
Le bloc ci-dessus peut encore être adapté, car nous aurions pu simplement nous passer de la partie "configuration init.ora" car le spfile peut être directement généré depuis RMAN, qui peut être accompagné de modification de paramètres via l'option "parameter value convert" :
Exemple :
run { allocate channel c1 device type disk; DUPLICATE DATABASE TO MICKDB FROM ACTIVE DATABASE SPFILE parameter_value_convert 'MICKDB1','MICKDB' set cluster_database='false' set db_file_name_convert='+DATA','/oradata/MICKDB' set log_file_name_convert='+DATA','/oradata/MICKDB'; }
6 - GO !
Une fois toutes ces petites étapes terminées, le script RMAN peut être lancé.
Nota : Par sécurité et par expérience, je lance toujours une duplication depuis la CIBLE, et non pas depuis le serveur SOURCE.
J'ai volontairement mis la log en fichier joint, vu la verbosité de la chose ..
RMAN> run { allocate channel c1 device type disk; allocate auxiliary channel d1 device type disk; DUPLICATE DATABASE TO MICKDB FROM ACTIVE DATABASE SPFILE set audit_file_dest='/oracle/admin/MICKDB/adump' set cluster_database='false' set diagnostic_dest='/oracle/admin/MICKDB/diag' set db_create_file_dest='/oradata/MICKDB' set log_archive_dest='/oradata/MICKDB/arch' set remote_listener='' set undo_tablespace='UNDOTBS1' set db_file_name_convert='+DATA/MICKDB/datafile','/oradata/MICKDB','+DATA/MICKDB/tempfile','/oradata/MICKDB' set log_file_name_convert='+DATA/MICKDB/onlinelog','/oradata/MICKDB' set control_files='/oradata/MICKDB/controlfile/cntrl01.ctl'; }
Et voila, une petite base dupliquée avec un minima d'effort !
Enjoy !