Oracle PDB Cloning on the Same Server: Avoiding Service Registration Conflicts.

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 successfully

Para 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.

search previous next tag category expand menu location phone mail time cart zoom edit close