Clonando um Pluggable Database (Oracle Database 12c) no mesmo Container root

Este artigo tem como objetivo demonstrar como clonar um pluggable database no banco de dados 12c no mesmo container root do mesmo servidor.
Para clonar é muito simples, basta ter área disponível no storage para a criação que o Oracle automaticamente criará o clone.

Vamos verificar os PDBs.

SQL> set lines 500
SQL> select name, open_mode, total_size from v$pdbs;

NAME                           OPEN_MODE  TOTAL_SIZE
------------------------------ ---------- ----------
PDB$SEED                       READ ONLY   283115520
TOMIASI                        READ WRITE  387973120

SQL>

Vamos clonar o PDB “TOMIASI” para um outro de teste “TOMIASI_DBTESTE”.
Para clonar o PDB, podemos realizar de 2 maneiras:
– Colocar o PDB que irá ser clonado em modo Read Only, porém antes devemos fechá-lo.
– Ou usar o comando “force”, ele altera o status do PDB e ainda mante os usuários conectados.
Comando a ser executado com force:

alter pluggable database TOMIASI open read only force;

OBS: Sobre Iniciar ou Parar um PDB acesse o artigo do Anderson Graf Oracle database 12c – Iniciando e parando Pluggable Databases (PDB).
No exemplo abaixo, utilizei a primeira opção:
Segue abaixo os passos:

– Fechando o PDB “TOMIASI”.

SQL> alter pluggable database TOMIASI close;

Pluggable database altered.

– Abrindo o PDB “TOMIASI” em modo Read Only.

SQL> alter pluggable database TOMIASI open read only;

Pluggable database altered.

SQL>

Vamos verificar os PDBs novamente.

SQL> select name, open_mode, total_size from v$pdbs;

NAME                           OPEN_MODE  TOTAL_SIZE
------------------------------ ---------- ----------
PDB$SEED                       READ ONLY   283115520
TOMIASI                        READ ONLY   387973120

SQL>

Vamos criar o clone do PDB “TOMIASI”. Tendo área suficiente, basta executar o comando abaixo.

SQL> create pluggable database tomiasi_dbteste from TOMIASI;

Pluggable database created.

SQL>

Criado o PDB “TOMIASI_DBTESTE” vamos abrir o PDB “TOMIASI” e verificar como que ficou os PDBs.

– Fechando o PDB “TOMIASI” novamente.

SQL> alter pluggable database TOMIASI close;

Pluggable database altered.

– Abrindo o PDB “TOMIASI”.

SQL> alter pluggable database TOMIASI open;

Pluggable database altered.

SQL> select name, open_mode, total_size from v$pdbs;

NAME                           OPEN_MODE  TOTAL_SIZE
------------------------------ ---------- ----------
PDB$SEED                       READ ONLY   283115520
TOMIASI                        READ WRITE  387973120
TOMIASI_DBTESTE                MOUNTED             0

SQL>

Podemos perceber que o PDB “TOMIASI_DBTESTE” está montado. Vamos abrir o mesmo.

SQL> alter pluggable database TOMIASI_DBTESTE open;

Pluggable database altered.

SQL> !

Após criado e aberto o “TOMIASI_DBTESTE”, podemos conforme abaixo verificar os PDBs estão registrados no Listener.
OBS: Quando se cria o PDB, o mesmo é registrado no Listener automaticamente.

oracle=orcl-> lsnrctl status

LSNRCTL for Linux: Version 12.1.0.1.0 - Production on 27-AUG-2013 22:02:24

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

