RMAN DUPLICATE CDB e PDB

La duplicazione di un db tipicamente serve per creare un db da testare e successivamente apportare le modifiche sul db sorgente.
Può essere duplicato un intero CDB, solo il root o un PDB.

In questo post duplicheremo tramite RMAN un container db e i suoi pdb, che si chiama CDB19L01 in CDB19L02.

Il database è una versione 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0.

Collegarsi come sys al CDB sorgente:

SQL> show pdbs
CON_ID CON_NAME       OPEN MODE       RESTRICTED
---------- ------------------------------ ---------- -----------------
2   PDB$SEED                     READ ONLY        NO
3   PDL01                             READ WRITE      NO
4   RCATPDB                       READ WRITE      NO

SQL> alter session set container=PDL01;

Il PDL01 contiene la seguente tabella che deve essere duplicata nel nuovo CDB.

SQL> select * from user1.emp;

         X
----------
         1
         2
         2
         3
         4

on SOURCE DATABASE (CDB19L01)
STEP 1 - Creare sotto $ORACLE_HOME/dbs il file initCDB19L01.ora

$ sqlplus SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 23 12:35:00 2021 Version 19.3.0.0.0 Copyright (c) 1982, 2019, Oracle. All rights reserved. Enter user-name: /as sysdba Connected to: Oracle Database 19c Enterprise Edition Release 19.0.0.0.0 - Production Version 19.3.0.0.0
Assicuriamoci che stia usando un spfile
SQL> show parameter spfile NAME TYPE VALUE ---------------- ----------- ------------------------------ spfile string /u01/app/oracle/product/19.0.0/dbhome_1/dbs/spfileCDB19L01.ora
SQL> create pfile='/u01/app/oracle/product/19.0.0/dbhome_1/dbs/initCDB19L02.ora'
from spfile;

Spostare il file nel server target.

on TARGET DATABASE (CDB19L02)
STEP 2 - Modificare l'initialization parameter file (PFILE) initCDB19L02.ora
- sostituire CDB19L01 con CDB19L02
- aggiungere i parametri
*.enable_pluggable_database=TRUE
*.db_file_name_convert = ('/u01/app/oracle/oradata/CDB19L01/','/u01/app/oracle/oradata/CDB19L02/')
*.log_file_name_convert = ('/u01/app/oracle/oradata/CDB19L01/','/u01/app/oracle/oradata/CDB19L02/')
*.audit_file_dest = '/home/oracle/u01/app/oracle/oradata/AUX1/audit'
*.remote_recovery_file_dest='/u01/app/oracle/fast_recovery_area'
*.local_listener lasciare il valore del db target se si duplica sullo stesso server

RMAN crea a partire da questo file il control file, data file e redolog file e audti file con la struttura definita nei parametri db_file_name_convert e log_file_name_convert pertanto occorre creare le directory di destinazione mancanti:
mkdir /u01/app/oracle/oradata/CDB19L02
mkdir -p /u01/app/oracle/fast_recovery_area/CDB19L02
mkdir -p /u01/app/oracle/admin/
CDB19L02/adump

on SOURCE DATABASE (CDB19L01)
STEP 3 - Copiare nel servere target, il file delle password del db sorgente presente sotto $ORACLE_HOME/dbs.
Questo è possibile solo se source e destination hosts sono la stessa piattaforma.
cp orapwCDB19L01 orapwCDB19L02

on TARGET DATABASE (CDB19L02)
STEP 4 -Effettuare lo start dell’istanza ausilaria in modalità nomount perchè non abbiamo il control file.

$ export ORACLE_SID=CDB19L02
$ sqlplus
SQL*Plus: Release 19.0.0.0.0 - Production on Fri Apr 23 14:01:20 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle.  All rights reserved.
Enter user-name: /as sysdba
Connected to an idle instance.

