iceranto.dev / log

Clonando PDB dentro do mesmo CDB no Oracle

Contexto

No Oracle Multitenant, clonar um PDB é uma das operações mais úteis do dia a dia, seja para criar um ambiente de homologação a partir de produção, seja para duplicar um PDB para testes sem afetar a origem.

O fluxo usa um database link para conectar o CDB origem ao CDB destino (ou ao próprio CDB, quando a clonagem é local), e o REFRESH MODE MANUAL permite sincronizar o clone com a origem sempre que necessário, sem precisar recriar o PDB do zero.


1. Ajustar o tnsnames.ora

O database link precisa resolver o serviço do CDB de origem. Adicione a entrada no tnsnames.ora:

cdb1 =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = cdb1)
    )
  )

2. Criar o usuário para clonagem

O usuário precisa existir em todos os containers (CONTAINER=ALL) e ter permissão para criar sessão e pluggable databases:

CREATE USER remote_clone_user IDENTIFIED BY remote CONTAINER=ALL;
GRANT CREATE SESSION, CREATE PLUGGABLE DATABASE TO remote_clone_user CONTAINER=ALL;

Conectado ao CDB destino (ou ao CDB$ROOT do mesmo CDB):

CREATE DATABASE LINK clone_link
  CONNECT TO remote_clone_user IDENTIFIED BY remote
  USING 'XE';

4. Clonar o PDB

Exemplo de teste — clonar PDB1 para PDBTST com refresh mode

-- (CDB$ROOT) Cria PDBTST clonando PDB1 com refresh manual
CREATE PLUGGABLE DATABASE pdbtst FROM pdb1@clone_link
  FILE_NAME_CONVERT=('/u02/oradata/CDB1/pdb1/', '/u02/oradata/CDB1/pdb2/')
  REFRESH MODE MANUAL;

-- (PDBTST) Sincroniza com a origem
ALTER PLUGGABLE DATABASE pdbtst REFRESH;

-- Abre em read only para consulta
ALTER PLUGGABLE DATABASE pdbtst OPEN READ ONLY;

-- Remove quando não precisar mais
DROP PLUGGABLE DATABASE pdbtst INCLUDING DATAFILES;

Processo completo — clone de prod para homolog

-- Remove o homolog anterior (se existir)
DROP PLUGGABLE DATABASE homolog INCLUDING DATAFILES;

-- Define destino dos datafiles (Oracle cria os paths automaticamente)
ALTER SESSION SET DB_CREATE_FILE_DEST='/opt/oracle/oradata/';

-- Clona prod para homolog
CREATE PLUGGABLE DATABASE homolog FROM prod@clone_link REFRESH MODE MANUAL;

-- Sincroniza com prod
ALTER PLUGGABLE DATABASE homolog REFRESH;

-- Desabilita o refresh (agora homolog é independente)
ALTER PLUGGABLE DATABASE homolog REFRESH MODE NONE;

-- Abre e salva estado para sobreviver a restarts do CDB
ALTER PLUGGABLE DATABASE homolog OPEN;
ALTER PLUGGABLE DATABASE homolog SAVE STATE;

O REFRESH MODE NONE é importante: enquanto o PDB está em refresh mode, ele só pode ser aberto em READ ONLY. Ao desabilitar, libera para leitura e escrita, o que faz sentido para homologação.


Gerenciando estados dos PDBs

O SAVE STATE garante que o PDB sobe automaticamente quando o CDB é reiniciado. Para verificar o que está salvo:

SHOW PDBS;

ALTER PLUGGABLE DATABASE xepdb1 SAVE STATE;

SET LINESIZE 999
COL con_name FORMAT a30
SELECT con_name, state FROM dba_pdb_saved_states;

Criando um PDB do zero a partir do seed

Quando não há uma origem para clonar, o Oracle usa o PDB$SEED como template:

CREATE PLUGGABLE DATABASE dev
  ADMIN USER pdbadmin IDENTIFIED BY senha_aqui
  DEFAULT TABLESPACE users
    DATAFILE '/opt/oracle/oradata/XE/dev/users.dbf' SIZE 2G AUTOEXTEND ON
  FILE_NAME_CONVERT=('/opt/oracle/oradata/XE/pdbseed/', '/opt/oracle/oradata/XE/dev/');

Verificando erros de plug-in

Após criar ou clonar um PDB, vale checar a view PDB_PLUG_IN_VIOLATIONS para erros pendentes — incompatibilidades de patches, timezone, opções de banco, etc.:

SELECT name, cause, type, message, status, action
FROM pdb_plug_in_violations
WHERE type LIKE 'ERROR%'
  AND status LIKE 'PENDING';

Erros aqui não impedem o PDB de abrir, mas podem indicar inconsistências que precisam de atenção antes de usar o ambiente em produção.