Duplicate From Active Database… Compressé en 12c

Note et corrections:
J’ai corrigé cet article suite au premier commentaire de Donat Callens disponible ci-dessous. La version 11.2 permet bien de paralléliser les sauvegardes. Merci à tous de garder un oeil vigilant sur mes propos, pas toujours avertis.

La commande DUPLICATE FROM ACTIVE DATABASE est une grande idée pour cloner des environnements sans monopoliser de lecteur de bande, un système de fichiers réseau ni scripter l’envoi de fichiers entre des serveurs. Malheureusement si, jusqu’à présent, cela fonctionnait parfaitement pour des petites bases de données, Oracle 11.2 ne permettait pas de compresser ni de paralléliser les flux de données entre serveurs. Ce petit détail rendait donc, la solution impossible à faire monter en charge. Concrètement, elle était rarement utilisable dans des contextes de production.

Désormais qu’Oracle 12c est disponible et que cette limite est levée, DUPLICATE FROM ACTIVE DATABASE va devenir un de vos meilleurs amis pour créer des environnements. Mais comment activer et configurer le parallélisme et compression dans ce cas ?

Si la solution est évidente, son explication dans la documentation est, comme souvent un peu éparpillée. Cet article présente les points essentiels pour mettre en place le parallélisme et la compression de la commande DUPLICATE FROM ACTIVE DATABASE. Il revient également sur l’article précédent dédié à l’implémentation en 11g pour y ajouter quelques raccourcis dans le contexte d’Oracle 12c.

Un mot à propos des licences

Avec le temps, j’ai développé quelques travers paranoïaques ! Une première question, un peu annodine, est : « dans quel contexte puis-je utiliser cette fonctionnalité ? ».

En retournant le Licensing Guide dans tous les sens, il ne semble pas y avoir de restriction liée à l’utilisation de la compression pour constituer ses environnements avec un DUPLICATE FROM ACTIVE DATABASE WITH COMPRESSED BACKUPSET : Rien à propos de la compression "DEFAULT" ; rien non plus à propos de la clause FROM ACTIVE DATABASE. Il semble donc bien que les 2 soient possibles dans les versions SE1, SE et EE !

Concernant le parallélisme, c’est une autre histoire. Seule la version EE permet de mettre en place le « Parallel backup and recovery ». Donc, cet article s’applique à l’Enterprise Edition. Et vous n’avez pas besoin ni d’Active Data Guard, ni de Advanced Compression…

Quelques Explications 

La section qui suit donne un exemple de mise en oeuvre d’un clone avec parallélisme et compression. D’abord quelques détails quant à la mise en oeuvre de ces fonctionnalités et la documentation.

Contrairement à ce que suggère la section « Creating Backup Sets in Parallel During Active Database Duplication » de la documentation, il n’est pas « nécessaire » de mettre la clause SECTION SIZE pour activer le parallélisme ; il suffit en fait d’établir plusieurs canaux auxiliaires. Pour vous en rendre compte, lancez un test en prenant soin d’établir 5 canaux auxiliaires et, en parallèle, lancez la requête ci-dessous sur la « target » :

set lines 150
col sid format 999
col serial# format 99999
col program format a15 trun
col module format a15 trun
col event format a25 trun
col wait_class format a25 trun
select sid, serial#, program, module, event, wait_class
from v$session
where username='SYS'
and program not like 'sqlplus%'
and program not like 'rman%';

SID SERIAL# PROGRAM MODULE EVENT WAIT_CLASS
--- ------- --------------- --------------- ------------------------- ----------
42 295 oracle@black.ar oracle@black.ar RMAN backup & recovery I/ System I/O
50 409 oracle@black.ar oracle@black.ar SQL*Net vector data to cl Network
54 315 oracle@black.ar oracle@black.ar RMAN backup & recovery I/ System I/O
58 165 oracle@black.ar oracle@black.ar RMAN backup & recovery I/ System I/O
69 113 oracle@black.ar oracle@black.ar SQL*Net message from clie Idle

