PDBs kopieren: SQL vs. RMAN

27. Juni 2021 Aus Von Markus Flechtner

Seit der Version 12.2 der Oracle Datenbank kann man mittels des SQL-Befehles „CREATE PLUGGABLE DATABASE“ eine PDB in eine andere CDB kopieren. Mit der Version 18c kam der RMAN-Befehl „DUPLICATE PLUGGABLE DATABASE“ hinzu. Worin unterscheiden sich diese beiden Varianten des „Remote Copy“ und welche ist schneller?

TL;DR:

In meiner Testumgebung war das Kopieren via SQL deutlich schneller (etwa Faktor 3) als das Kopieren mittels RMAN. Aber wie immer gilt bei solchen Tests: „your mileage may vary“.

 

 

Meine Testumgebung ist ein Server mit Oracle 19c (RU 19.11):

oracle@kiwi:~/ [CDB19C] $ORACLE_HOME/OPatch/opatch lspatches
32545013;Database Release Update : 19.11.0.0.210420 (32545013)
32399816;OJVM RELEASE UPDATE: 19.11.0.0.210420 (32399816)
31732095;UPDATE PERL IN 19C DATABASE ORACLE HOME TO V5.32
29585399;OCW RELEASE UPDATE 19.3.0.0.0 (29585399)
OPatch succeeded.

Auf dem Server gibt es zwei CDBs, „CDB19C“ und „TRGCDB“ und im Rahmen des Testes werden wir die PDB „SAMPLEPDB“ (Größe ca. 13,5 GB) von CDB19c nach TRGCDB kopieren.

Für das Kopieren gelten natürlich die üblichen Vorraussetzungen:

  • Gleiche Default-Blockgröße in beiden CDBs
  • In der Ziel-CDB müssen (mindestens) die gleichen Optionen installiert sein, wie in der Ausgangs-CDB
  • Kompatibler Zeichensatz in der Ziel-CDB

Kopieren mittels SQL

Vorbereitungen in der Ausgangs-CDB

Common User anlegen:

SQL> CREATE USER c##remoteclone IDENTIFIED BY somepassword;
User created.

SQL> GRANT CONNECT,SYSOPER TO c##remoteclone CONTAINER=ALL;
Grant succeeded.

SQL> GRANT CREATE PLUGGABLE DATABASE TO c##remoteclone;
Grant succeeded.

Datenbank-Link vom Ziel zur Quelle anlegen

SQL> Create database link cdb19c.markusdba.local
  2  Connect to c##remoteclone identified by somepassword
  3  Using 'localhost:1521/CDB19C.markusdba.local';
Database link created.

SQL> select * from dual@cdb19c.markusdba.local;

D
-
X

PDB kopieren

set timing on
SQL> create pluggable database TRGPDB from SAMPLEPDB@cdb19c.markusdba.local
  2  file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB');
Pluggable database created.

Elapsed: 00:01:54.84

 

Danach muss die PDB noch geöffnet werden und kann dann genutzt werden.

 

Variante: Parallelität erhöhen

Über den „PARALLEL“-Parameter kann die Anzahl der Prozesse, die die Dateien kopieren, erhöht werden. Dies sorgt allerdings beim Kopieren einer PDB nur für eine geringfügige Beschleunigung des Verfahrens:

SQL> set timing on
SQL> create pluggable database TRGPDB from SAMPLEPDB@cdb19c.markusdba.local
  2  file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
  3  parallel 2;
Pluggable database created.

Elapsed: 00:01:49.32


SQL> create pluggable database TRGPDB from SAMPLEPDB@cdb19c.markusdba.local
  2  file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
  3   parallel 4;

Pluggable database created.
Elapsed: 00:01:50.52

 

Kopieren mittels RMAN

Vorbereitung: REMOTE_RECOVERY_FILE_DEST setzen

Damit eine PDB mittels RMAN kopiert werden kann, muss in der Ziel-CDB der Parameter REMOTE_RECOVERY_FILE_DEST gesetzt sein:

SQL> !mkdir -p /u01/tmp/remote_recovery_file_dest
SQL> alter system set remote_recovery_file_dest='/u01/tmp/remote_recovery_file_dest';
System altered.

PDB kopieren

Auch in diesem Test kopieren wir wieder die PDB SAMPLEPDB von der CDB CDB19C in die CDB TRGCDB. Die neue PDB soll wieder „TRGPDB“ heißen.

oracle@kiwi:~/ [TRGCDB] rman

Recovery Manager: Release 19.0.0.0.0 - Production on Sun Jun 27 14:27:23 2021
Version 19.11.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.

RMAN> connect target sys/manager@localhost:1521/CDB19c.markusdba.local
connected to target database: CDB19C (DBID=554788182)

