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.
Pingback: ALL options for creating a PDB using Create Puggable Database command – Bruno Santos da Silva