Vous constaterez donc qu’il y a du parallélisme sans la clause SECTION SIZE. Cela étant, pour un parallélisme efficace, il est très intéressant de mettre en place cette clause. En effet si vous ne le faîtes pas, un seul process peut traiter un fichier. Si vous avez un ou 2 très gros fichiers dans la base de données ce qui est fréquemment le cas, votre clone sera constitué à l’aide de 1 ou 2 processus, une fois les petits fichiers traités. Cette clause permet donc de bien répartir la charge sur de multiples processus quelques soient les structures de base de données.

Une autre section, à priori mystérieuse, de la documentation est la section « Configuring Channels for Active Database Duplication » et plus précisément la phrase « Ideally, the number of auxiliary channels must be greater than or equal to the number of target channels ». L’explication ne tient pas dans un impact possible sur le niveau de parallélisme. Dans tous les cas, le parallélisme est structuré par le nombre de canaux auxiliaires. L’explication tient dans les conditions de déclenchement d’un clone via (1) des copies de fichiers / image copies ou (2) des jeux de sauvegarde / backup set. C’est la section « Factors That Determine Whether Backup Sets or Image Copies Are Used for Active Database Duplication » qui explique le pourquoi de cette phrase. On y apprend en effet que Oracle recommande d’utiliser des backupsets et on comprend bien pourquoi ! On y apprend également que, si vous n’utilisez pas de clause WITH BACKUPSET, le choix d’une stratégie plutôt qu’une autre dépend du nombre relatif de canaux sur la target et de canaux sur l’auxiliaire. D’où cette phrase.

Si vous voulez vous simplifier la vie, vous pouvez aussi simplement gérer l’allocation des canaux dans votre configuration. Le niveau de parallélisme est alors automatiquement déduit du paramètre PARALLELISM de CONFIGURE DEVICE TYPE DISK. Cette clause structure les canaux de la cible comme les canaux sur la base de données auxiliaire même si elle ne définit pas la stratégie associée. On pourrait dire, rien de bien sorcier et ça fonctionne comme attendu.

Un dernier point est également une nouveauté de la version 12.1 : si vous ajoutez la clause "PASSWORD FILE", comme décrit dans la section « Creating a Password File for the Auxiliary Instance« , le fichier de mot de passe est copié avec la commande DUPLICATE sur le site auxiliaire. Cela permet de récupérer facilement l’ensemble des utilisateurs administrateurs avec la base de données. C’est une nouvelle fonctionnalité qui simplifiera votre vie.

La mise en oeuvre

Finalement, l’util
isation du parallélisme et de la compression avec la commande DUPLICATE FROM ACTIVE DATABASE ne change quasiment rien à la mise en oeuvre par rapport à la version 11.2. Vous trouverez ci-dessous l’ensemble des étapes nécessaires à cet exercice, tiré de cet article de 2008 et légèrement modifié pour réduire encore le nombre d’étape ; cela consiste à :

  • Créer des fichiers listener.ora pour réaliser l’enregistrement statique des instances et pouvoir vous connecter à distance même lorsque votre base de données est arrêtée
  • Créer un fichier orapw avec le même mot de passe que sur la base de données cible pour pouvoir vous connecter SYSDBA à distance
  • Créer les répertoires nécessaires à la base de données
  • Ajouter les entrées dans oratab
  • Se connecter à Recovery Manager sur la base cible et sur la base auxiliaire
  • Démarrer l’instance auxiliaire
  • Lancer la commande DUPLICATE

Note:
Vous remarquerez quelques optimisations par rapport à l’article précédent, notamment pour réduire encore le nombre d’opérations.

Dans l’exemple qui suit, vous créerez une base de données BLACK qui est une clone de la base de données WHITE.

1. Créer les fichiers listener.ora