RMAN> connect auxiliary sys/manager@localhost:1521/TRGCDB.markusdba.local
connected to auxiliary database: TRGCDB (DBID=350326552)

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 1000M;


Starting Duplicate PDB at 27.06.2021 14:30:07
using target database control file instead of recovery catalog
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=130 device type=DISK
current log archived
duplicating Online logs to Oracle Managed File (OMF) location
current log archived

Contents of Memory Script:
{
   set newname for datafile  8 to
 "/u01/oradata/TRGCDB/TRGPDB/system01.dbf";
   set newname for datafile  9 to
 "/u01/oradata/TRGCDB/TRGPDB/sysaux01.dbf";
   set newname for datafile  10 to
 "/u01/oradata/TRGCDB/TRGPDB/undotbs01.dbf";
   set newname for datafile  11 to
 "/u01/oradata/TRGCDB/TRGPDB/airport_data_01.dbf";
   set newname for datafile  12 to
 "/u01/oradata/TRGCDB/TRGPDB/flightdata01.dbf";
   set newname for datafile  13 to
 "/u01/oradata/TRGCDB/TRGPDB/example01.dbf";
   restore
   from  nonsparse   section size
 1000 m   clone foreign pluggable database
    "SAMPLEPDB"
   from service  'localhost:1521/CDB19c.markusdba.local'   ;
}

executing Memory Script
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME
executing command: SET NEWNAME

Starting restore at 27.06.2021 14:30:12
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring section 1 of 1
channel ORA_AUX_DISK_1: restoring foreign file 8 to /u01/oradata/TRGCDB/TRGPDB/system01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:16
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring section 1 of 1
channel ORA_AUX_DISK_1: restoring foreign file 9 to /u01/oradata/TRGCDB/TRGPDB/sysaux01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15

[…]

channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring section 12 of 12
channel ORA_AUX_DISK_1: restoring foreign file 12 to /u01/oradata/TRGCDB/TRGPDB/flightdata01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:25
channel ORA_AUX_DISK_1: starting datafile backup set restore
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_AUX_DISK_1: restoring section 1 of 1
channel ORA_AUX_DISK_1: restoring foreign file 13 to /u01/oradata/TRGCDB/TRGPDB/example01.dbf
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:15
Finished restore at 27.06.2021 14:36:13

contents of Memory Script:
{
   set archivelog destination to  '/u01/tmp/remote_recovery_file_dest';
   restore clone force from service  'localhost:1521/CDB19c.markusdba.local'
           foreign archivelog from scn  2833866;
}

executing Memory Script
executing command: SET ARCHIVELOG DESTINATION

Starting restore at 27.06.2021 14:36:13
using channel ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: starting archived log restore to user-specified destination
archived log destination=/u01/tmp/remote_recovery_file_dest
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=43
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to user-specified destination
archived log destination=/u01/tmp/remote_recovery_file_dest
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=44
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
channel ORA_AUX_DISK_1: starting archived log restore to user-specified destination
archived log destination=/u01/tmp/remote_recovery_file_dest
channel ORA_AUX_DISK_1: using network backup set from service localhost:1521/CDB19c.markusdba.local
channel ORA_AUX_DISK_1: restoring archived log
archived log thread=1 sequence=45
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 27.06.2021 14:36:16

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 14:36:29

Nach dem Kopieren mittels RMAN ist die PDB direkt geöffnet.

Im Test dauert das Kopieren – inkl. dem automatischen Öffnen der PDB – 6:22 und damit etwa dreimal so lange wie das Kopieren mit dem SQL-Befehl „CREATE PLUGGABLE DATABASE“.

Die Daten, die in der REMOTE_RECOVERY_FILE_DEST abgelegt wurden, können dann gelöscht werden:

oracle@kiwi:~/ [TRGCDB] ls -ltr /u01/tmp/remote_recovery_file_dest
total 56
-rw-r-----. 1 oracle oinstall  2560 Jun 27 14:36 1_43_1073605014.dbf
-rw-r-----. 1 oracle oinstall  3584 Jun 27 14:36 1_44_1073605014.dbf
-rw-r-----. 1 oracle oinstall 46080 Jun 27 14:36 1_45_1073605014.dbf

 

Variante: COMPRESSED BACKUPSET

In diesem Test kopieren wir die PDB zwischen zwei CDBs auf dem gleichen Server. Wenn die PDB zwischen zwei Servern kopiert werden soll, dann kann es sich lohnen, mit einem „COMPRESSED BACKUPSET“ zu arbeiten: Vorteil: geringere Datenmenge, die über das Netzwerk transportiert werden muss; Nachteil: höhere CPU-Last.

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> using compressed backupset
5> section size 1000M;

