Oracle 11g Release 2, RMAN DUPLICATE sans se connecter à la "Target"

Comme avec chaque nouvelle version, RMAN 11.2 vient avec son lot de nouvelles fonctionnalités : j’ai testé la commande DUPLICATE sans se connecter à la base de données source (TARGET). Devinez !

  • c’est simplissime,
  • ça permet de régler ce qui peut-être un vrai casse-tête, c’est à dire quand le répertoire qui stocke la sauvegarde ne peut pas facilement avoir le même nom sur le serveur source et le serveur du clone,
  • ça évite d’écrire des configurations réseaux compliquées avec des enregistrements statiques des instances dans les listeners ou encore
  • ça permet de faire un DUPLICATE sans utiliser de fichier de mot de passe (passwordfile) ni utiliser aucun autre mot de passe que celui du DBA en vous connectant uniquement « / as sysdba ».

En 1 mot, j’adore ! Mais faisons de la technique…

La sauvegarde

Pas de magie, si vous ne vous vous connectez pas à la base de données source, il n’est pas possible de faire un duplicate « FROM ACTIVE DATABASE ». Il faudra donc commencer par effectuer une sauvegarde de votre base de données source sur disque. Rien de vraiment nouveau de ce côté; procédez comme bon vous semble. Voici un exemple, qui n’a rien de magistral:

CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/u01/app/backup/BLACK/%U';
BACKUP AS COMPRESSED BACKUPSET DATABASE PLUS ARCHIVELOG;
BACKUP AS COMPRESSED BACKUPSET CURRENT CONTROLFILE;
exit;

Démarrer une instance pour la base de données clone

Si vous lancez la commande DUPLICATE sur un autre serveur, vous devez vous débrouiller pour que la sauvegarde soit accessible de ce serveur. Cela dit, cette méthode a un intérêt même depuis le même serveur: C’est probablement la méthode la plus simple pour effectuer un DUPLICATE, ça permet de mettre en œuvre un test, d’avoir des scripts consistants pour plusieurs cas et ça évite de gérer des mots de passe.
La seconde chose dont vous avez besoin, c’est d’une instance. La section ci-dessous illustre comment créer une instance sous Linux. Vous noterez que depuis Oracle 11.1, vous n’avez plus besoin que d’un unique paramètre, le db_name :

cd $ORACLE_HOME/dbs
echo "db_name=WHITE" > initWHITE.ora
echo "WHITE:$ORACLE_HOME:N" >> /etc/oratab
. oraenv
WHITE
sqlplus / as sysdba
startup nomount

Exécuter le DUPLICATE

La base de données originale n’est pas créée avec Oracle Managed Files (OMF) ; les chemins des fichiers ne sont pas générés automatiquement et basés sur le db_unique_name. Dans ce cas, il faut utiliser les paramètres de conversion des répertoires des fichiers de données et de redolog à savoir db_file_name_convert, log_file_name_convert et control_files. Avec une base en OMF (et donc ASM), ces informations ne sont pas utiles :

mkdir -p /u01/app/oracle/oradata/WHITE
rman auxiliary /
DUPLICATE DATABASE TO WHITE
  SPFILE
    SET CONTROL_FILES '/u01/app/oracle/oradata/WHITE/controlfile01.ctl'
    SET DB_FILE_NAME_CONVERT 'BLACK','WHITE'
    SET LOG_FILE_NAME_CONVERT 'BLACK','WHITE'
  BACKUP LOCATION '/u01/app/backup/BLACK'
  NOFILENAMECHECK;

Et voilà, un peu de patience et la base de données est clonée sans problème, tout est automatique :

Recovery Manager: Release 11.2.0.1.0 - Production on Wed Sep 2 23:16:10 2009
Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.
connected to auxiliary database: WHITE (not mounted)
RMAN> DUPLICATE DATABASE TO WHITE
  SPFILE
    SET CONTROL_FILES '/u01/app/oracle/oradata/WHITE/controlfile01.ctl'
    SET DB_FILE_NAME_CONVERT 'BLACK','WHITE'
    SET LOG_FILE_NAME_CONVERT 'BLACK','WHITE'
  BACKUP LOCATION '/u01/app/backup/BLACK'
  NOFILENAMECHECK;2> 3> 4> 5> 6> 7>
