Unplugging and Plugging PDB
Unplugging e Plugging PDB consiste nello sganciare un pdb e agganciarlo su un altro container o sullo stesso.
1) Collegarsi al root container come sysdba e aprire tutti i pdb.
SQL> show con_nameCON_NAME
------------------------------
CDB$ROOT
SQL> alter pluggable database all open;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------------------ ----------
2 PDB$SEED READ ONLY NO
3 ORCLPDB READ WRITE NO
4 PDB5 READ WRITE NO
2) Chiudere il pdb che si vuole sganciare. In questo caso è pdb5.
SQL> alter pluggable database pdb5 close immediate;
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- -------------------------------------------------------------
4 PDB5 MOUNTED
3) Creare un file xml che contiene i metadati del pdb da unplugged. Attenzione i file xml non contiene i dati (datafiles) ma solo la struttura del pdb.
SQL> alter pluggable database pdb5 unplug into '/u01/app/oracle/oradata/pdb5.xml';
Pluggable database altered.
4) Spostare manualmente il file ".xml" e tutti i corrispondenti datafiles nel server di destinazine se diverso dalla sorgente.
SQL> drop pluggable database pdb5 keep datafiles;
Pluggable database dropped.
SQL> select con_id,name,open_mode from v$pdbs;
CON_ID NAME OPEN_MODE
------------------------- ------------------------- ----------
2 PDB$SEED READ ONLY
3 ORCLPDB READ WRITE
Il pdb5 non è più presente ma se si accede alla sua direcorty sono ancora presente i datafile.
[oracle@test pdb5]$ cd $ORACLE_BASE/oradata/ORCL/pdb5
[oracle@test pdb5]$ ls -lrt
total 793632
-rw-r----- 1 oracle oinstall 5251072 Sep 3 15:24 users01.dbf
-rw-r----- 1 oracle oinstall 104865792 Sep 3 15:24 undotbs01.dbf
-rw-r----- 1 oracle oinstall 408952832 Sep 3 15:24 sysaux01.dbf
-rw-r----- 1 oracle oinstall 293609472 Sep 3 15:24 system01.dbf
[oracle@test pdb5]$ scp * oralce@server2: $ORACLE_BASE/oradata/ORCL/pdb5/
[oracle@test pdb5]$ scp /u01/app/oracle/oradata/pdb5.xml oralce@server2: /u01/app/oracle/oradata/
Attenzione sul server di destinazione creare la stessa directory del server sorgente.
Se invece il pdb viene creato sotto lo stesso server non c'è bisogno di spostare i datafiles e il file xml.
5) Verificare la compatibilità: se lo spostamento fatto sullo stesso container root non è necessaria.
DECLARE
l_result BOOLEAN;
BEGIN
l_result := DBMS_PDB.check_plug_compatibility(
pdb_descr_file => '/u01/app/oracle/oradata/pdb5.xml',
pdb_name => 'PDB5');
IF l_result THEN
DBMS_OUTPUT.PUT_LINE('compatible');
ELSE
DBMS_OUTPUT.PUT_LINE('incompatible');
END IF;
END;
5) Effettuare il plug del pdb5 che sarà rinominato in pdbtest usando il file xml generato.
SQL> CREATE PLUGGABLE DATABASE pdbtest
USING '/u01/app/oracle/oradata/pdb5.xml'
COPY
FILE_NAME_CONVERT=('/u01/app/oracle/oradata/ORCL/pdb5/',
'/u01/app/oracle/oradata/ORCL/pdbtest/')
6) Verifica
SQL> select name,con_id,open_mode from v$pdbs ;
NAME CON_ID OPEN_MODE
------------------------- ---------- --------------------
PDB$SEED 2 READ ONLY
ORCLPDB 3 READ WRITE
PDBTEST 5 MOUNTED
Viene creata in automatico la directory pdbtest su filesystem.
SQL> alter session set container=pdbtest;
SQL> alter pluggable database pdbtest open;
Come ulteriore verifica controllare che ci siano le tabelle di un utente definito in pdb5. Nel nostro caso è hr:
SQL> select * from dba_tables where owner='HR';
SQL> select con_id,file#,name from v$datafile;
CON_ID FILE# NAME
---------- ---------- --------------------------------------------------------------------
5 33 /u01/app/oracle/oradata/ORCL/pdbtest/system01.dbf
5 34 /u01/app/oracle/oradata/ORCL/pdbtest/sysaux01.dbf
5 35 /u01/app/oracle/oradata/ORCL/pdbtest/undotbs01.dbf
5 36 /u01/app/oracle/oradata/ORCL/pdbtest/users01.dbf