SQL> startup nomount pfile=$ORACLE_HOME/dbs/initCDB19L02.ora
ORACLE instance started.
Total System Global Area 3992977296 bytes
Fixed Size                  9142160 bytes
Variable Size            1258291200 bytes
Database Buffers         2717908992 bytes
Redo Buffers                7634944 bytes

Verificare lo stato con la query seguente.
SQL> select instance_name, status,database_status from V$INSTANCE;

Al suo avvio viene montato il nuovo control file e il listener registra il nuovo db. 
Infatti l’istanza è individuata

[oracle@coslab02 dbs]$ ps -ef | grep pmon
oracle    5479     1  0 14:01 ?        00:00:00 ora_pmon_CDB19L02
oracle    5868 32183  0 14:08 pts/0    00:00:00 grep --color=auto pmon
oracle   29121     1  0 Apr16 ?        00:01:46 ora_pmon_CDB19L01

on TARGET DATABASE (CDB19L02)
STEP 5 - Poichè RMAN effettuerà lo shutdown della istanza auxiliaria diverse volte durante la duplicazione, la connessione alla stessa potrebbe fallire quindi occorre creare un static entry per il databse auxiliary nel file listener.ora del database auxiliary e poi riavviare il listener.

$ vi listener.ora
SID_LIST_LISTENER=
(SID_LIST=
        (SID_DESC=
                (GLOBAL_DBNAME=CDB19L01)
                (ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1)
                (SID_NAME=CDB19L01)
        )
)

Modificare il file tnsnames.ora aggiungendo la nuova stringa di connessione
CDB19L02 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = coslab02)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
        (UR=A)
      (SERVICE_NAME = CDB19L02)
    )
  )

L'opzione UR=A è stat introdotta dalla versione Oracle10G perchè ogni tentativo di connessione all'istanza avviata in stato nomount avrebbe restituito il messaggio
"ORA-12528: TNS:listener: all appropriate instances are blocking new connections"
Questa modifica non funzione per ACTIVE DUPLICATE.


on TARGET DATABASE (CDB19L02)
STEP 6 - Impostare il SID del db target e lanciare RMAN. 
Questa è una duplicazione basata sul db target.

$ export ORACLE_SID=CDB19L02
rman target sys/xxxxx0@CDB19L01 auxiliary sys/xxxxx0@CDB19L02

Recovery Manager: Release 19.0.0.0.0 - Production on Fri Apr 23 15:03:49 2021
Version 19.3.0.0.0
Copyright (c) 1982, 2019, Oracle and/or its affiliates.  All rights reserved.
connected to target database: CDB19L01 (DBID=440264890)
connected to auxiliary database: CDB19L02 (not mounted)

RMAN > duplicate database to CDB19L02 from active database NOFILENAMECHECK;

Starting Duplicate Db at 26-APR-21
using target database control file instead of recovery catalog
........................................
............................................
contents of Memory Script:
{
Alter clone database open resetlogs;
}
executing Memory Script
database opened
contents of Memory Script:
{
sql clone "alter pluggable database all open";
}
executing Memory Script
sql statement: alter pluggable database all open
Cannot remove created server parameter file
Finished Duplicate Db at 26-APR-21

on TARGET DATABASE (CDB19L02)
STEP 7 -Verificare lo stato del database duplicato.

SQL> select instance_name, status,database_status from V$INSTANCE;

INSTANCE_NAME    STATUS       DATABASE_STATUS
---------------- ------------ -----------------
CDB19L02         OPEN         ACTIVE

SQL> show pdbs

    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 PDL01                          READ WRITE NO
         4 RCATPDB                        READ WRITE NO

SQL> alter session set container=PDL01 ;

SQL> select * from user1.emp;
         X
----------
         1
         2
         2
         3
         4

La tabella user1.emp è stata duplicata correttamente.

Post popolari in questo blog

Create e Drop Pluggable Database

ORA-12154: TNS: il listener non è attualmente a conoscenza del servizio richiesto nel descrittore di connessione