Overblog
Editer l'article Suivre ce blog Administration + Créer mon blog
LAMI DBA

Articles autour des SGBD Oracle, SQL Server & PostgreSQL

RMAN 11G : Duplicate from Active Database RAC to Single

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 !

Partager cet article
Repost0
Pour être informé des derniers articles, inscrivez vous :
Commenter cet article
L
Et hop encore un article de Bat Man ;)... Va vraiment falloir que je m'y colle... je commence à prendre un sérieux retard ;)
Répondre