Starting Duplicate Db at 02-SEP-09
contents of Memory Script:
{
   restore clone spfile to  '/u01/app/oracle/product/11.2.0/db_1/dbs/spfileWHITE.ora' from
 '/u01/app/backup/BLACK/03ko93ld_1_1';
   sql clone "alter system set spfile= ''/u01/app/oracle/product/11.2.0/db_1/dbs/spfileWHITE.ora''";
}
executing Memory Script
Starting restore at 02-SEP-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=96 device type=DISK
channel ORA_AUX_DISK_1: restoring spfile from AUTOBACKUP /u01/app/backup/BLACK/03ko93ld_1_1
channel ORA_AUX_DISK_1: SPFILE restore from AUTOBACKUP complete
Finished restore at 02-SEP-09
sql statement: alter system set spfile= ''/u01/app/oracle/product/11.2.0/db_1/dbs/spfileWHITE.ora''
contents of Memory Script:
{
   sql clone "alter system set  db_name =
 ''WHITE'' comment=
 ''duplicate'' scope=spfile";
   sql clone "alter system set  CONTROL_FILES =
 ''/u01/app/oracle/oradata/WHITE/controlfile01.ctl'' comment=
 '''' scope=spfile";
   sql clone "alter system set  db_file_name_convert =
 ''BLACK'', ''WHITE'' comment=
 '''' scope=spfile";
   sql clone "alter system set  LOG_FILE_NAME_CONVERT =
 ''BLACK'', ''WHITE'' comment=
 '''' scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script
sql statement: alter system set  db_name =  ''WHITE'' comment= ''duplicate'' scope=spfile
sql statement: alter system set  CONTROL_FILES =  ''/u01/app/oracle/oradata/WHITE/controlfile01.ctl'' comment= '''' scope=spfile
sql statement: alter system set  db_file_name_convert =  ''BLACK'', ''WHITE'' comment= '''' scope=spfile
sql statement: alter system set  LOG_FILE_NAME_CONVERT =  ''BLACK'', ''WHITE'' comment= '''' scope=spfile
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area    1104814080 bytes
Fixed Size                     1335980 bytes
Variable Size                671092052 bytes
Database Buffers             419430400 bytes
Redo Buffers                  12955648 bytes
contents of Memory Script:
{
   sql clone "alter system set  db_name =
 ''BLACK'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   sql clone "alter system set  db_unique_name =
 ''WHITE'' comment=
 ''Modified by RMAN duplicate'' scope=spfile";
   shutdown clone immediate;
   startup clone force nomount
   restore clone primary controlfile from  '/u01/app/backup/BLACK/05ko93q3_1_1';
   alter clone database mount;
}
executing Memory Script
sql statement: alter system set  db_name =  ''BLACK'' comment= ''Modified by RMAN duplicate'' scope=spfile
sql statement: alter system set  db_unique_name =  ''WHITE'' comment= ''Modified by RMAN duplicate'' scope=spfile
Oracle instance shut down
Oracle instance started
Total System Global Area    1104814080 bytes
Fixed Size                     1335980 bytes
Variable Size                671092052 bytes
Database Buffers             419430400 bytes
Redo Buffers                  12955648 bytes
Starting restore at 02-SEP-09
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=134 device type=DISK
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/WHITE/controlfile01.ctl
Finished restore at 02-SEP-09
database mounted
released channel: ORA_AUX_DISK_1
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=134 device type=DISK
contents of Memory Script:
{
   set until scn  835237;
   set newname for datafile  1 to
 "/u01/app/oracle/oradata/WHITE/system01.dbf";
   set newname for datafile  2 to
 "/u01/app/oracle/oradata/WHITE/sysaux01.dbf";
   set newname for datafile  3 to
 "/u01/app/oracle/oradata/WHITE/undotbs01.dbf";
   set newname for datafile  4 to
 "/u01/app/oracle/oradata/WHITE/users01.dbf";
   set newname for datafile  5 to
 "/u01/app/oracle/oradata/WHITE/streams_tbs01.dbf";
   restore
   clone database
   ;
}
executing Memory Script
executing command: SET until clause
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
Starting restore at 02-SEP-09
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring datafile 00001 to /u01/app/oracle/oradata/WHITE/system01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/WHITE/sysaux01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/WHITE/undotbs01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/WHITE/users01.dbf
channel ORA_AUX_DISK_1: restoring datafile 00005 to /u01/app/oracle/oradata/WHITE/streams_tbs01.dbf
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/backup/BLACK/02ko93j1_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/backup/BLACK/02ko93j1_1_1 tag=TAG20090902T225737
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:01:06
Finished restore at 02-SEP-09
contents of Memory Script:
{
   switch clone datafile all;
}
executing Memory Script
datafile 1 switched to datafile copy
input datafile copy RECID=6 STAMP=696554268 file name=/u01/app/oracle/oradata/WHITE/system01.dbf
datafile 2 switched to datafile copy
input datafile copy RECID=7 STAMP=696554268 file name=/u01/app/oracle/oradata/WHITE/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=8 STAMP=696554268 file name=/u01/app/oracle/oradata/WHITE/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=9 STAMP=696554268 file name=/u01/app/oracle/oradata/WHITE/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=10 STAMP=696554268 file name=/u01/app/oracle/oradata/WHITE/streams_tbs01.dbf
contents of Memory Script:
{
   set until scn  835237;
   recover
   clone database
    delete archivelog
   ;
}
executing Memory Script
executing command: SET until clause
Starting recover at 02-SEP-09
using channel ORA_AUX_DISK_1
starting media recovery
channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=11
channel ORA_AUX_DISK_1: reading from backup piece /u01/app/backup/BLACK/04ko93lf_1_1
channel ORA_AUX_DISK_1: piece handle=/u01/app/backup/BLACK/04ko93lf_1_1 tag=TAG20090902T225855
channel ORA_AUX_DISK_1: restored backup piece 1
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
archived log file name=/u01/app/oracle/flash_recovery_area/WHITE/archivelog/2009_09_02/o1_mf_1_11_59xr7yf8_.arc thread=1 sequence=11
channel clone_default: deleting archived log(s)
archived log file name=/u01/app/oracle/flash_recovery_area/WHITE/archivelog/2009_09_02/o1_mf_1_11_59xr7yf8_.arc RECID=1 STAMP=696554270
media recovery complete, elapsed time: 00:00:00
Finished recover at 02-SEP-09
contents of Memory Script:
{
   shutdown clone immediate;
   startup clone nomount;
   sql clone "alter system set  db_name =
 ''WHITE'' comment=
 ''Reset to original value by RMAN'' scope=spfile";
   sql clone "alter system reset  db_unique_name scope=spfile";
   shutdown clone immediate;
   startup clone nomount;
}
executing Memory Script
database dismounted
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area    1104814080 bytes
Fixed Size                     1335980 bytes
Variable Size                671092052 bytes
Database Buffers             419430400 bytes
Redo Buffers                  12955648 bytes
sql statement: alter system set  db_name =  ''WHITE'' comment= ''Reset to original value by RMAN'' scope=spfile
sql statement: alter system reset  db_unique_name scope=spfile
Oracle instance shut down
connected to auxiliary database (not started)
Oracle instance started
Total System Global Area    1104814080 bytes
Fixed Size                     1335980 bytes
Variable Size                671092052 bytes
Database Buffers             419430400 bytes
Redo Buffers                  12955648 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "WHITE" RESETLOGS ARCHIVELOG
  MAXLOGFILES     16
  MAXLOGMEMBERS      3
  MAXDATAFILES      100
  MAXINSTANCES     8
  MAXLOGHISTORY      292
 LOGFILE
  GROUP  1 ( '/u01/app/oracle/oradata/WHITE/redo01.log' ) SIZE 50 M  REUSE,
  GROUP  2 ( '/u01/app/oracle/oradata/WHITE/redo02.log' ) SIZE 50 M  REUSE,
  GROUP  3 ( '/u01/app/oracle/oradata/WHITE/redo03.log' ) SIZE 50 M  REUSE
 DATAFILE
  '/u01/app/oracle/oradata/WHITE/system01.dbf'
 CHARACTER SET WE8ISO8859P15
contents of Memory Script:
{
   set newname for tempfile  1 to
 "/u01/app/oracle/oradata/WHITE/temp01.dbf";
   switch clone tempfile all;
   catalog clone datafilecopy  "/u01/app/oracle/oradata/WHITE/sysaux01.dbf",
 "/u01/app/oracle/oradata/WHITE/undotbs01.dbf",
 "/u01/app/oracle/oradata/WHITE/users01.dbf",
 "/u01/app/oracle/oradata/WHITE/streams_tbs01.dbf";
   switch clone datafile all;
}
executing Memory Script
executing command: SET NEWNAME
renamed tempfile 1 to /u01/app/oracle/oradata/WHITE/temp01.dbf in control file
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/WHITE/sysaux01.dbf RECID=1 STAMP=696554288
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/WHITE/undotbs01.dbf RECID=2 STAMP=696554289
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/WHITE/users01.dbf RECID=3 STAMP=696554289
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/WHITE/streams_tbs01.dbf RECID=4 STAMP=696554289
datafile 2 switched to datafile copy
input datafile copy RECID=1 STAMP=696554288 file name=/u01/app/oracle/oradata/WHITE/sysaux01.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=2 STAMP=696554289 file name=/u01/app/oracle/oradata/WHITE/undotbs01.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=3 STAMP=696554289 file name=/u01/app/oracle/oradata/WHITE/users01.dbf
datafile 5 switched to datafile copy
input datafile copy RECID=4 STAMP=696554289 file name=/u01/app/oracle/oradata/WHITE/streams_tbs01.dbf
contents of Memory Script:
{
   Alter clone database open resetlogs;
}
executing Memory Script
database opened
Finished Duplicate Db at 02-SEP-09

Conclusion

Ce nouveau type de DUPLICATE a quelques limites, reportez-vous à la documentation associée avant de l’utiliser ; les principales sont sans doute les suivantes :

  • les sauvegardes doivent être sur disque,
  • elles doivent être dans un répertoire unique,
  • si vous voulez utiliser une clause de retour arrière, vous ne pouvez utiliser que UNTIL TIME.

D’un autre côté, les avantages sont si nombreux que d’ici quelques mois, on se demandera comment on faisait avant!
Vous êtes intéressé par d’autres fonctionnalités d’Oracle 11.2 ? Attendez patiemment nos prochains articles et abonnez-vous tout de suite au blog Easyteam par E-Mail, Twitter et RSS!

'BLACK','WHITE'

7 réflexions sur “Oracle 11g Release 2, RMAN DUPLICATE sans se connecter à la "Target"”

  1. Bonjour,
    Article très intéressant et fonctionnel. Mise en pratique le jour même pour dupliquer une base de production de 10To en test.
    Merci à vous !

  2. Ping : Pendant les vacances, consultez les dix articles les plus lus du blog EASYTEAM | EASYTEAM

  3. Ping : Pendant les vacances, consultez les dix articles les plus lus du blog EASYTEAM « EASYTEAM LE BLOG

  4. Qu’en est-il de la fonctionnalité qui dit qu’on peut faire un DUPLICATE sans avoir besoin d’une sauvegarde?

  5. Ping : Oracle 11.2: Restaurer un tablespace après un DROP « EASYTEAM Le BLOG

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *