# Duplication par RMAN avec changement de SID, et de chemin des fichiers.

<p class="callout success">Un script bash DUPLIQUER\_ORASRC\_ORADST.sh automatisant la procédure ci-dessous est joint à cette page</p>

##### Etape 1: Passer notre base en mode "ARCHIVELOG"

lancer l'utilitaire SQL+ en tapant sqlplus / nolog

```SQL
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.

```shell
EXPORT ORACLE_SID=ORADB
```

Nous pouvons maintenant appeler l'utilitaire RMAN

```SQL
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
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 &amp; 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:

<p class="callout info">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'</p>

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 &amp; 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.

```shell
EXPORT ORACLE_SID=DUP
sqlplus / nolog
```

```shell
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.

```shell
EXPORT ORACLE_SID=DUP
rman target sys/oracle@ORADB  auxiliary /
```

```SQL
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;
```

<p class="callout warning">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.</p>

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
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
SQL> SHUTDOWN IMMEDIATE
SQL> STARTUP
```

Nous n'avons plus besoin des paramètres \*\_file\_name\_convert.

```SQL
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.