Pour commencer, vous devrez disposer d’un listener avec une configuration statique du service BLACK sur votre nouveau serveur :

cat $ORACLE_HOME/network/admin/listener.ora
SID_LIST_LISTENER =
(SID_LIST =
(SID_DESC =
(GLOBAL_DBNAME = BLACK)
(ORACLE_HOME = /u01/app/oracle/product/12.1.0/db_1)
(SID_NAME = BLACK)
)
)

LISTENER =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = black.easyteam.fr)(PORT = 1521))
)

Vous pouvez ensuite démarrer ou recharger le listener avec ces éléments de configuration.

2. Créer le password file

Pour vous connecter à distance, il est nécessaire de disposer d’un fichier de mot de passe avec le même mot de passe que sur la base de données primaire. Parmi les méthodes possibles, vous pouvez simplement recréer ce fichier comme ci-dessous:
cd $ORACLE_HOME/dbs
orapwd file=orapwBLACK entries=5 sysbackup=y

3. Créer les répertoires nécessaires

Comme pour 11.2, certains répertoires doivent être créés pour accueillir la base de données. Il s’agit notamment des répertoires d’audit et d’archivelog; la plupart des autres répertoires sont créés automatiquement par Oracle Managed Files ou par ADR :

mkdir -p /u01/app/oracle/admin/BLACK/adump
mkdir -p /u01/app/oracle/oradata/BLACK/archivelog

4. Ajouter l’entrée dans oratab

Sous Windows, vous créerez le service associé à votre instance à l’aide de oradim; sous Linux et Unix, ajoutez les entrées correspondant à vos bases de données dans le fichier oratab

5. Se connecter à l’aide de Recovery Manager

Pour lancer la commande DUPLICATE, vous devrez préalablement vous connecter à la target, la base de données d’origine et la base de données auxiliaire ou clone:

rman

connect target sys@"white:1521/WHITE"
connect auxiliary sys@"black:1521/BLACK"

6. Démarrer l’instance auxiliare (le clone)

Il faut ensuite démarrer l’instance qui accueillera le clone, pour cela, pas besoin de créer un fichier d’initialisation, RMAN réalise l’opération pour vous. Lancez simplement la commande ci-dessous :

startup clone nomount;

startup failed: ORA-01078: failure in processing system parameters
LRM-00109: could not open parameter file '/u01/app/oracle/product/12.1.0/db_1/dbs/initBLACK.ora'

starting Oracle instance without parameter file for retrieval of spfile
Oracle instance started

Total System Global Area 1068937216 bytes

Fixed Size 2296576 bytes
Variable Size 281019648 bytes
Database Buffers 780140544 bytes
Redo Buffers 5480448 bytes

6. Lancer le DUPLICATE

En supposant que vous avez configuré le parallelisme dans la configuration de votre base de données cible à l’aide d’une commande comme celle ci-dessous :

configure device type disk parallelism 4 backup type to backupset

Lancez la copie en parallèle avec compression est aussi simple que la commande ci-dessous:

DUPLICATE TARGET DATABASE TO BLACK
FROM ACTIVE DATABASE
PASSWORD FILE
USING COMPRESSED BACKUPSET
SECTION SIZE 500M
DB_FILE_NAME_CONVERT 'WHITE','BLACK'
NOFILENAMECHECK
SPFILE
PARAMETER_VALUE_CONVERT 'WHITE','BLACK'
SET LOG_FILE_NAME_CONVERT 'WHITE','BLACK'
RESET MEMORY_TARGET
SET PGA_AGGREGATE_TARGET '80M'
SET SGA_TARGET '308M' ;