Starting Duplicate PDB at 27.06.2021 14:42:49
[...]
Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 14:54:36



In dieser Variante dauert das Kopieren etwa 12 Minuten, d.h. etwa doppelt so lange wie das Kopieren mit unkomprimiertem Backup-Set. Das Komprimieren bringt also keinen Vorteil.

Während des Testes war die CPU des Test-Servers zu keiner Zeit kritisch ausgelastet.

Variante: kleinere Section Size

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 100M;

Starting Duplicate PDB at 27.06.2021 14:57:46
[...]
Finished restore at 27.06.2021 15:05:26

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 15:05:37

Mit kleinerer Section Size (100MB) dauert der Kopiervorgang etwa 2 Minuten länger als beim ursprünglichen Test mit 1000 MB Section-Größe.

 

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 500M;

Starting Duplicate PDB at 27.06.2021 15:39:34
[...]
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 27.06.2021 15:46:49

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 15:47:02

Auch mit 500 MB Section Size dauert es etwas länger als im ursprünglichen Test. Eine Verkleinerung der Section Size scheint also keine Vorteile zu bringen

 

Variante: größere Section Size

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 2000M;

Starting Duplicate PDB at 27.06.2021 15:08:04
[…]

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 15:14:16

 

Mit etwa 6 Minuten dauert es genauso lange wie mit einer Section Size von 1000MB. Eine Vergrößerung scheint also auch keine Verbesserung zu bringen. 1000 MB sind aus Performance-Sicht anscheinend eine gute  Größe für den „DUPLICATE PLUGGABLE DATABASE“.

 

Variante: Parallelität erhöhen

Testen wir das Kopieren doch auch mal mit einer Parallelität von 2 und 4:

RMAN> configure device type disk parallelism 2;
using target database control file instead of recovery catalog
old RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 1 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters are successfully stored

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 1000M;

Starting Duplicate PDB at 27.06.2021 15:53:59
allocated channel: ORA_AUX_DISK_1
channel ORA_AUX_DISK_1: SID=248 device type=DISK
allocated channel: ORA_AUX_DISK_2
channel ORA_AUX_DISK_2: SID=128 device type=DISK
current log archived
duplicating Online logs to Oracle Managed File (OMF) location
[...]
archived log thread=1 sequence=74
channel ORA_AUX_DISK_2: restore complete, elapsed time: 00:00:00
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:01
Finished restore at 27.06.2021 15:59:14

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 15:59:25


RMAN> configure device type disk parallelism 4;
using target database control file instead of recovery catalog
old RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 2 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters:
CONFIGURE DEVICE TYPE DISK PARALLELISM 4 BACKUP TYPE TO BACKUPSET;
new RMAN configuration parameters are successfully stored

RMAN> duplicate pluggable database SAMPLEPDB as TRGPDB to TRGCDB
2> db_file_name_convert=('CDB19C/SAMPLEPDB','TRGCDB/TRGPDB')
3> from active database
4> section size 1000M;

Starting Duplicate PDB at 27.06.2021 16:04:46
allocated channel: ORA_AUX_DISK_1
[...]

archived log thread=1 sequence=78
channel ORA_AUX_DISK_1: restore complete, elapsed time: 00:00:00
channel ORA_AUX_DISK_2: restore complete, elapsed time: 00:00:00
channel ORA_AUX_DISK_3: restore complete, elapsed time: 00:00:01
Finished restore at 27.06.2021 16:09:47

Performing import of metadata...
Finished Duplicate PDB at 27.06.2021 16:09:58

 

Mit einer Parallelität von 2 ergibt sich eine Verbesserung (auf 5:26); eine weitere Verdoppelung der Parallelität auf 4 zeigt eine leichte Verbesserung (5:12). Bei einer Parallelität von 8 (ohne Output in diesem Blog-Post) wird die PDB in 4:56 Minuten kopiert.

 

Zusammenfassung

Performance-mäßig ist das Kopieren mittels SQL („CREATE PLUGGABLE DATABASE“) dem „DUPLICATE PLUGGABLE DATABASE“ im RMAN anscheinend deutlich überlegen.

Dem gegenüber steht ein etwas höherer Vorbereitungsaufwand (Common User anlegen, wenn man keinen Standard-User wie z.B. SYSTEM nutzen will, und Anlegen des Datenbank-Links). Beides (Common User und Datenbank-Link) sollte man aus Sicherheitsgründen natürlich nach Abschluss der Kopier-Aktion löschen.

 

Links, MOS-Notes und Referenzen:

 

 

Amazon-Partner-Link: