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