RMAN DUPLICATE à partir d'un BEGIN/END BACKUP

Oui, La question est bien : « Comment utiliser la commande RMAN DUPLICATE à partir de fichiers de données sauvegardés avec BEGIN/END BACKUP ? » ou en tout cas c’est une des 2 questions auxquelles répond de ce post. Mais pourquoi donc ?

J’ai eu l’occasion, ces dernières semaines de travailler sur une manière de cloner un Disk Group ASM et le monter, en le renommant sur le même serveur (ou cluster, si vous préférez). D’ailleurs, un autre post devrait bientôt être publié en anglais sur le blog de Pythian à ce sujet. Il sous-entend que vous savez « cloner » une base de données Oracle avec BEGIN/END BACKUP, ce que sans doute 80% des DBA Oracle, moi le premier, ne font pas très régulièrement. Pourtant, si vous utilisez des baies de stockage ou un Volume Manager évolué, il existe encore des choses que RMAN, ASM, Active Duplicate ou Active Standby ne peuvent pas [encore] offrir.

Dupliquer de base de données avec BEGIN/END BACKUP permet de tirer parti de ces technologies et de « cloner » un environnement de plusieurs Tera-Octets en quelques minutes. Alors, vous trouverez ci-après 2 exemples qui illustrent les opérations à réaliser au niveau d’Oracle, avant, pendant et après la création d’un tel clone avec des logiciels de stockage. Pour cela, 2 approches distinctes sont mises en œuvre :

  • La recréation manuelle de la base de données et de son fichier de contrôle à partir de la commande « alter database backup controlfile to trace »
  • L’utilisation de la commande RMAN DUPLICATE

Les étapes de constitutions de votre base de données clone

Les 2 méthodes commencent par le même type d’opérations, à savoir la copie de vos fichiers en mode BEGIN/END backup. Certaines étapes, notamment celle de contrôle pourraient sans doute être éliminées mais au moins de cette manière vous pouvez vous assurer que tout est en ordre. Il s’agit de passer à travers ce qui suit :

  • Noter les numéros de séquences des redo logs courant
  • Passer la base de données en mode BEGIN BACKUP
  • Copier l’ensemble des datafiles ; utilisez la méthode de votre choix comme les Flexclones de Netapp, ou si vous utilisez une méthode de type BV ou BCV, arrêtez la synchro des miroirs.
  • Terminer le mode BACKUP de votre base de données
  • Générer une sauvegarde du fichier de contrôle sous forme de trace si vous voulez recréez le fichier manuellement (méthode 1) ou sous forme de vrai sauvegarde ou copie pour utiliser la commande DUPLICATE (méthode 2).
  • Noter les numéros de séquences des redo logs courant et les archiver

La méthode 1 « sans RMAN DUPLICATE » présente plusieurs inconvénients qui sont que : (a) Elle est plus complexe à transformer en script puisqu’il faut « parser » le fichier de trace et (b) le bug 5951527, vous empêchera de la mettre en œuvre sur le serveur sur lequel réside votre base de données d’origine (C’est du moins le cas avec les logiciels utilises pour cette démonstration, i.e. 10.2.0.4 pour Linux x86 32 bits). Elle consiste dans ce qui suit :

  • Mettre à disposition, par exemple sur un nouveau point de montage, les fichiers de données et les archivelogs
  • Créer un spfile et démarrer une nouvelle instance
  • Recréer un nouveau fichier de contrôle qui pointe sur les clones des fichiers de données et fichiers journaux.
  • Ajouter les autres threads de redo logs si vous avez plusieurs threads actifs (Le plus souvent avec RAC)
  • Enregistrer les fichiers archivelogs dans votre nouveau fichier de contrôle
  • Faire le recover de la base de données avec les archive logs
  • Ouvrir la base de données en mode RESETLOGS
  • Ajouter les fichiers temporaires
  • Ouvrir l’accès à votre clone de base de données.

La méthode 2, vous permet quant à elle d’utiliser la commande RMAN DUPLICATE, comme vous le feriez avec une sauvegarde classique. La seule différence par rapport à une commande RMAN DUPLICATE effectuée à partir d’une sauvegarde RMAN est qu’il vous faudra enregistrer les copies des fichiers effectuées pendant le BEGIN/END backup dans le fichier de contrôle de la base de données originale. Ces fichiers doivent être accessible, depuis l’environnement original et au moins le temps de l’enregistrement, dans l’arborescence dans laquelle vous allez recréer la base de données. Le fait que ces fichiers soient à l’endroit de la restauration permet à la commande DUPLICATE d’éviter cette étape ; la constitution du clone ne dure plus, alors, que quelques minutes. La contrainte de cette méthode réside donc dans les nécessités (a) de pouvoir accéder à l’arborescence du clone depuis la base de données primaire au moins le temps de la première étape et (b) d’accèder à la base primaire via le réseau à un utilisateur SYSDBA. Cette méthode 2 consiste donc dans ce qui suit :

  • Enregistrer les copies des fichiers de données dans le fichier de contrôle de la base de données originale depuis l’emplacement dans lequel ils seront « restaurés ».
  • Mettre à disposition, dans la même arborescence que l’originale, les fichiers archivelog et la sauvegarde ou copie du fichier de controle
  • Créer un spfile et démarrer une nouvelle instance
  • Lancer la commande DUPLICATE avec les options adéquates
  • Ouvrir l’accès à votre clone de base de données.

Maintenant que vous savez quoi faire, nous allons l’illustrer avec 1 exemple concret pour chacune des méthodes. Pour ce qui suit, nous allons supposer que la base d’origine s’appelle BLACK et que nous allons la cloner avec une instance nommée WHITE. Dans le cas de la méthode 2, la base de données sera renommée WHITE ; Pour la méthode 1, libre à vous d’utiliser DBNEWID une fois le clone constitue. Les tests ont été réalisés avec Oracle 10.2.0.4 sur Linux 32 bits. Ils devraient fonctionner sans trop de modifications sur 11g…

Effectuer la copie de votre base de données

  • Noter les numéros de séquences des redo logs courant
SQL> select THREAD#,  SEQUENCE#, GROUP#
from v$log

where STATUS='CURRENT';


THREAD# SEQUENCE# GROUP#
------- ---------- ----------
1 34 3
  • Passer la base de données en mode BEGIN BACKUP… Il faut évidemment que votre base de données soit en mode ARCHIVELOG :
SQL> alter database begin backup;
  • Copier l’ensemble des datafiles ; utilisez la méthode de votre choix comme les Flexclones de Netapp, ou si vous utilisez une méthode de type BV ou BCV, arrêtez la synchro des mirroirs.
  • Terminer le mode BACKUP de votre base de données
SQL> alter database end backup;
  • Générer une sauvegarde du controlfile

Dans le cas de la méthode 1, vous utiliserez la commande qui suit :

SQL> alter database
backup controlfile to trace
as '/tmp/control.trc';

Dans le cas de la méthode 1, vous prefererez sans doute RMAN sur la base originale. Soyez attentif que le répertoire dans lequel vous effectuer votre sauvegarde doit exister sur les 2 serveurs ; vous choisirez la méthode qui vous contient pour copier le fichier du serveur d’origine au serveur de la base clone :

$ rman target /

RMAN> backup current controlfile
format '/tmp/controlfile-bkp';
  • Noter les numéros de séquences des redo logs courant et les archiver
SQL> select THREAD#,  SEQUENCE#, GROUP#
from v$log
where STATUS='CURRENT';

THREAD# SEQUENCE# GROUP#
------- ---------- ----------
1 35 3

SQL> alter system archive log current;

System altered.