Cet exemple utilise les paramètres suivants :

  • PASSWORD FILE indique que le fichier de mot de passe est également mis à jour sur le clone
  • SECTION SIZE 500M optimise la parallélisation
  • LOG_FILE_NAME_CONVERT, DB_FILE_NAME_CONVERT et DB_FILE_NAME_CONVERT indiquent que les noms des fichiers de logs, les noms des fichiers de données et temporaires et les paramètres sont modifiés de WHITE en BLACK
  • Les paramètres SGA_TARGET et PGA_AGGREGATE_TARGET sont modifiés et positionnés pour le 1er à son minimum de 308M en 12c
  • Le paramètre MEMORY_TARGET est supprimé
  • NOFILENAMECHECK permet de ne pas vérifier que les noms de fichiers correspondent entre cible et clone

Note:
Si vous voulez explicitement positionner le parallélisme, vous pouvez allouer les canaux. Le parallélisme correspond au canaux auxiliaires alloués et il vous faut au minimum, et sans doute pas plus, qu’un canal sur la base de données cible.

La constitution du clone ressemble alors à ce qui suit :

Starting Duplicate Db at 04-JUL-13
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=20 device type=DISK
allocated channel: ORA_AUX_DISK_2
channel ORA_AUX_DISK_2: SID=21 device type=DISK
allocated channel: ORA_AUX_DISK_3
channel ORA_AUX_DISK_3: SID=22 device type=DISK
allocated channel: ORA_AUX_DISK_4
channel ORA_AUX_DISK_4: SID=23 device type=DISK
current log archived

contents of Memory Script:
{
backup as copy reuse
targetfile '/u01/app/oracle/product/12.1.0/db_1/dbs/orapwWHITE' auxiliary format
'/u01/app/oracle/product/12.1.0/db_1/dbs/orapwBLACK' ;
restore clone from service 'white:1521/WHITE' using compressed backupset
spfile to '/u01/app/oracle/product/12.1.0/db_1/dbs/spfileBLACK.ora';
sql clone "alter system set spfile= ''/u01/app/oracle/product/12.1.0/db_1/dbs/spfileBLACK.ora''";
}
executing Memory Script

Starting backup at 04-JUL-13
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=60 device type=DISK
allocated channel: ORA_DISK_2
channel ORA_DISK_2: SID=62 device type=DISK
allocated channel: ORA_DISK_3
channel ORA_DISK_3: SID=55 device type=DISK
allocated channel: ORA_DISK_4
channel ORA_DISK_4: SID=65 device type=DISK
Finished backup at 04-JUL-13

Starting restore at 04-JUL-13
using channel ORA_AUX_DISK_1
using channel ORA_AUX_DISK_2
using channel ORA_AUX_DISK_3
using channel ORA_AUX_DISK_4

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_1: restoring SPFILE
output file name=/u01/app/oracle/product/12.1.0/db_1/dbs/spfileBLACK.ora
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 04-JUL-13

sql statement: alter system set spfile= ''/u01/app/oracle/product/12.1.0/db_1/dbs/spfileBLACK.ora''

