Para melhor visualização, recomendo resolução de no mínimo 1280 x 800 e navegador Mozilla Firefox


quarta-feira, 5 de março de 2014

Oracle Multitenant: Clonando e movendo Pluggable Databases (PDB) entre Container Databases (CDB) no Oracle 12c

Por Eduardo Legatti

Olá,

No artigo de Fevereiro/2014 fiz uma breve introdução sobre a arquitetura Multitenant do Oracle 12c abordando a criação dos bancos de dados de forma prática e apresentando alguns conceitos por trás dos bancos de dados de containers (CDBs) e dos bancos de dados plugáveis (PDBs). Neste artigo irei abordar o conceito de plugar (plug) e desplugar (unplug) os banco de dados PDBs. Irei demonstrar as etapas para mover um banco de dados PDB para um outro banco de dados CDB e também demonstrar o processo de clonagem de um banco de dados PDB dentro de um mesmo banco de dados CDB. Irei realizar a demonstração utilizando tanto o DBCA quanto o processo manual através do SQL*Plus. A figura abaixo ilustra muito bem o que eu irei abordar a seguir.


 

Movendo um PDB para outro container root CDB com o DBCA

Abaixo irei demonstrar o processo de desplugar o banco de dados plugável PDB02 do banco de dados CDB01 com o intuito de plugá-lo mais a frente no banco de dados CDB02 que foi criado previamente. Segue abaixo as etapas para realizar o processo de "unplug" através do DBCA.









Após o processo de desplugar o banco de dados PDB02 do banco de dados de container CDB01, veremos abaixo os arquivos que foram gerados. No meu exemplo eu usei como destino o diretório C:\TEMP.

C:\>dir TEMP
 O volume na unidade C não tem nome.
 O Número de Série do Volume é 26BD-71DB

 Pasta de C:\TEMP

05/03/2014  08:42       199.667.673 CDB01_PDB02.tar.gz
05/03/2014  08:41             3.688 CDB01_PDB02.xml
               2 arquivo(s)    199.671.361 bytes
               2 pasta(s)   10.368.245.760 bytes disponíveis


A seguir irei realizar o processo de plugar o banco de dados PDB02 contido nos arquivos acima no banco de dados container CDB02 através do DBCA. Seguindo os mesmos procedimentos demonstrados no processo de "unplug", na tela de gerenciar banco de dados plugáveis, irei escolher a opção de criar um banco de dados plugável e escolher a instância CDB02 conforme demonstrado abaixo.









Após a criação do banco de dados PDB02 no container CDB02, poderemos ver que o mesmo já se encontra aberto e no estado READ WRITE conforme demonstrado abaixo.

C:\>set ORACLE_SID=CDB02

C:\>sqlplus / as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Qua Mar 5 09:15:28 2014

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> select pdb_name, status from cdb_pdbs;

PDB_NAME              STATUS
--------------------- -------------
PDB$SEED              NORMAL
PDB02                 NORMAL

SQL> select name, open_mode from v$pdbs;

NAME                    OPEN_MODE
----------------------- ----------
PDB$SEED                READ ONLY
PDB02                   READ WRITE  

Identifiquei que os arquivos relacionados ao banco de dados PDB02 do container CDB01 não foram apagados fisicamente após o processo de "unplug". No mais, o banco de dados PDB02 que foi desplugado do container root CDB01 poderá ser criado (plugado) novamente no container root CDB01 do mesmo modo que foi realizado no container root CDB02.


Movendo um PDB para outro container root CDB com o SQL*Plus

Do mesmo modo que realizei o processo de unplug/plug através da interface gráfica com o DBCA, irei realizar o mesmo processo, só que agora de forma manual utilizando o SQL*Plus. Vale a pena salientar que quando um PDB está plugado em um CDB, este CDB mantém informações de seus metadados como o nome do PDB enquanto ele está plugado ao CDB e os nomes e caminhos dos data files. Algumas informações estão presentes nas tabelas de dicionário de dados e nos control files do container root CDB. Como foi demonstrado acima, o processo de "unplug" estes metadados são gravados em um arquivo XML acompanhados dos seus data files. O processo manual é um pouco diferente já que não teremos um arquivo .TAR.GZ contendo os data files do PDB. Segue abaixo o processo manual de "unplug" através de comandos SQL.

C:\>set ORACLE_SID=CDB01

C:\>sqlplus / as sysdba

SQL> alter pluggable database PDB02 close immediate;

Banco de dados plugável alterado.

SQL> alter pluggable database PDB02 unplug into 'C:\TEMP\PDB02.XML';

Banco de dados plugável alterado. 

O processo de desplugar o banco de dados PDB através de comandos SQL é bastante simples. Como demonstrado acima, foi necessário apenas realizar o SHUTDOWN do banco de dados PDB e executar o comando ALTER PLUGGABLE DATABASE ... UNPLUG definindo o destino do arquivo XML contendo os metadados do banco de dados. Agora irei plugar banco de dados PDB02 no banco de dados container CDB02 manualmente como demonstrado a seguir.

C:\>set ORACLE_SID=CDB02

C:\>sqlplus / as sysdba