Constituer la base clone avec la méthode 1 :

  • Mettre à disposition, par exemple sur un nouveau point de montage, les fichiers de données clonées. Vous pouvez envoyez les fichiers d’archive logs entre les séquences notées au début et à la fin de l’opération de clone et accessible à partir du serveur sur lequel vous voulez monter le clone de votre base de données. Si vous avez cloné les fichiers de contrôle, supprimez les ou renommez-les.
  • Créer un spfile et démarrer une nouvelle instance. Le plus simple peut-être de partir du spfile de votre base de données d’origine.
SQL> create pfile='/tmp/initWHITE.ora' from spfile;

[o Deplacez le fichier dans le $ORACLE_HOME/dbs sous Unix/Linux
ou %ORACLE_HOME%/database sous Windows sur le logiciel cible
o Modifiez le contenu du fichier en en particulier l'ensemble
des chemin pour convenir à votre clone ET ajouter le paramètre
db_unique_name pour qu'il corresponde, par exmple au nom de votre
instance si vous voulez monter la base de données clone sur le meme
serveur ue l'originale
o Créez ce qu'il faut pour votre nouvelle instance Password
file (avec orapwd), service sous Windows (avec oradim),
/etc/oratab sous Linux...]

$ cat /u01/app/oracle/product/10.2.0/db_1/dbs/initWHITE.ora

*.audit_file_dest='/u01/app/oracle/admin/WHITE/adump'
*.background_dump_dest='/u01/app/oracle/admin/WHITE/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/WHITE/control01.ctl','/u01/app/oracle/oradata/WHITE/control02.ctl','/u01/app/oracle/oradata/WHITE/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/WHITE/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_name='BLACK'
*.db_unique_name='WHITE'

*.db_recovery_file_dest_size=2147483648
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.job_queue_processes=10
*.nls_length_semantics='BYTE'
*.open_cursors=300
*.pga_aggregate_target=25165824
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.resource_manager_plan=''
*.sga_target=167772160
*.undo_management='AUTO'
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/WHITE/udump'

$ mkdir -p /u01/app/oracle/admin/WHITE/adump
$ mkdir -p /u01/app/oracle/admin/WHITE/bdump
$ mkdir -p /u01/app/oracle/admin/WHITE/cdump
$ mkdir -p /u01/app/oracle/admin/WHITE/udump

$ . oraenv
ORACLE_SID = [WHITE] ? WHITE
ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1

$ sqlplus / as sysdba

SQL*Plus: Release 10.2.0.4.0 - Production on Sun Feb 24 22:26:42 2008

Copyright (c) 1982, 2007, Oracle. All Rights Reserved.

Connected to an idle instance.

SQL> startup nomount;

ORACLE instance started.

Total System Global Area 167772160 bytes
Fixed Size 1266392 bytes
Variable Size 62917928 bytes
Database Buffers 100663296 bytes
Redo Buffers 2924544 bytes
  • Recréer un nouveau fichier de contrôle qui pointe sur les clones des fichiers de données et fichiers journaux. L’opération de création du control file est dans la section « Set #2. RESETLOGS case » du fichier de « backup to trace » du controlfile original. Modifiez les chemin à vos fichiers mais pas le nom de la base de données.
SQL> CREATE CONTROLFILE DATABASE BLACK RESETLOGS  ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 '/u01/app/oracle/oradata/WHITE/redo01.log' SIZE 50M,
GROUP 2 '/u01/app/oracle/oradata/WHITE/redo02.log' SIZE 50M,
GROUP 3 '/u01/app/oracle/oradata/WHITE/redo03.log' SIZE 50M
-- STANDBY LOGFILE
DATAFILE '/u01/app/oracle/oradata/WHITE/system01.dbf',
'/u01/app/oracle/oradata/WHITE/undotbs01.dbf',
'/u01/app/oracle/oradata/WHITE/sysaux01.dbf',
'/u01/app/oracle/oradata/WHITE/users01.dbf'
CHARACTER SET WE8ISO8859P15;

