Modifying a parameter in an Oracle PDB

Com a mudança de estrutura Multitenant, precisamos nos atentar em relação à alteração de parâmetros dentro dos bancos de dados. Talvez o pontapé inicial seria checar se o parâmetro em questão não é habilitado para modificação a nível de PDB (non-PDB-modifiable). Para isso, podemos usar a consulta abaixo como exemplo, em relação à FRA:

SQL> SELECT NAME,CDB FROM V$DATABASE;
 
NAME      CDB
--------- ---
TALAMO    YES
 
SQL> col value format a15
SQL> SELECT VALUE, ISPDB_MODIFIABLE FROM V$SYSTEM_PARAMETER WHERE NAME='db_recovery_file_dest_size';
 
VALUE           ISPDB
--------------- -----
734003200       FALSE

A coluna ISPDB com valor FALSE nos indica que uma alteração só é permitada no CBD root. Mesmo assim, fazendo o teste de prova:

SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
 
Session altered.
 
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=2G;
ALTER SYSTEM SET db_recovery_file_dest_size=2G
*
ERROR at line 1:
ORA-65040: operation not allowed from within a pluggable database

Fazendo alteração do CDB root:

SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;
 
Session altered.
 
SQL> ALTER SYSTEM SET db_recovery_file_dest_size=1G;
 
System altered.
 
SQL> SELECT VALUE FROM V$SYSTEM_PARAMETER WHERE NAME='db_recovery_file_dest_size';
 
VALUE
---------------
1073741824

Realizando o teste em uma parâmetro que pode ser alterado a nível de PDB:

SQL> COL VALUE FORMAT A15
SQL> SELECT VALUE, ISPDB_MODIFIABLE FROM V$SYSTEM_PARAMETER WHERE NAME='ddl_lock_timeout';
 
VALUE           ISPDB
--------------- -----
0               TRUE

Efetivamente realizando a alteração:

SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
 
Session altered.
 
SQL> ALTER SYSTEM SET ddl_lock_timeout=20;
 
System altered.
 
SQL> SHO PARAMETER ddl_lock_timeout;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     20

Observando que o valor do parâmetro é o default em um outro PDB:

SQL> ALTER SESSION SET CONTAINER=HIPOFISE2;
 
Session altered.
 
SQL> SHOW PARAMETER ddl_lock_timeout
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     0

Caso alteremos o parâmetro do CDB root, será que os PDBs herdam o valor? Não. Cada container tem o seu valor independente:

SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;
 
Session altered.
 
SQL> SHO PARAMETER ddl_lock_timeout;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     0
SQL> ALTER SYSTEM SET ddl_lock_timeout=30;
 
System altered.
 
SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
 
Session altered.
 
SQL> SHO PARAMETER ddl_lock_timeout
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     20

Caso precisemos que todos os containers herdem o mesmo valor, podemos usar o exemplo abaixo:

SQL> ALTER SESSION SET CONTAINER=CDB$ROOT;
 
Session altered.
 
SQL> ALTER SYSTEM SET ddl_lock_timeout=666 CONTAINER=ALL;
 
System altered.
 
SQL> ALTER SESSION SET CONTAINER=HIPOFISE1;
 
Session altered.
 
SQL> SHO PARAMETER ddl_lock_timeout;
 
NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
ddl_lock_timeout                     integer     666

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.