Creating an Application Root

Um recurso muito interessante da arquitetura Multitenant (a partir da 12.2) é o Application Container, que nos permite agrupar de maneira lógica um conjunto de containers, de modo a facilitar a sua administração e governança. Um exemplo prático disso: imagine que você provê um serviço para diversos clientes, e que sua aplicação seja semelhante entre eles. Em vez de criar um ambiente (servidor, instância, banco de dados) para cada cliente, você pode criar um Application Container, com os PDBs para cada cliente. Caso precise fazer algum patch ou upgrade, pode realizá-lo nesse conjunto, poupando esforço em atividades repetitivas. Em suma, é ideal nos casos que temos múltiplos PDBS que executam a mesma aplicação. Nesse artigo, vamos começar a explorar esse item, iniciando pela criação de um Application Root.

Fonte: LINK

Vamos logar em nosso CDB$ROOT e executar a criação de um PDB, porém com a opção “AS APPLICATION CONTAINER”, conforme exemplo abaixo:

[oracle@quiasma ~]$ sqlplus / as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 6 19:07:03 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,OPEN_MODE FROM V$DATABASE;
 
NAME      OPEN_MODE
--------- --------------------
ASWAN     READ WRITE
 
SQL> SHOW PDBS;
 
    CON_ID CON_NAME                       OPEN MODE  RESTRICTED
---------- ------------------------------ ---------- ----------
         2 PDB$SEED                       READ ONLY  NO
         3 HIPOFISE2                      READ WRITE NO
         4 HIPOFISE1                      READ WRITE NO
SQL> CREATE PLUGGABLE DATABASE hr_ac AS APPLICATION CONTAINER ADMIN USER hr_acadm IDENTIFIED BY oracle;
 
Pluggable database created.
 
SQL> ALTER PLUGGABLE DATABASE hr_ac OPEN;
 
Pluggable database altered.

Consultando os Containers Root do nosso ambiente (e salvando o seu status):

SQL> col name format a10
SQL> SELECT CON_ID, NAME, OPEN_MODE FROM V$PDBS WHERE APPLICATION_ROOT='YES';
 
    CON_ID NAME       OPEN_MODE
---------- ---------- ----------
         5 HR_AC      READ WRITE
 
SQL> ALTER PLUGGABLE DATABASE hr_ac SAVE STATE;
 
Pluggable database altered.

Vemos que o Application Root também contém tablespaces SYSTEM, SYSAUX e UNDO, como um PDB tradicional:

SQL> SELECT FILE_NAME, TABLESPACE_NAME FROM CDB_DATA_FILES WHERE CON_ID=5;
 
FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
/oracle/dados/ASWAN/ASWAN/C67CA7106BF60C8BE0536A00A8C0CCB0/datafile/o1_mf_system
_jg9o1p5h_.dbf
SYSTEM
 
/oracle/dados/ASWAN/ASWAN/C67CA7106BF60C8BE0536A00A8C0CCB0/datafile/o1_mf_sysaux
_jg9o1p5o_.dbf
SYSAUX
 
/oracle/dados/ASWAN/ASWAN/C67CA7106BF60C8BE0536A00A8C0CCB0/datafile/o1_mf_undotb
 
FILE_NAME
--------------------------------------------------------------------------------
TABLESPACE_NAME
------------------------------
s1_jg9o1p5o_.dbf
UNDOTBS1

Do ponto de vista de privilégios, podemos ver que o usuário administrativo (HR_ACADM) possui privilégio à role PDB_DBA, conforme exposto abaixo:

SQL> ALTER SESSION SET CONTAINER=HR_AC;
 
Session altered.
 
SQL> col grantee format a10
SQL> col granted_role format a15
SQL> SELECT GRANTEE, GRANTED_ROLE, COMMON FROM DBA_ROLE_PRIVS where GRANTEE ='HR_ACADM';
 
GRANTEE    GRANTED_ROLE    COM
---------- --------------- ---
HR_ACADM   PDB_DBA         NO
 
SQL> col role format a10
SQL> col privilege format a30
SQL> SELECT ROLE, PRIVILEGE, ADMIN_OPTION, COMMON, INHERITED FROM ROLE_SYS_PRIVS WHERE ROLE='PDB_DBA';
 
ROLE       PRIVILEGE                      ADM COM INH
---------- ------------------------------ --- --- ---
PDB_DBA    SET CONTAINER                  NO  NO  NO
PDB_DBA    CREATE PLUGGABLE DATABASE      NO  NO  NO
PDB_DBA    CREATE SESSION                 NO  NO  NO
 
SQL>

Também percebemos que é possível a conexão direto ao Application Container através do Listener. Para isso, vamos inserir em nosso arquivo tnsnames.ora a string de conexão e testar:

[oracle@quiasma admin]$ tnsping HR_AC
 
TNS Ping Utility for Linux: Version 18.0.0.0.0 - Production on 06-JUL-2021 19:16:21
 
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 = HR_AC.localdomain)))
OK (0 msec)
[oracle@quiasma admin]$

Conexão:

[oracle@quiasma admin]$ sqlplus sys/oracle@HR_AC as sysdba
 
SQL*Plus: Release 18.0.0.0.0 - Production on Tue Jul 6 19:17:13 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 CON_ID CON_NAME
 
CON_ID
------------------------------
5
 
CON_NAME
------------------------------
HR_AC
SQL>

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.