ORA-2800/ORA-00600: Oracle Multitenant User Conflit Resolution

Neste artigo vou simular uma situação que podemos nos deparar ao clonar um PDB de um CDB para outro, onde o PDB de origem clonado possui um common user que o CDB de destino não possui.

Criando um PDB de teste no CDB de origem:

SQL> SELECT NAME,CDB FROM V$DATABASE;
 
NAME      CDB
--------- ---
SINAPSE   YES
 
SQL> CREATE PLUGGABLE DATABASE SPFC ADMIN USER BSS IDENTIFIED BY oracle DEFAULT TABLESPACE USERS;
 
Pluggable database created.
 
SQL> ALTER PLUGGABLE DATABASE SPFC OPEN;
 
Pluggable database altered.
 
SQL> ALTER PLUGGABLE DATABASE SPFC SAVE STATE;
 
Pluggable database altered.
 
SQL> SELECT NAME,OPEN_MODE FROM V$PDBS;
 
NAME
--------------------------------------------------------------------------------
OPEN_MODE
----------
PDB$SEED
READ ONLY
 
SPFC
READ WRITE

Criando um Common user no CDB de origem:

SQL> CREATE USER C##LIBERTADORES IDENTIFIED BY oracle CONTAINER=ALL;
 
User created.
 
SQL> GRANT CREATE SESSION TO C##LIBERTADORES CONTAINER=ALL;
 
Grant succeeded.

Adicionei a string de conexão do novo PDB no tnsnames.ora:

[oracle@oel8 admin]$ tnsping SPFC
 
TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 15-APR-2021 04:14:30
 
Copyright (c) 1997, 2020, Oracle.  All rights reserved.
 
Used parameter files:
/oracle/18.0.0/product/network/admin/sqlnet.ora
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.107)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = SPFC.localdomain)))
OK (0 msec)

Testando a conexão do Common user com o PDB de origem:

[oracle@oel8 admin]$ sqlplus C##LIBERTADORES/oracle@SPFC
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 15 04:15:35 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> SHOW USER;
USER is "C##LIBERTADORES"

No CDB de destino, me certifico que não temos nenhum PDB chamado SPFC e nem um common user chamado LIBERTADORES:

[oracle@quiasma ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 15 04:16:27 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> select name,cdb from v$database;
 
NAME      CDB
--------- ---
TALAMO    YES
 
SQL> select name,open_mode from v$pdbs where name like '%SPFC%';
 
no rows selected
 
SQL> select username from cdb_users where username like '%LIBERTADORES%';
 
no rows selected

Criando DBLINK no CDB de destino apontando para o CDB de origem:

[oracle@quiasma admin]$ tnsping SINAPSE
 
TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 15-APR-2021 04:24:16
 
Copyright (c) 1997, 2020, Oracle.  All rights reserved.
 
Used parameter files:
/oracle/18.0.0/product/network/admin/sqlnet.ora
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.0.107)(PORT = 1521)) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = sinapse.localdomain)))
OK (0 msec)
[oracle@quiasma admin]$ sqlplus / as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 15 04:25:16 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> CREATE DATABASE LINK DBLINKBSS CONNECT TO system IDENTIFIED BY oracle USING 'SINAPSE';
 
Database link created.
 
SQL> select * from dual@DBLINKBSS;
 
D
-
X

Criando o PDB no destino usando o DB_LINK:

SQL> CREATE PLUGGABLE DATABASE SPFC FROM SPFC@DBLINKBSS;
CREATE PLUGGABLE DATABASE SPFC FROM SPFC@DBLINKBSS
*
ERROR at line 1:
ORA-17628: Oracle error 1031 returned by remote Oracle server
ORA-01031: insufficient privileges

O erro ocorre pois o usuário utilizado no DBLINK deve possuir privilégio de criar PDBs (mesmo sendo o SYSTEM):

[oracle@oel8 admin]$ sqlplus / as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 15 04:27:33 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> GRANT CREATE PLUGGABLE DATABASE TO SYSTEM CONTAINER=ALL;
 
Grant succeeded.

PDB criado com sucesso:

