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.
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- -----------------
2 PDB$SEED READ ONLY NO
3 PDL01 READ WRITE NO
4 RCATPDB READ WRITE NO
Spostare il file nel server target.
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
Al suo avvio viene montato il nuovo control file e il listener registra il nuovo db.
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 pdbsCON_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;
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
- 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
mkdir -p /u01/app/oracle/admin/CDB19L02/adump
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;
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
$ vi listener.ora
SID_LIST_LISTENER=
Questa modifica non funzione per ACTIVE DUPLICATE.
[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"
on TARGET DATABASE (CDB19L02)
STEP 6 - Impostare il SID del db target e lanciare RMAN. Questa è una duplicazione basata sul db target.
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)$ 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;
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
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.