Duplication par RMAN avec changement de SID, et de chemin des fichiers.
Un script bash DUPLIQUER_ORASRC_ORADST.sh automatisant la procédure ci-dessous est joint à cette page
Etape 1: Passer notre base en mode "ARCHIVELOG"
lancer l'utilitaire SQL+ en tapant sqlplus / nolog
SQL> Connect / as sysdba (attention, il faut etre en local pour executer cette commande)
SQL> SHUTDOWN IMMEDIATE;
SQL> STARTUP MOUNT;
SQL> ALTER DATABASE ARCHIVELOG;
SQL> ALTER DATABASE OPEN;
Etape 2: Effectuer une sauvegarde complète de la base.
Dans le cas, ou nous avons plusieurs bases sur notre machine, nous positionnons la variable d'environnement sur la base à dupliquer.
EXPORT ORACLE_SID=ORADB
Nous pouvons maintenant appeler l'utilitaire RMAN
RMAN> CONNECT TARGET /
RMAN> BAKCUP FULL DATABASE PLUS ARCHIVELOG DELETE ALL INPUT;
Etape 3: Créer l'arborescence pour accueillir la base clonée.
ex: /ORACLE/PRODUCT/10.2.0/admin/ORADB pour les répertoires pfile,udump,bdump,...
et /ORACLE/PRODUCT/10.2.0/ORADATA/ORADB pour les fichiers de données, redo, ....
Si nous voulons que la nouvelle base s'appelle DUP, il faut alors créer une arborescence du type
/ORACLE/PRODUCT/10.2.0/admin/DUP et créer les différents répertoires comme pour ORADB
et également créer /ORACLE/PRODUCT/10.2.0/ORADATA/DUP à vide.
Etape 4: Créer un fichier init.ora pour la base DUP.
Pour cela, nous allons tout simplement copier le init.ora (qui peut avoir un autre nom) qui se trouve dans /ORACLE/PRODUCT/10.2.0/admin/ORADB/pfile dans /ORACLE/PRODUCT/10.2.0/admin/DUP/pfile.
Par sécurité, le regénérer avec les derniers paramètres en cours par :
SQL> CREATE PFILE='/ORACLE/PRODUCT/10.2.0/admin/pfile/initORADB.ora' FROM SPFILE;
Pour simplifier, si ce n'est pas le cas, renommez-le initDUP.ora
Il va maintenant falloir éditer ce fichier init.ora pour remplacer ORADB par DUP partout dans le fichier (emplacement de fichier, nom de base), utiliser la fonction "rechercher & remplacer" de votre éditeur pour être sur de ne pas en oublier.
Cela n'est cependant pas suffisant, nous allons ajouter à la fin de notre fichier init.ora fraîchement modifié les deux lignes suivantes:
db_file_name_convert=('/ORACLE/PRODUCT/10.2.0/ORADATA/ORADB','/ORACLE/PRODUCT/10.2.0/ORADATA/DUP')
log_file_name_convert=('/ORACLE/PRODUCT/10.2.0/ORADATA/ORADB','/ORACLE/PRODUCT/10.2.0/ORADATA/DUP')
instance_name='DUP'
Note : ATTENTION à la casse, surtout sous unix ! En cas d'erreur, si on modifie des paramètres dans l'init.ora, penser à arrêter/redémarrer la base DUP pour les prendre en compte !
A TESTER : Si DUP existe déjà, on initialise simplement DB_FILE_NAME_CONVERT via alter system, directement dans le SPFILE ?
ATTENTION : Modifier également le cas échéant les paramètres relatifs à la mémoire (SGA & PGA) afin de ne pas utiliser la totalité de la RAM disponible sur votre serveur.
Etape 5 : Créer une nouvelle instance, si elle ne l'est pas déjà.
Par la méthode (manuelle, graphique) qui convient.
Etape 6: Démarrer l'instance créée.
Vérifier dans le TNSNAMES.ORA que les 2 bases sont bien déclarées, nous en aurons besoin pour RMAN.
Nous allons démarrer l'instance DUP en mode nomount et indiquer le fichier ora à utiliser pour lancer l'intance.
EXPORT ORACLE_SID=DUP
sqlplus / nolog
SQL> CONNECT / AS SYSDBA
SQL> STARTUP NOMOUNT pfile='/ORACLE/PRODUCT/10.2.0/admin/pfile/initDUP.ora';
SQL> QUIT
Etape 7: Clonage de la base ORADB
SUPPRIMER les fichiers de données existants dans le répertoire ORADATA de la bsae DUP, ils pourraient entrer en conflit avec les fichiers que RMAN va dupliquer.
EXPORT ORACLE_SID=DUP
rman target sys/oracle@ORADB auxiliary /
RMAN> DUPLICATE TARGET DATABASE TO DUP
pfile=/ORACLE/PRODUCT/10.2.0/admin/pfile/initDUP.ora
logfile
'/ORACLE/PRODUCT/10.2.0/ORADATA/redo01.dbf' size 50m,
'/ORACLE/PRODUCT/10.2.0/ORADATA/redo02.dbf' size 50m,
'/ORACLE/PRODUCT/10.2.0/ORADATA/redo01.dbf' size 50m;
Un message :
RMAN-05001: auxiliary filename '%s' conflicts with a file used by the target database
indique une erreur dans les paramètres *_file_name_convert. Vérifier les chemins et la casse.
Il suffit d'attendre un peu, et finalement la duplication se termine, connectez vous alors à DUP et vérifiez que vos users, schémas sont bien présents.
Recréer le spfile :
SQL>CREATE SPFILE FROM PFILE='/ORACLE/PRODUCT/10.2.0/admin/pfile/initDUP.ora';
Tester ce SPFILE en arrêtant/redémarrant la base :
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
Nous n'avons plus besoin des paramètres *_file_name_convert.
SQL>ALTER SYSTEM RESET db_file_name_convert SCOPE=SPFILE SID='*';
SQL>ALTER SYSTEM RESET log_file_name_convert SCOPE=SPFILE SID='*';
Si vous avez passé votre base en ARCHIVELOG pour effectuer ces opérations, vous pouvez la repasser en mode NOARCHIVELOG. Pour cela rien de plus simple.