contents of Memory Script:
{
sql clone "alter system set db_name =
''BLACK'' comment=
''duplicate'' scope=spfile";
sql clone "alter system set audit_file_dest =
''/u01/app/oracle/admin/BLACK/adump'' comment=
'''' scope=spfile";
sql clone "alter system set control_files =
''/u01/app/oracle/oradata/BLACK/controlfile/o1_mf_8x0z1dfl_.ctl'', ''/u01/app/oracle/fast_recovery_area/BLACK/controlfile/o1_mf_8x0z1fjp_.ctl'' comment=
'''' scope=spfile";
sql clone "alter system set dispatchers =
''(PROTOCOL=TCP) (SERVICE=BLACKXDB)'' comment=
'''' scope=spfile";
sql clone "alter system set log_archive_dest_1 =
''location=/u01/app/oracle/oradata/BLACK/archivelog'' comment=
'''' scope=spfile";
sql clone "alter system set LOG_FILE_NAME_CONVERT =
''WHITE'', ''BLACK'' comment=
'''' scope=spfile";
sql clone "alter system reset MEMORY_TARGET scope=spfile";
sql clone "alter system set PGA_AGGREGATE_TARGET =
80M comment=
'''' scope=spfile";
sql clone "alter system set SGA_TARGET =
308M comment=
'''' scope=spfile";
shutdown clone immediate;
startup clone nomount;
}
executing Memory Script

sql statement: alter system set db_name = ''BLACK'' comment= ''duplicate'' scope=spfile

sql statement: alter system set audit_file_dest = ''/u01/app/oracle/admin/BLACK/adump'' comment= '''' scope=spfile

sql statement: alter system set control_files = ''/u01/app/oracle/oradata/BLACK/controlfile/o1_mf_8x0z1dfl_.ctl'', ''/u01/app/oracle/fast_recovery_area/BLACK/controlfile/o1_mf_8x0z1fjp_.ctl'' comment= '''' scope=spfile

sql statement: alter system set dispatchers = ''(PROTOCOL=TCP) (SERVICE=blackXDB)'' comment= '''' scope=spfile

sql statement: alter system set log_archive_dest_1 = ''location=/u01/app/oracle/oradata/BLACK/archivelog'' comment= '''' scope=spfile

sql statement: alter system set LOG_FILE_NAME_CONVERT = ''WHITE'', ''BLACK'' comment= '''' scope=spfile

sql statement: alter system reset MEMORY_TARGET scope=spfile

sql statement: alter system set PGA_AGGREGATE_TARGET = 80M comment= '''' scope=spfile

sql statement: alter system set SGA_TARGET = 308M comment= '''' scope=spfile

Oracle instance shut down

connected to auxiliary database (not started)
Oracle instance started

Total System Global Area 321507328 bytes

Fixed Size 2287960 bytes
Variable Size 251659944 bytes
Database Buffers 62914560 bytes
Redo Buffers 4644864 bytes

contents of Memory Script:
{
sql clone "alter system set control_files =
''/u01/app/oracle/oradata/BLACK/controlfile/o1_mf_8x0z1dfl_.ctl'', ''/u01/app/oracle/fast_recovery_area/BLACK/controlfile/o1_mf_8x0z1fjp_.ctl'' comment=
''Set by RMAN'' scope=spfile";
sql clone "alter system set db_name =
''WHITE'' comment=
''Modified by RMAN duplicate'' scope=spfile";
sql clone "alter system set db_unique_name =
''BLACK'' comment=
''Modified by RMAN duplicate'' scope=spfile";
shutdown clone immediate;
startup clone force nomount
restore clone from service 'white:1521/WHITE' using compressed backupset
primary controlfile;
alter clone database mount;
}
executing Memory Script

sql statement: alter system set control_files = ''/u01/app/oracle/oradata/BLACK/controlfile/o1_mf_8x0z1dfl_.ctl'', ''/u01/app/oracle/fast_recovery_area/BLACK/controlfile/o1_mf_8x0z1fjp_.ctl'' comment= ''Set by RMAN'' scope=spfile

sql statement: alter system set db_name = ''WHITE'' comment= ''Modified by RMAN duplicate'' scope=spfile

sql statement: alter system set db_unique_name = ''BLACK'' comment= ''Modified by RMAN duplicate'' scope=spfile

Oracle instance shut down

Oracle instance started

Total System Global Area 321507328 bytes

Fixed Size 2287960 bytes
Variable Size 251659944 bytes
Database Buffers 62914560 bytes
Redo Buffers 4644864 bytes

Starting restore at 04-JUL-13
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=20 device type=DISK
allocated channel: ORA_AUX_DISK_2
channel ORA_AUX_DISK_2: SID=21 device type=DISK
allocated channel: ORA_AUX_DISK_3
channel ORA_AUX_DISK_3: SID=22 device type=DISK
allocated channel: ORA_AUX_DISK_4
channel ORA_AUX_DISK_4: SID=23 device type=DISK

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_1: restoring control file
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:03
output file name=/u01/app/oracle/oradata/BLACK/controlfile/o1_mf_8x0z1dfl_.ctl
output file name=/u01/app/oracle/fast_recovery_area/BLACK/controlfile/o1_mf_8x0z1fjp_.ctl
Finished restore at 04-JUL-13

database mounted

contents of Memory Script:
{
set newname for datafile 1 to
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_system_8x0yy34d_.dbf";
set newname for datafile 3 to
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8x0yv3vy_.dbf";
set newname for datafile 4 to
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8x0z0sk5_.dbf";
set newname for datafile 6 to
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8x0z0rdz_.dbf";
restore
from service 'white:1521/WHITE' using compressed backupset
clone database
;
sql 'alter system archive log current';
}
executing Memory Script

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

executing command: SET NEWNAME

Starting restore at 04-JUL-13
using channel ORA_AUX_DISK_1
using channel ORA_AUX_DISK_2
using channel ORA_AUX_DISK_3
using channel ORA_AUX_DISK_4

channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using compressed network backup set from service white:1521/WHITE
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/BLACK/datafile/o1_mf_system_8x0yy34d_.dbf
channel ORA_AUX_DISK_2: starting datafile backup set restore
channel ORA_AUX_DISK_2: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_2: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_2: restoring datafile 00003 to /u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8x0yv3vy_.dbf
channel ORA_AUX_DISK_3: starting datafile backup set restore
channel ORA_AUX_DISK_3: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_3: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_3: restoring datafile 00004 to /u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8x0z0sk5_.dbf
channel ORA_AUX_DISK_4: starting datafile backup set restore
channel ORA_AUX_DISK_4: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_4: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_4: restoring datafile 00006 to /u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8x0z0rdz_.dbf
channel OR A_AUX_DISK_4: restore complete, elapsed time: 00:00:07
channel ORA_AUX_DISK_3: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_2: restore complete, elapsed time: 00:03:15
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:03:25
Finished restore at 04-JUL-13

sql statement: alter system archive log current
current log archived

contents of Memory Script:
{
restore clone force from service ' white:1521/WHITE' using compressed backupset
archivelog from scn 1961400;
switch clone datafile all;
}
executing Memory Script

Starting restore at 04-JUL-13
using channel ORA_AUX_DISK_1
using channel ORA_AUX_DISK_2
using channel ORA_AUX_DISK_3
using channel ORA_AUX_DISK_4

channel ORA_AUX_DISK_1: starting archived log restore to default destination
channel ORA_AUX_DISK_1: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=22
channel ORA_AUX_DISK_2: starting archived log restore to default destination
channel ORA_AUX_DISK_2: using compressed network backup set from service white:1521/WHITE
channel ORA_AUX_DISK_2: restoring archived log
archived log thread=1 sequence=23
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_2: restore complete, elapsed time: 00:00:01
Finished restore at 04-JUL-13

datafile 1 switched to datafile copy
input datafile copy RECID=5 STAMP=819893525 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_system_8xblfbhy_.dbf
datafile 3 switched to datafile copy
input datafile copy RECID=6 STAMP=819893525 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8xblfbjw_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=7 STAMP=819893525 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8xblf6lj_.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=8 STAMP=819893525 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8xblf8vy_.dbf

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

executing command: SET until clause

Starting recover at 04-JUL-13
using channel ORA_AUX_DISK_1
using channel ORA_AUX_DISK_2
using channel ORA_AUX_DISK_3
using channel ORA_AUX_DISK_4

starting media recovery

archived log for thread 1 with sequence 22 is already on disk as file /u01/app/oracle/oradata/BLACK/archivelog/1_22_819492177.dbf
archived log for thread 1 with sequence 23 is already on disk as file /u01/app/oracle/oradata/BLACK/archivelog/1_23_819492177.dbf
archived log file name=/u01/app/oracle/oradata/BLACK/archivelog/1_22_819492177.dbf thread=1 sequence=22
archived log file name=/u01/app/oracle/oradata/BLACK/archivelog/1_23_819492177.dbf thread=1 sequence=23
media recovery complete, elapsed time: 00:00:01
Finished recover at 04-JUL-13
Oracle instance started

Total System Global Area 321507328 bytes

Fixed Size 2287960 bytes
Variable Size 251659944 bytes
Database Buffers 62914560 bytes
Redo Buffers 4644864 bytes

contents of Memory Script:
{
sql clone "alter system set db_name =
''BLACK'' comment=
''Reset to original value by RMAN'' scope=spfile";
sql clone "alter system reset db_unique_name scope=spfile";
}
executing Memory Script

sql statement: alter system set db_name = ''BLACK'' comment= ''Reset to original value by RMAN'' scope=spfile

sql statement: alter system reset db_unique_name scope=spfile
Oracle instance started

Total System Global Area 321507328 bytes

Fixed Size 2287960 bytes
Variable Size 251659944 bytes
Database Buffers 62914560 bytes
Redo Buffers 4644864 bytes
sql statement: CREATE CONTROLFILE REUSE SET DATABASE "BLACK" RESETLOGS ARCHIVELOG
MAXLOGFILES 16
MAXLOGMEMBERS 3
MAXDATAFILES 100
MAXINSTANCES 8
MAXLOGHISTORY 292
LOGFILE
GROUP 1 ( '/u01/app/oracle/oradata/BLACK/onlinelog/o1_mf_1_8x0z1j8b_.log', '/u01/app/oracle/fast_recovery_area/BLACK/onlinelog/o1_mf_1_8x0z1jfx_.log' ) SIZE 50 M REUSE,
GROUP 2 ( '/u01/app/oracle/oradata/BLACK/onlinelog/o1_mf_2_8x0z1ool_.log', '/u01/app/oracle/fast_recovery_area/BLACK/onlinelog/o1_mf_2_8x0z1or4_.log' ) SIZE 50 M REUSE,
GROUP 3 ( '/u01/app/oracle/oradata/BLACK/onlinelog/o1_mf_3_8x0z1vj2_.log', '/u01/app/oracle/fast_recovery_area/BLACK/onlinelog/o1_mf_3_8x0z1vqt_.log' ) SIZE 50 M REUSE
DATAFILE
'/u01/app/oracle/oradata/BLACK/datafile/o1_mf_system_8xblfbhy_.dbf'
CHARACTER SET AL32UTF8


contents of Memory Script:
{
set newname for tempfile 1 to
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_temp_8x0z27qo_.tmp";
switch clone tempfile all;
catalog clone datafilecopy "/u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8xblfbjw_.dbf",
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8xblf6lj_.dbf",
"/u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8xblf8vy_.dbf";
switch clone datafile all;
}
executing Memory Script

executing command: SET NEWNAME

renamed tempfile 1 to /u01/app/oracle/oradata/BLACK/datafile/o1_mf_temp_8x0z27qo_.tmp in control file

cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8xblfbjw_.dbf RECID=1 STAMP=819893544
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8xblf6lj_.dbf RECID=2 STAMP=819893544
cataloged datafile copy
datafile copy file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8xblf8vy_.dbf RECID=3 STAMP=819893544

datafile 3 switched to datafile copy
input datafile copy RECID=1 STAMP=819893544 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_sysaux_8xblfbjw_.dbf
datafile 4 switched to datafile copy
input datafile copy RECID=2 STAMP=819893544 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_undotbs1_8xblf6lj_.dbf
datafile 6 switched to datafile copy
input datafile copy RECID=3 STAMP=819893544 file name=/u01/app/oracle/oradata/BLACK/datafile/o1_mf_users_8xblf8vy_.dbf

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

database opened
Finished Duplicate Db at 04-JUL-13

5 réflexions sur “Duplicate From Active Database… Compressé en 12c”

  1. Donat,

    Les tests que j’ai réalisés montrent de manière évidente que la 11.2 fait du parallèlisme avec la clause FROM ACTIVE DATABASE ; il suffit pour cela d’avoir plusieurs canaux auxiliaires. Mea culpa : je vais corriger l’article en laissant les références au commentaire.

    Pour ce qui est de l’autre aspect, le trafic réseau ne semble pas pouvoir être compressé. Ou, en tout cas, je n’ai pas réussi à reproduire à l’aide de la commande fournie dans le commentaire.

    Voici le test que j’ai réalisé. J’ai mis une base de données sur 1 serveur. J’ai préparé un autre serveur pour accueillir la base de données de standby. J’ai lancé 2 outils sous root sur le serveur de standby :
    > 1. Un outil pour mesurer le trafic sur le réseau
    while true; do EX=`ifconfig eth0|grep « bytes »`; echo `date` $EX ; sleep 1; done
    > 2. Un outil pour vérifier si la chaine XoXoXoXo passe en clair sur le réseau
    tcpdump -nn -i eth0 -s0 -w – |grep XoXoXoXo

    Sur le serveur primaire, j’ai créé une table X qui contient la chaîne « XoXoXoXo »; cette base est en AL32UTF8:
    create table X(str varchar2(100)) tablespace users;
    insert into X values (‘XoXoXoXo’);
    commit;

    J’ai lancé les commandes suivantes dans RMAN :
    configure compression algorithm ‘MEDIUM’;
    configure device type disk backup type to compressed backupset parallelism 4;
    duplicate target database for standby from active database dorecover
    SPFILE
    PARAMETER_VALUE_CONVERT ‘WHITE’,’BLACK’
    SET DB_FILE_NAME_CONVERT ‘WHITE’,’BLACK’
    SET LOG_FILE_NAME_CONVERT ‘WHITE’,’BLACK’
    SET DB_UNIQUE_NAME ‘BLACK’
    SET SGA_TARGET ‘308M’
    RESET MEMORY_TARGET
    SET PGA_AGGREGATE_TARGET ’50M’;

    Je constate les 2 points suivants :
    – La chaine XoXoXoXo passe bien sur le réseau avec le tablespace users, ce qui ne devrait pas être le cas si le fichier était compressé
    – Le trafic est toujours de 1.3 Go comme dans le cas initial et la taille de ma base de données de test. Ca me parait assez logique dans la mesure où une « image copy » est une copie des fichiers.

    Je peux me tromper encore une fois et si c’est le cas, j’en serai assez ravi ! J’ai recherché un peu partout sans succès. J’ai testé en 11.2.0.3 sur Linux x86_64. La compression ne me parait bien possible qu’en 12c…

    Merci de m’indiquer (Encore !), s’il y a une erreur dans mon raisonnement ou quelque chose qui laisse supposer que la compression est bien possible en 11.2.

    Amicalement,

    Grégory

  2. Intéressant. Je vais tester…

    Je me suis cassé les dents sur ce cas jusqu’à laisser tomber DUPLICATE FROM ACTIVE DATABASE cette fonctionalité. J’ai eu tord ? Ca serait donc disponible via ACO ou est-ce que ça fonctionne avec la compression par défaut aussi ?

    1. Effectivement, après vérification, 11g fait tout à fait des image copies en parallèle. Il faut encore que je vérifie si elles sont compressées…

      Il suffit d’allouer 2 canaux auxiliaires et de faire duplicate to BLACK from active database; pour le vérifier. C’est écrit dans les logs.

      Merci. Il va falloir que je vais corrige cet article qui est un tissu de bêtise.

  3. Il y avait déjà moyen de faire un duplicate avec compression et parallélisme en Oracle 11G en utilisant les commandes suivantes:

    configure compression algorithm ‘MEDIUM’;
    configure device type disk backup type to compressed backupset parallelism 4;
    duplicate target database for standby from active database dorecover;

    Cet exemple concerne une duplication pour créer une instance standby…

Laisser un commentaire

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