PDBs kopieren: SQL vs. RMAN
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:
- Multitenant : Duplicate a Pluggable Database (PDB) to an existing Container Database (CDB) in Oracle Database 18c
- RMAN Duplicate for Pluggable Database [18cR1 New Features]
- Oracle Database 19c Backup & Recovery User’s Guide – 25.4.3 Duplicating PDBs
- MOS-Note: Step-by-Step Example of PDB Level Duplicate in 18c (Doc ID 2457397.1)
Amazon-Partner-Link: