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"”
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 !
Ping : Pendant les vacances, consultez les dix articles les plus lus du blog EASYTEAM | EASYTEAM
Ping : Pendant les vacances, consultez les dix articles les plus lus du blog EASYTEAM « EASYTEAM LE BLOG
Can not imagine how glad I am that got to your post
Qu’en est-il de la fonctionnalité qui dit qu’on peut faire un DUPLICATE sans avoir besoin d’une sauvegarde?
bonsoir,
« Duplicate from active database » n’est pas une nouvelle fonctionnalité de 11gR2. Bien sur pour ce dernier cas, il faudra se connecter à la target. Il y a un exemple d’utilisation pour mettre en place une standby dans le 1er article sur data guard 11g R2: http://blog.easyteam.fr/2009/10/01/oracle-data-guard-11gr2/
Ping : Oracle 11.2: Restaurer un tablespace après un DROP « EASYTEAM Le BLOG
Les commentaires sont fermés.