Si vous voulez utiliser cette méthode sur le serveur original, le bug #5951527 pourrait vous empêcher de créer fichier de contrôle. Pour le contourner, (a) Arrêtez la base originale, (b) Créez le controlfile du clone, (c) Arrêtez le clone, (d) Redémarrez l’originale, (e) Redemarrez le clone. Le paramètre db_unique_name positionne sur le clone fera le reste.

  • Ajouter les autres threads de redo logs si vous avez plusieurs threads actifs (Le plus souvent avec RAC). Les commandes correspondantes sont également dans le fichier de « backup to trace » du controlfile original. Si vous avez plusieurs thread, vous devrez les créer avant d’ouvrir votre base de données avec le RESETLOGS.
  • Enregistrez les fichiers archivelogs dans votre nouveau fichier de contrôle. On supposera que vous avez poussé ces fichiers archivelog dans la même arborescence que l’originale. Le plus simple pour enregistrer ces fichiers dans le nouveau fichier de controle est d’utliser la commande RMAN CATALOG comme ci-dessous :
$ rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Sun Feb 24 23:27:24 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: BLACK (DBID=330918259, not open)

RMAN> catalog start with
'/u01/app/oracle/flash_recovery_area/BLACK/archivelog';


using target database control file instead of recovery catalog
searching for all files that match the pattern /u01/app/oracle/flash_recovery_area/BLACK/archivelog

List of Files Unknown to the Database
=====================================
File Name: /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_34_3w4cw6xw_ .arc
File Name: /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_35_3w4jwqq9_.arc

Do you really want to catalog the above files (enter YES or NO)? YES
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_34_3w4cw6xw_.arc
File Name: /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_35_3w4jwqq9_.arc

  • Faire le recover de la base de données avec les archive logs. La encore RMAN est sans doute plus simple que sqlplus :
RMAN> recover database until sequence 35;

Starting recover at 24-FEB-08
allocated channel: ORA_DISK_1
channel ORA_DISK_1: sid=156 devtype=DISK

starting media recovery

archive log thread 1 sequence 34 is already on disk as file /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_34_3w4cw6xw_.arc
archive log filename=/u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_24/o1_mf_1_34_3w4cw6xw_.arc thread=1 sequence=34
media recovery complete, elapsed time: 00:00:03
Finished recover at 24-FEB-08
  • Ouvrez la base de données en mode RESETLOGS
RMAN> alter database open resetlogs;

database opened

RMAN> exit
  • Ajouter les fichiers temporaires une fois la base ouverte et toujour en vous appuyant sur le fichier de « backup to trace » du controlfile original :
$ sqlplus / as sysdba

SQL> ALTER TABLESPACE TEMP
ADD TEMPFILE '/u01/app/oracle/oradata/WHITE/temp01.dbf'
SIZE 31457280 REUSE AUTOEXTEND ON NEXT 655360 MAXSIZE 32767M;

Tablespace altered.
  • Ouvrez l’accès à votre clone de base de données en verifiant qu’elle est enregistrée dans le listener, comme ci-dessous :
$ lsnrctl status listener

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 24-FEB-2008 23:42:44

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.1.0.6.0 - Production
Start Date 21-FEB-2008 21:05:28
Uptime 3 days 2 hr. 37 min. 16 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/arkzoyd/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=arkzoyd)(PORT=1521)))
Services Summary...
Service "WHITE" has 1 instance(s).
Instance "WHITE", status READY, has 1 handler(s) for this service...
The command completed successfully

Constituer la base clone avec la méthode 2 :

  • Mettre à disposition, par exemple sur un nouveau point de montage, les fichiers de données clonées depuis l’environnement original et enregistrez-les dans le controlfile de la base de données originale. Pour ce faire, la méthode la plus simple consiste à monter le système de fichier sur l’environnement original. La commande RMAN correspondante est simplement CATALOG comme ci-dessous :
$ . oraenv
ORACLE_SID = [BLACK] ? BLACK

$ rman target /

Recovery Manager: Release 10.2.0.4.0 - Production on Mon Feb 25 22:31:18 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: BLACK (DBID=330918259)

RMAN> catalog start with '/u01/app/oracle/oradata/WHITE';

searching for all files that match the pattern /u01/app/oracle/oradata/WHITE

