Creating a new PDB by Plugging in an Unplugged PDB (with NOCOPY clause)

Outra maneira de se criar PDBs é usando os recursos de PLUG/UNPLUG. Neste artigo vou explorar um pouco sobre esse método.

Irei utilizar um PDB já existente em meu laboratório, chamado HIPOFISE2. Checando os seus arquivos de dados:

[oracle@oel8 ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Mar 18 04:32:44 2021
Version 18.3.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.3.0.0.0
 
SQL> set linesize 100
SQL> col name format a100
SQL> SELECT NAME FROM V$DATAFILE WHERE CON_ID = (SELECT CON_ID FROM V$PDBS WHERE NAME='HIPOFISE2');
 
NAME
----------------------------------------------------------------------------------------------------
/oracle/dados/TALAMO/BD02D62DBD0C163FE0536B00A8C0EF43/datafile/o1_mf_system_j4cpg63g_.dbf
/oracle/dados/TALAMO/BD02D62DBD0C163FE0536B00A8C0EF43/datafile/o1_mf_sysaux_j4cpg640_.dbf
/oracle/dados/TALAMO/BD02D62DBD0C163FE0536B00A8C0EF43/datafile/o1_mf_undotbs1_j4cpg640_.dbf
/oracle/dados/TALAMO/BD02D62DBD0C163FE0536B00A8C0EF43/datafile/o1_mf_users_j4cpgr31_.dbf

Verificando seu identificador único, chamado de GUID:

SQL> SELECT GUID FROM V$PDBS WHERE NAME='HIPOFISE2';
 
GUID
--------------------------------
BD02D62DBD0C163FE0536B00A8C0EF43

Baixando o banco de origem (ou seja, essa operação possui downtime, pois precisamos garantir que os datafiles estejam íntegros, basicamente com o mesmo SCN):

SQL> ALTER PLUGGABLE DATABASE HIPOFISE2 CLOSE IMMEDIATE;
 
Pluggable database altered.

Quando realizamos o UNPLUG do PDB, realizamos a criação de um arquivo XML que possui várias informações básicas sobre o banco, para que seja aproveitado no processo de PLUG posteriormente:

SQL> ALTER PLUGGABLE DATABASE HIPOFISE2 UNPLUG INTO '/home/oracle/HIPOFISE2.xml';
 
Pluggable database altered.

Verificando parte do conteúdo do XML:

SQL> !cat /home/oracle/HIPOFISE2.xml
<?xml version="1.0" encoding="UTF-8"?>
<PDB>
  <xmlversion>1</xmlversion>
  <pdbname>HIPOFISE2</pdbname>
  <cid>4</cid>
  <byteorder>1</byteorder>
  <vsn>301989888</vsn>
  <vsns>
    <vsnnum>18.0.0.0.0</vsnnum>
    <cdbcompt>18.0.0.0.0</cdbcompt>
    <pdbcompt>18.0.0.0.0</pdbcompt>
    <vsnlibnum>0.0.0.0.24</vsnlibnum>
    <vsnsql>24</vsnsql>
    <vsnbsv>8.0.0.0.0</vsnbsv>
  </vsns>
  <dbid>3888186776</dbid>
 
...
 
<loadprofile>user calls=4.087375</loadprofile>
      <loadprofile>user commits=0.905013</loadprofile>
      <loadprofile>user logons cumulative=0.001258</loadprofile>
      <loadprofile>user rollbacks=0.016129</loadprofile>
    </awr>
    <hardvsnchk>0</hardvsnchk>
    <localundo>1</localundo>
    <apps/>
    <dbedition>8</dbedition>
  </optional>
</PDB>
 
SQL>

Apesar do UNPLUG tenha sido realizado, o PDB ainda faz parte do catálogo do CDB$ROOT:

SQL> SELECT PDB_NAME, STATUS FROM CDB_PDBS WHERE PDB_NAME IN ('HIPOFISE2');
 
PDB_NAME
----------------------------------------------------------------------------------------------------
STATUS
----------
HIPOFISE2
UNPLUGGED

Apenas dropando o PDB é que temos o seu vínculo encerrado no CDB. Neste caso, apesar de remover o banco, vamos manter os seus datafiles com o parâmetro abaixo:

SQL> DROP PLUGGABLE DATABASE HIPOFISE2 KEEP DATAFILES;
 
Pluggable database dropped.

Consultando novamente e confirmando que o HIPOFISE2 não faz mais parte do ambiente:

SQL> SELECT PDB_NAME, STATUS FROM CDB_PDBS WHERE PDB_NAME IN ('HIPOFISE2');
 
no rows selected

Neste lab, vou plugar o PDB no mesmo CDB, mas em cenários reais, a intenção é realizar este tipo de movimentação entre CDBs diferentes. Desse modo, há um procedimento para que consigamos checar se o novo PDB será compatível com o CDB de destino. Podemos realizar isso através do objeto DBMS_PDB.CHECK_PLUG_COMPATIBILITY. Em caso de erros, podemos ver as mensagens em mais detalhes na view PDB_PLUG_IN_VIOLATIONS. Essa atividade realiza a leitura do arquivo XML que criamos anteriormente:

SQL> set serveroutput on
DECLARE
        compatible BOOLEAN := FALSE;
BEGIN
        compatible := DBMS_PDB.CHECK_PLUG_COMPATIBILITY( PDB_DESCR_FILE => '/home/oracle/HIPOFISE2.xml');
        if compatible then
                DBMS_OUTPUT.PUT_LINE('It is compatible');
        else
        DBMS_OUTPUT.PUT_LINE('It is NOT compatible');
        end if;
END;
/SQL>   2    3    4    5    6    7    8    9   10   11
It is compatible
 
PL/SQL procedure successfully completed.

Agora podemos criar o novo PDB com o recurso de PLUG IN. Como o diretório onde os datafiles é exatamente o mesmo que o da origem, e queremos usar estes mesmos arquivos, utilizamos o parâmetro NOCOPY:

SQL> CREATE PLUGGABLE DATABASE HIPOFISE3 USING '/home/oracle/HIPOFISE2.xml' NOCOPY TEMPFILE REUSE;
 
Pluggable database created.

Checando o status do novo PDB e o abrindo:

SQL> col pdb_name format a15
SQL> SELECT PDB_NAME, STATUS FROM CDB_PDBS WHERE PDB_NAME='HIPOFISE3';
 
PDB_NAME        STATUS
--------------- ----------
HIPOFISE3       NEW
 
SQL> SELECT OPEN_MODE FROM V$PDBS WHERE NAME='HIPOFISE3';
 
OPEN_MODE
----------
MOUNTED
 
SQL> ALTER PLUGGABLE DATABASE HIPOFISE3 OPEN;
 
Pluggable database altered.

Realizando teste de conexão:

SQL> connect sys/oracle@oel8.localdomain:1521/HIPOFISE3.localdomain as SYSDBA
Connected.
SQL> SHOW CON_NAME CON_ID;
 
CON_NAME
------------------------------
HIPOFISE3
 
CON_ID
------------------------------
4

Validando que o identificador GUID é o mesmo do PDB de origem:

SQL> SELECT GUID FROM V$PDBS WHERE NAME='HIPOFISE3';
 
GUID
--------------------------------
BD02D62DBD0C163FE0536B00A8C0EF43

Por fim, removendo arquivo XML que não será mais utilizado:

SQL> !rm /home/oracle/HIPOFISE2.xml

Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.

1 thought on “Creating a new PDB by Plugging in an Unplugged PDB (with NOCOPY clause)”

  1. Pingback: ALL options for creating a PDB using Create Puggable Database command – Bruno Santos da Silva

Leave a Comment

Your email address will not be published.