SQL> create pluggable database PDB02
  2  using 'C:\TEMP\PDB02.XML'
  3  copy file_name_convert =
  4  (
  5   'D:\oracle\app\oradata\CDB01\PDB02',
  6   'D:\oracle\app\oradata\CDB02\PDB02'
  7  );

Banco de dados plugável criado.

SQL> alter pluggable database PDB02 open;

Banco de dados plugável alterado. 

Como demonstrado acima, o processo de plugar o banco de dados PDB nada mais é do que criar um banco de dados PDB utilizando como fonte de informação o arquivo de metadados XML gerado no processo de unplug. O processo também consiste em copiar os data files através da cláusula COPY do comando CREATE PLUGGABLE DATABASE.


Plugando o PDB de volta ao container root CDB de origem

Se eu tentar plugar novamente o banco de dados PDBD02 no container root CDB01, o erro ORA-65012 será emitido informando que o banco de dados plugável PDB02 já existe. Ele existe, mas foi desplugado. Em um primeiro momento isso pode ser bem confuso. Portanto, irei dropar o banco de dados PDB02 sem remover os seus data files.

C:\>set ORACLE_SID=CDB01

C:\>sqlplus / as sysdba

SQL> select pdb_name, status from cdb_pdbs;

PDB_NAME                                STATUS
--------------------------------------- -------------
PDB$SEED                                NORMAL
PDB01                                   NORMAL
PDB02                                   UNPLUGGED

SQL> drop pluggable database PDB02 keep datafiles;

Banco de dados plugável eliminado.  

Com o banco de dados PDB02 dropado, irei criá-lo novamente reaproveitando os datas files existentes.

SQL> create pluggable database PDB02
  2  using 'C:\TEMP\PDB02.XML' nocopy tempfile reuse;

Banco de dados plugável criado.

SQL> alter pluggable database PDB02 open;

Banco de dados plugável alterado.   

Clonando um PDB em um mesmo container root CDB

A arquitetura Multitenant do Oracle 12c nos permite criar o clone de um PDB em um mesmo CDB. Já que o DBCA não nos fornece esse tipo de opção, nos resta apenas o processo manual através de comandos SQL. Fazendo uso do SQL*Plus, conectarei no banco de dados de container CDB01, e demonstrarei um exemplo de clonagem de PDBs. Irei criar abaixo o banco de dados PDB03 que será um clone do banco de dados PDB01.

C:\>set ORACLE_SID=CDB01

C:\>sqlplus / as sysdba

SQL> alter pluggable database PDB01 close immediate;

Banco de dados plugável alterado.

SQL> alter pluggable database PDB01 open read only;

Banco de dados plugável alterado.

SQL> create pluggable database PDB03 from PDB01
  2  file_name_convert =
  3  (
  4   'D:\oracle\app\oradata\CDB01\PDB01',
  5   'D:\oracle\app\oradata\CDB01\PDB03'
  6  );

Banco de dados plugável criado. 

Pronto. A clonagem do banco de dados PDB01 foi realizada utilizando o comando CREATE PLUGGABLE DATABASE ... FROM ... conforme demonstrado acima. Vale a pena salientar que o banco de dados de origem PDB01 foi fechado e seu status alterado para READ ONLY da mesma forma que o banco de dados de template PDB$SEED. Após o processo de clonagem, poderemos ver abaixo que o banco de dados PDB03 permaneceu no estado MOUNT. Já que ambos os bancos de dados PDB01 e PDB03 não se encontram no estado READ/WRITE, poderemos alterar os status dos mesmos com um único comando conforme demonstrado a seguir.

SQL> select name, open_mode from v$pdbs;

NAME                                   OPEN_MODE
-------------------------------------- ----------
PDB$SEED                               READ ONLY
PDB01                                  READ ONLY
PDB02                                  READ WRITE
PDB03                                  MOUNTED

SQL> alter pluggable database PDB01,PDB03 open read write force;

Banco de dados plugável alterado. 

Dependendo do ambiente de banco de dados em questão, o processo de clonagem talvez não seja o mais adequado para um ambiente de produção já que o banco de dados PDB de origem precisará ficar indisponível para acesso de escrita por um determinado período até a finalização do processo de clonagem. Acredito que o processo de clonagem seja bastante útil em ambiente de desenvolvimento. No mais, sempre teremos a opção de utilizar outras técnicas de clonagem como, por exemplo, o RMAN DUPLICATE.



2 comentários:

Pedro Tchuco disse...

Prezado,

eu não entendi sobre a clonagem de pluggable via SQL*PLUS, você coloca o datafile de origem e novo de destino? É isso? No artigo você fala em dois datafiles, PDB01 e PBD03, eles estão migrando a informação pelo file_name_convert.

SQL> create pluggable database PDB03 from PDB01
file_name_convert =
(
'D:\oracle\app\oradata\CDB01\PDB01',
'D:\oracle\app\oradata\CDB01\PDB03');

Eduardo Legatti disse...

Olá Pedro,

Nesse exemplo em questão, eu criei o banco de dados PDB03 como um clone do banco de dados PDB01 dentro do mesmo CDB01. Por isso a origem e destino são iguais.

Abraços,

Legatti.

Postagens populares