Dupliquer une base Oracle avec RMAN

Très souvent, vous aurez besoin de dupliquer une base existante et ce pour diverses raisons : création d’environnements différents (Production, Pré-production, Développement, etc…), création d’une base identique pour effectuer vos tests, base de Standby sur laquelle vous êtes prêt à basculer, etc…

Vous avez la solution du dump, export sur la source, import sur la cible, mais vous vous rendrez compte très rapidement que dès que l’on a des volumétrie assez conséquente, cette solution n’est plus du tout adaptée (charge, durée, etc…).

Mais soyez rassurés, Oracle pense à nous. L’outil de sauvegarde Recovery Manager, RMAN, vous propose une fonctionnalité particulièrement intéressante : DUPLICATE.

Chacun son chemin

La commande DUPLICATE de l’outil RMAN peut s’utiliser de deux façons principales :

  • La première méthode consiste à effectuer une sauvegarde de la base source, de la transférer sur le serveur hébergeant la base cible, et de lancer la commande duplicate. Cette méthode fonctionne pour les bases 9i, 10g et 11g.
  • La deuxième méthode quand à elle ne nécessite pas de backup de la base source. Lorsque vous lancez la commande DUPLICATE sur la base cible, RMAN va effectuer sa sauvegarde, la transférer et l’importer directement via le réseau. Cette méthode ne fonctionne qu’avec les bases en 11g.

Sans backup (Active Database Duplication)

L’environnement : Nous avons une base existante nommée ISEC sur notre serveur ESXI-OEL5-ORA01 que nous voulons dupliquer sur notre serveur ESXI-OEL5-ORA02 en la nommant ISECDUP.

Sur la base source, nous allons générer le fichier de paramètre afin de le transférer sur notre serveur cible :

SYS@ISEC> create pfile='/home/oracle/initISECDUP.ora' from spfile;

On le modifie pour changer toutes les occurrences du SID (ISEC -> ISECDUP).

vim initISECDUP.ora
:%s/ISEC/ISECDUP/g

On transfère notre fichier sur le serveur cible :

scp /home/oracle/initISECDUP.ora ESXI-OEL5-ORA02:/home/oracle/initISECDUP.ora

Sur notre serveur cible (ESXI-OEL5-ORA02), nous allons créer l’architecture qui va accueillir les fichiers de notre nouvelle base. Voici un exemple pour mon cas :

$ mkdir /oradata/ISECDUP/ctl01
$ mkdir /oradata/ISECDUP/ctl02
$ mkdir /oradata/ISECDUP/log01
$ mkdir /oradata/ISECDUP/log02
$ mkdir /oradata/ISECDUP/dbf

On va maintenant démarrer l’instance de notre nouvelle base ISECDUP :

export ORACLE_SID=ISECDUP
sqlplus / AS SYSDBA
SYS@ISECDUP> startup nomount pfile='/home/oracle/initISECDUP.ora'

Comme notre base cible est en NOMOUNT, nous devons l’enregistrer de façon statique dans notre listener.ora :

$ vi $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
  (SID_LIST =
    (SID_DESC =
      (SID_NAME = ISECDUP)
      (ORACLE_HOME = /app/oracle/product/11.2.0/dbhome_1)
    )
  )

Sur les deux serveurs, source et cible, vous devez créer un TNSNAMES pointant vers la base cible. Dans notre cas nous avons ça :

$ vi $ORACLE_HOME/network/admin/tnsnames.ora
ISECDUP =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = ESXI-OEL5-ORA02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = ISECDUP)
    )
  )

Enfin, toujours sur les deux serveurs, vous devez autoriser les connexion SYSDBA à distance et créer un fichier de mot de passe pour chaque base.

  • Paramètre instance à modifier : remote_login_passwordfile (EXCLUSIVE ou SHARED)
  • Création du fichier de mot de passe : orapwd file=orapwISEC password=tropsecure

Voilà tout est prêt, on va pouvoir commencer à dupliquer notre base !
Pour cela, démarrez RMAN sur le serveur cible :

$ rman TARGET sys/tropsecure@ISEC AUXILIARY sys/tropsecure2@ISECDUP

La chaîne de connexion TARGET représente la base SOURCE, et la chaîne AUXILIARY c’est pour la base CIBLE.
Et pour finir, exécuter la fameuse commande DUPLICATE :

rman> DUPLICATE TARGET DATABASE TO ISECDUP FROM ACTIVE DATABASE;

Résultat :

Starting Duplicate Db at 10-OCT-11
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=19 device type=DISK

...

database opened
Finished Duplicate Db at 10-OCT-11

Via un backup local de la source (Backup-Based Duplication)

L’environnement : Nous avons une base existante nommée ISEC sur notre serveur ESXI-OEL5-ORA01 que nous voulons dupliquer sur notre serveur ESXI-OEL5-ORA02 en la nommant ISECDUP.

Sur la base source, nous allons générer le fichier de paramètre afin de le transférer sur notre serveur cible :

SYS@ISEC> create pfile='/home/oracle/initISECDUP.ora' from spfile;

On le modifie pour changer toutes les occurrences du SID (ISEC -> ISECDUP).

vim initISECDUP.ora
:%s/ISEC/ISECDUP/g

En plus des paramètres classiques, nous allons en rajouter deux qui vont être utilisés par Oracle pour placer au bon endroits nos fichiers de données et nos logs :

DB_FILE_NAME_CONVERT=(ISEC,ISECDUP)
LOG_FILE_NAME_CONVERT=(ISEC,ISECDUP)

On transfère notre fichier de paramètre sur le serveur cible :

scp /home/oracle/initISECDUP.ora ESXI-OEL5-ORA02:/home/oracle/initISECDUP.ora

Deuxième étape, nous allons générer la sauvegarde RMAN qui va être utilisée pour la duplication :

$ rman target /
rman> backup database plus archivelog;

Et on transfère nos sauvegardes sur le serveur cible :

$ scp /orasave/ISEC/rman/* ESXI-OEL5-ORA02:/orasave/ISECDUP/rman

Dernière étape à effectuer sur le serveur source, vérifier que la connexion SYSDBA à distance est activée et créer un fichier de mot de passe :

  • Paramètre instance à modifier : remote_login_passwordfile (EXCLUSIVE ou SHARED)
  • Création du fichier de mot de passe : orapwd file=orapwISEC password=tropsecure

Passons à présent sur le serveur cible (ESXI-OEL5-ORA02). Nous allons créer l’architecture qui va accueillir les fichiers de notre nouvelle base. Voici un exemple pour mon cas :

$ mkdir /oradata/ISECDUP/ctl01
$ mkdir /oradata/ISECDUP/ctl02
$ mkdir /oradata/ISECDUP/log01
$ mkdir /oradata/ISECDUP/log02
$ mkdir /oradata/ISECDUP/dbf

On va maintenant démarrer l’instance de notre nouvelle base ISECDUP :

export ORACLE_SID=ISECDUP
sqlplus / AS SYSDBA
SYS@ISECDUP> startup nomount pfile='/home/oracle/initISECDUP.ora'

Voilà tout est prêt on va pouvoir lancer la duplication :

$ rman TARGET sys/tropsecure@ISEC AUXILIARY /
DUPLICATE DATABASE TO ISECDUP BACKUP LOCATION '/orasave/ISECDUP/rman'

Conclusion

Vous êtes maintenant capable de dupliquer une base Oracle 9i, 10g et 11g de manière rapide et parfaitement fonctionnelle. Vous trouverez certainement de nombreuses applications à ça, comme par exemple créer votre propre Oracle DataGuard :)

Laisser un commentaire