Connecting to (ADDRESS=(PROTOCOL=tcp)(HOST=)(PORT=1521))
STATUS of the LISTENER
------------------------
Alias                     LISTENER
Version                   TNSLSNR for Linux: Version 12.1.0.1.0 - Production
Start Date                27-AUG-2013 21:57:23
Uptime                    0 days 0 hr. 5 min. 1 sec
Trace Level               off
Security                  ON: Local OS Authentication
SNMP                      OFF
Listener Parameter File   /u02/app/oracle/product/12.1.0/grid_1/network/admin/listener.ora
Listener Log File         /u02/app/oracle/diag/tnslsnr/l12asm64di/listener/alert/log.xml
Listening Endpoints Summary...
  (DESCRIPTION=(ADDRESS=(PROTOCOL=ipc)(KEY=EXTPROC1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcp)(HOST=l12asm64di.localdomain)(PORT=1521)))
  (DESCRIPTION=(ADDRESS=(PROTOCOL=tcps)(HOST=l12asm64di.localdomain)(PORT=5500))(Security=(my_wallet_directory=/u01/app/oracle/product/12.1.0/db_1/admin/orcl/xdb_wallet))(Presentation=HTTP)(Session=RAW))
Services Summary...
Service "+ASM" has 1 instance(s).
  Instance "+ASM", status READY, has 1 handler(s) for this service...
Service "orcl" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "orclXDB" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "tomiasi" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
Service "tomiasi_dbteste" has 1 instance(s).
  Instance "orcl", status READY, has 1 handler(s) for this service...
The command completed successfully
oracle=orcl->

Para acessar O PDB “TOMIASI_DBTESTE” com Oracle Net Directory Naming devemos adicionar o mesmo ao TNSNAMES conforme abaixo.
Vamos visualizar o atual TNSNAMES.

oracle=orcl-> cat /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

TOMIASI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = tomiasi)
    )
  )

Vamos editar o TNSNAMES adicionando o PDB “TOMIASI_DBTESTE” e vamos visualizar o mesmo novamente.

oracle=orcl-> vi /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
oracle=orcl-> cat /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
# tnsnames.ora Network Configuration File: /u01/app/oracle/product/12.1.0/db_1/network/admin/tnsnames.ora
# Generated by Oracle configuration tools.

LISTENER_ORCL =
  (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))

ORCL =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)
    )
  )

TOMIASI =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = tomiasi)
    )
  )

TOMIASI_DBTESTE =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = l12asm64di.localdomain)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = tomiasi_dbteste)
    )
  )
oracle=orcl-> exit
exit

Adicionado o PDB ao TNSNAMES, vamos acessar o PDB “TOMIASI_DBTESTE” com o Oracle Net Directory Naming.

SQL> conn tomiasi/tomiasi@tomiasi_dbteste
Connected.
SQL> select * from pessoas;

      P_ID P_NOME
---------- ------------------------------
         1 Maycon Tomiasi

SQL>

Podemos acessar o PDB também com o Easy Connect conforme abaixo:

SQL> conn tomiasi/tomiasi@l12asm64di.localdomain:1521/tomiasi_dbteste;
Connected.
SQL> select * from pessoas;

      P_ID P_NOME
---------- ------------------------------
         1 Maycon Tomiasi

SQL>

OBS: Significado de acesso via Easy Connect acima:
conn [usuário]/[senha]@[host]:[porta]/[pluggable_database][ORACLE_SID];
Porta = Porta do Listener.

Pronto, clonamos o pluggable database do Banco de Dados Oracle 12c e acessamos o mesmo.
Documento de criar um pluggable database acesse CREATE PLUGGABLE DATABASE.
Maiores informações sobre o Oracle Database 12c acesse Oracle Documentation 12c.

%name Clonando um Pluggable Database (Oracle Database 12c) no mesmo Container root

Autor: Maycon Tomiasi

Formado em Tecnologia da Informação na FIPP (Faculdade de Informática de Presidente Prudente), Analista DBA Oracle pela Teiko Soluções em Tecnologia da Informação, residente em Blumenau/ SC, Certificado OCP 10g/11g/12c, OCS 11g Implementation, OCE 11g Performance Tuning, OCE 11g RAC & GRID e OPN Specialist. Conhecimentos em PHP.