
Esta semana estive realizando a clonagem de alguns PDBs para outro CDB no mesmo servidor. Um detalhe que pode passar despercebido e acabar sendo esquecido é que, ao clonar um PDB, todos os serviços registrados nele também são clonados.
Caso esse ponto não seja observado, os mesmos serviços poderão ficar registrados em dois CDBs diferentes, gerando conflitos de conectividade e direcionamento de sessões.
Um exemplo prático: possuo atualmente um PDB chamado RM no CDB CDBPRD02. Realizei a clonagem desse PDB utilizando a funcionalidade Refreshable PDB Clone para o CDB CDBPRD2. Assim que o processo de clonagem foi concluído, verifiquei que o serviço rm estava registrado tanto no PDB de origem quanto no PDB clonado.
Services Summary...
Service "+APX" has 1 instance(s).
Instance "+APX2", status READY, has 1 handler(s) for this service...
Service "+ASM" has 1 instance(s).
Instance "+ASM2", status READY, has 1 handler(s) for this service...
Service "+ASM_DATAC1" has 1 instance(s).
Instance "+ASM2", status READY, has 1 handler(s) for this service...
Service "+ASM_RECOC1" has 1 instance(s).
Instance "+ASM2", status READY, has 1 handler(s) for this service...
Service "rm.xpto.com" has 2 instance(s). <======================================================
Instance "CDBPRD022", status READY, has 1 handler(s) for this service... <====================
Instance "CDBPRD22", status READY, has 1 handler(s) for this service... <====================
The command completed successfullyPara evitar esse tipo de problema, podemos utilizar a cláusula SERVICE_NAME_CONVERT durante o processo de clonagem. Essa opção permite converter automaticamente os nomes dos serviços existentes no PDB de origem para novos nomes no PDB de destino, evitando conflitos de registro e reduzindo a necessidade de ajustes manuais após a clonagem.
A seguir, demonstrarei como utilizar o SERVICE_NAME_CONVERT para garantir que os serviços do PDB clonado sejam criados com nomes distintos dos serviços existentes no ambiente de origem.
Listar serviços registrados para todos os PDBS:
SET LINESIZE 145
COLUMN NETWORK_NAME FOR A60
COLUMN PDB FOR A30
COLUMN CON_ID FOR 999
SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES;
PDB NETWORK_NAME CON_ID
------------------------------ -------------------- ------
CDB$ROOT 1
CDB$ROOT 1
CDB$ROOT lab19cXDB 1
CDB$ROOT lab19c 1
PRD2 prd2_teste 4
PRD2 prd2 4
6 rows selected.
Neste exemplo, iremos clonar o PDB PRD2, criando um novo PDB chamado PRD3. Durante a clonagem, utilizaremos a cláusula SERVICE_NAME_CONVERT para converter automaticamente os nomes dos serviços registrados, evitando conflitos com os serviços existentes no ambiente de origem.
Sintaxe de uso: SERVICE_NAME_CONVERT=(‘service name origem’,’service name destino novo’).
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PRD2 READ WRITE NO
SQL> create pluggable database PRD3 from PRD2 SERVICE_NAME_CONVERT=('prd2_teste','prd3_dev') PARALLEL 8;
Pluggable database created.
SQL> alter pluggable database all open instances=all;
Pluggable database altered.
SQL> alter pluggable database all save state instances=all;
Pluggable database altered.
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 PRD3 READ WRITE NO
4 PRD2 READ WRITE NO
Listar serviços registrados para todos os PDBS:
SET LINESIZE 145
COLUMN NETWORK_NAME FOR A20
COLUMN PDB FOR A30
COLUMN CON_ID FOR 999
SELECT PDB, NETWORK_NAME, CON_ID FROM CDB_SERVICES;
PDB NETWORK_NAME CON_ID
------------------------------ -------------------- ------
PRD2 prd2_teste 4
PRD2 prd2 4
CDB$ROOT 1
CDB$ROOT 1
CDB$ROOT lab19cXDB 1
CDB$ROOT lab19c 1
PRD3 prd3_dev 5
PRD3 PRD3 5
8 rows selected.
Iniciando os serviços:
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 PRD2 READ WRITE NO
5 PRD3 READ WRITE NO
SQL> alter session set container=PRD3;
Session altered.
SQL> exec dbms_service.start_service('prd3_dev');
PL/SQL procedure successfully completed.
[oracle@srv02 ~]$ lsnrctl status | grep -A 1 "prd3_dev"
Service "prd3_dev" has 1 instance(s).
Instance "lab19c", status READY, has 1 handler(s) for this service...

Conclusão
Ao clonar um PDB, é importante lembrar que os serviços registrados também são copiados para o ambiente de destino. Caso esse detalhe seja ignorado, podem ocorrer conflitos de serviços e conexões sendo direcionadas para o PDB incorreto.
A utilização da cláusula SERVICE_NAME_CONVERT torna esse processo mais seguro e prático, permitindo que os serviços sejam renomeados automaticamente durante a clonagem. Dessa forma, reduzimos a necessidade de ajustes manuais após a criação do clone e evitamos problemas de conectividade entre os ambientes de origem e destino.