List of Files Unknown to the Database
=====================================
File Name: /u01/app/oracle/oradata/WHITE/users01.dbf
File Name: /u01/app/oracle/oradata/WHITE/temp01.dbf
File Name: /u01/app/oracle/oradata/WHITE/undotbs01.dbf
File Name: /u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf
File Name: /u01/app/oracle/oradata/WHITE/system01.dbf
File Name: /u01/app/oracle/oradata/WHITE/sysaux01.dbf

Do you really want to catalog the above files (enter YES or NO)? YES
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /u01/app/oracle/oradata/WHITE/users01.dbf
File Name: /u01/app/oracle/oradata/WHITE/temp01.dbf
File Name: /u01/app/oracle/oradata/WHITE/undotbs01.dbf
File Name: /u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf
File Name: /u01/app/oracle/oradata/WHITE/system01.dbf
File Name: /u01/app/oracle/oradata/WHITE/sysaux01.dbf
  • Vous pouvez envoyez l’arborescence des fichiers de données, ainsi que les fichiers d’archive logs entre les séquences notées au début et à la fin de l’opération de clone et le backup du controlfile sur le serveur de clone. Leur emplacement doit être identique ou au moins, vous devrez créer des liens symboliques pour qu’Oracle le croit [NDLR : Les liens, c’est pas la meilleure idée de ce post].
  • Créer un spfile et démarrer une nouvelle instance. Le plus simple peut-être de partir du spfile de votre base de données d’origine.
SQL> create pfile='/tmp/initWHITE.ora' from spfile;

[o Deplacez le fichier dans le $ORACLE_HOME/dbs sous Unix/Linux
ou %ORACLE_HOME%/database sous Windows sur le logiciel cible
o Modifiez le contenu du fichier en en particulier l'ensemble
des chemin pour convenir à votre clone ET CHANGEZ le paramètre
db_name pour qu'il corresponde au nouveau nom de votre base de
données, i.e. WHITE dans cet exemple
o Créez ce qu'il faut pour votre nouvelle instance Password
file (avec orapwd), service sous Windows (avec oradim),
/etc/oratab sous Linux...]
o Positionnez les paramètres db_file_name_convert et
log_file_name_convert pour qu'Oracle

$ cat /u01/app/oracle/product/10.2.0/db_1/dbs/initWHITE.ora

*.audit_file_dest='/u01/app/oracle/admin/WHITE/adump'
*.background_dump_dest='/u01/app/oracle/admin/WHITE/bdump'
*.compatible='10.2.0.1.0'
*.control_files='/u01/app/oracle/oradata/WHITE/control01.ctl','/u01/app/oracle/oradata/WHITE/control02.ctl','/u01/app/oracle/oradata/WHITE/control03.ctl'
*.core_dump_dest='/u01/app/oracle/admin/WHITE/cdump'
*.db_block_size=8192
*.db_domain=''
*.db_file_multiblock_read_count=16
*.db_file_name_convert='BLACK','WHITE'
*.log_file_name_convert='BLACK','WHITE'
*.db_name='WHITE'
*.db_recovery_file_dest_size=2147483648
*.db_recovery_file_dest='/u01/app/oracle/flash_recovery_area'
*.job_queue_processes=10
*.nls_length_semantics='BYTE'
*.open_cursors=300
*.pga_aggregate_target=25165824
*.processes=150
*.remote_login_passwordfile='EXCLUSIVE'
*.resource_manager_plan=''
*.sga_target=167772160
*.undo_management='AUTO'
*.undo_retention=900
*.undo_tablespace='UNDOTBS1'
*.user_dump_dest='/u01/app/oracle/admin/WHITE/udump'

$ mkdir -p /u01/app/oracle/admin/WHITE/adump
$ mkdir -p /u01/app/oracle/admin/WHITE/bdump
$ mkdir -p /u01/app/oracle/admin/WHITE/cdump
$ mkdir -p /u01/app/oracle/admin/WHITE/udump

