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;
3. Criar o database link
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.