SQL> CREATE PLUGGABLE DATABASE SPFC FROM SPFC@DBLINKBSS;
 
Pluggable database created.
 
SQL> ALTER PLUGGABLE DATABASE SPFC OPEN;
 
Pluggable database altered.
 
SQL> ALTER PLUGGABLE DATABASE SPFC SAVE STATE;
 
Pluggable database altered.

Adicionado string de conexão do novo PDB no tnsnames.ora:

[oracle@quiasma admin]$ tnsping SPFC
 
TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 15-APR-2021 04:34:27
 
Copyright (c) 1997, 2020, Oracle.  All rights reserved.
 
Used parameter files:
/oracle/18.0.0/product/network/admin/sqlnet.ora
 
 
Used TNSNAMES adapter to resolve the alias
Attempting to contact (DESCRIPTION = (ADDRESS_LIST = (ADDRESS = (PROTOCOL = TCP)(HOST = quiasma.localdomain)(PORT = 1521))) (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = SPFC.localdomain)))
OK (0 msec)

Logando no PDB com usuário system:

[oracle@quiasma admin]$ sqlplus system/oracle@SPFC
 
SQL*Plus: Release 18.0.0.0.0 - Production on Thu Apr 15 04:35:09 2021
Version 18.13.0.0.0
 
Copyright (c) 1982, 2018, Oracle.  All rights reserved.
 
Last Successful login time: Thu Apr 15 2021 04:18:14 -03:00
 
Connected to:
Oracle Database 18c Enterprise Edition Release 18.0.0.0.0 - Production
Version 18.13.0.0.0
 
SQL> SHOW USER;
USER is "SYSTEM"

Tentando logar no PDB com o common user. Pior do que o erro que esperávamos (ORA-2800), nos foi reportado um ORA-600:

SQL> conn C##LIBERTADORES/oracle@SPFC;
ERROR:
ORA-00600: internal error code, arguments: [kziaVrfyAcctStatInRootCbk: !user],
[C##LIBERTADORES], [], [], [], [], [], [], [], [], [], []
 
 
Warning: You are no longer connected to ORACLE.

No alert log:

2021-04-15 04:35:57.196000 -03:00
Errors in file /oracle/18.0.0/base/diag/rdbms/talamo/TALAMO/trace/TALAMO_ora_3734.trc  (incident=67475) (PDBNAME=CDB$ROOT):
ORA-00600: internal error code, arguments: [kziaVrfyAcctStatInRootCbk: !user], [C##LIBERTADORES], [], [], [], [], [], [], [], [], [], []
Incident details in: /oracle/18.0.0/base/diag/rdbms/talamo/TALAMO/incident/incdir_67475/TALAMO_ora_3734_i67475.trc
2021-04-15 04:35:58.750000 -03:00
Use ADRCI or Support Workbench to package the incident.
See Note 411.1 at My Oracle Support for error and packaging details.
Dumping diagnostic data in directory=[cdmp_20210415043558], requested by (instance=1, osid=3734), summary=[incident=67475].
2021-04-15 04:36:57.053000 -03:00

Para tentarmos resolver, vou baixar o PDB:

SQL> ALTER PLUGGABLE DATABASE SPFC CLOSE IMMEDIATE;
 
Pluggable database altered.

Criando o common user no CDB de destino:

SQL> CREATE USER C##LIBERTADORES IDENTIFIED BY oracle CONTAINER=ALL;
 
User created.
 
SQL> GRANT CREATE SESSION TO C##LIBERTADORES CONTAINER=ALL;
 
Grant succeeded.

Abrindo o PDB e tentando novamente a conexão com o common user:

SQL> ALTER PLUGGABLE DATABASE SPFC OPEN;
 
Pluggable database altered.
 
SQL> CONN C##LIBERTADORES/oracle@SPFC;
Connected.
SQL> SHOW USER;
USER is "C##LIBERTADORES"

Obs: Este procedimento foi criado pelo senhor Ahmed Baraka (www.ahmedbaraka.com) e foi apenas reproduzido por mim em um laboratório pessoal para fins de aprendizado.

Leave a Comment

Your email address will not be published.