$ . oraenv
ORACLE_SID = [WHITE] ? WHITE
ORACLE_HOME = /u01/app/oracle/product/10.2.0/db_1

$ rman target=sys@black auxiliary=/

Recovery Manager: Release 10.2.0.4.0 - Production on Mon Feb 25 22:45:10 2008

Copyright (c) 1982, 2007, Oracle. All rights reserved.

connected to target database: BLACK (DBID=330918259)
connected to auxiliary database (not started)

RMAN> startup clone nomount;

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 167772160 bytes

Fixed Size 1266392 bytes
Variable Size 109055272 bytes
Database Buffers 54525952 bytes
Redo Buffers 2924544 bytes

RMAN> sql clone 'create spfile from pfile';

sql statement: create spfile from pfile

RMAN> shutdown clone;

Oracle instance shut down

RMAN> startup clone nomount;

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 167772160 bytes

Fixed Size 1266392 bytes
Variable Size 109055272 bytes
Database Buffers 54525952 bytes
Redo Buffers 2924544 bytes
  • Lancez la commande DUPLICATE :
RMAN> duplicate target database
to WHITE
nofilenamecheck
until sequence 35 thread 1;


Starting Duplicate Db at 25-FEB-08
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=156 devtype=DISK

contents of Memory Script:
{
set until scn 1031283;
set newname for datafile 1 to
"/u01/app/oracle/oradata/WHITE/system01.dbf";
set newname for datafile 2 to
"/u01/app/oracle/oradata/WHITE/undotbs01.dbf";
set newname for datafile 3 to
"/u01/app/oracle/oradata/WHITE/sysaux01.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/datafile/o1_mf_demo_3w6sr54o_.dbf";
restore
check readonly
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 25-FEB-08
using channel ORA_AUX_DISK_1

datafile 1 is already restored to file /u01/app/oracle/oradata/WHITE/system01.dbf
datafile 2 is already restored to file /u01/app/oracle/oradata/WHITE/undotbs01.dbf
datafile 3 is already restored to file /u01/app/oracle/oradata/WHITE/sysaux01.dbf
datafile 4 is already restored to file /u01/app/oracle/oradata/WHITE/users01.dbf
datafile 5 is already restored to file /u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf
restore not done; all files readonly, offline, or already restored
Finished restore at 25-FEB-08
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:
{
switch clone datafile all;
}
executing Memory Script

released channel: ORA_AUX_DISK_1
datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=647650246 filename=/u01/app/oracle/oradata/WHITE/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=647650246 filename=/u01/app/oracle/oradata/WHITE/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=647650246 filename=/u01/app/oracle/oradata/WHITE/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=647650246 filename=/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf

contents of Memory Script:
{
set until scn 1031283;
recover
clone database
delete archivelog
;
}
executing Memory Script

executing command: SET until clause

Starting recover at 25-FEB-08
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: sid=159 devtype=DISK

starting media recovery

archive log thread 1 sequence 34 is already on disk as file /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_25/o1_mf_1_34_3w70z6q8_.arc
archive log thread 1 sequence 35 is already on disk as file /u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_25/o1_mf_1_35_3w71204t_.arc
archive log filename=/u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_25/o1_mf_1_34_3w70z6q8_.arc thread=1 sequence=43
archive log filename=/u01/app/oracle/flash_recovery_area/BLACK/archivelog/2008_02_25/o1_mf_1_35_3w71204t_.arc thread=1 sequence=44
media recovery complete, elapsed time: 00:00:04
Finished recover at 25-FEB-08

contents of Memory Script:
{
change datafilecopy '/u01/app/oracle/oradata/WHITE/system01.dbf' uncatalog;
change datafilecopy '/u01/app/oracle/oradata/WHITE/undotbs01.dbf' uncatalog;
change datafilecopy '/u01/app/oracle/oradata/WHITE/sysaux01.dbf' uncatalog;
change datafilecopy '/u01/app/oracle/oradata/WHITE/users01.dbf' uncatalog;
change datafilecopy '/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf' uncatalog;
}
executing Memory Script

uncataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/system01.dbf recid=20 stamp=647649298
Uncataloged 1 objects


uncataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/undotbs01.dbf recid=18 stamp=647649298
Uncataloged 1 objects


uncataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/sysaux01.dbf recid=21 stamp=647649298
Uncataloged 1 objects


uncataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/users01.dbf recid=17 stamp=647649298
Uncataloged 1 objects


uncataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf recid=19 stamp=647649298
Uncataloged 1 objects


contents of Memory Script:
{
shutdown clone;
startup clone nomount ;
}
executing Memory Script

database dismounted
Oracle instance shut down

connected to auxiliary database (not starte d)
Oracle instance started

Total System Global Area 167772160 bytes

Fixed Size 1266392 bytes
Variable Size 109055272 bytes
Database Buffers 54525952 bytes
Redo Buffers 2924544 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/undotbs01.dbf";
catalog clone datafilecopy "/u01/app/oracle/oradata/WHITE/sysaux01.dbf";
catalog clone datafilecopy "/u01/app/oracle/oradata/WHITE/users01.dbf";
catalog clone datafilecopy "/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf";
switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed temporary file 1 to /u01/app/oracle/oradata/WHITE/temp01.dbf in control file

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/undotbs01.dbf recid=1 stamp=647650258

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/sysaux01.dbf recid=2 stamp=647650258

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/users01.dbf recid=3 stamp=647650258

cataloged datafile copy
datafile copy filename=/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf recid=4 stamp=647650258

datafile 2 switched to datafile copy
input datafile copy recid=1 stamp=647650258 filename=/u01/app/oracle/oradata/WHITE/undotbs01.dbf
datafile 3 switched to datafile copy
input datafile copy recid=2 stamp=647650258 filename=/u01/app/oracle/oradata/WHITE/sysaux01.dbf
datafile 4 switched to datafile copy
input datafile copy recid=3 stamp=647650258 filename=/u01/app/oracle/oradata/WHITE/users01.dbf
datafile 5 switched to datafile copy
input datafile copy recid=4 stamp=647650258 filename=/u01/app/oracle/oradata/WHITE/datafile/o1_mf_demo_3w6sr54o_.dbf

contents of Memory Script:
{
Alter clone database open resetlogs;
}
executing Memory Script

database opened
Finished Duplicate Db at 25-FEB-08
  • Votre clone de base de données est ouverte ; vérifiez qu’elle est enregistrée dans le listener, comme ci-dessous :
$ lsnrctl status listener

LSNRCTL for Linux: Version 10.2.0.4.0 - Production on 25-FEB-2008 22:59:03

Copyright (c) 1991, 2007, Oracle. All rights reserved.

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias LISTENER
Version TNSLSNR for Linux: Version 11.1.0.6.0 - Production
Start Date 21-FEB-2008 21:05:28
Uptime 4 days 1 hr. 53 min. 35 sec
Trace Level off
Security ON: Local OS Authentication
SNMP OFF
Listener Parameter File /u01/app/oracle/product/11.1.0/db_1/network/admin/listener.ora
Listener Log File /u01/app/oracle/diag/tnslsnr/arkzoyd/listener/alert/log.xml
Listening Endpoints Summary...
(DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=arkzoyd)(PORT=1521)))
Services Summary...
Service "WHITE" has 1 instance(s).
Instance "WHITE", status READY, has 1 handler(s) for this service...
The command completed successfully

Conclusion

Peut-être un jour tout sera intégré et une commande unique permettra de présenter une instance clone de l’originale ; Si on rêvait, on dirait que ASM pourrait offrir une vue en lecture/écriture de la base originale comme NetApp Flexclone. En attendant, utilisez la commande DUPLICATE avec un BEGIN/END BACKUP permet de tirer parti de l’argent investi dans le stockage. En plus, c’est vraiment rapide, quoique, ce n’est pas la première idée qui vienne à l’esprit.