Preservando o estado dos pluggable databases
Com a introdução da arquitetura multitenant na versão 12c do Oracle Database, passamos a ter múltiplos pluggable databases (PDBs) abaixo de um único container database (CDB). Anterior a versão 12.1.0.2, sempre que um container database era iniciado todos os pluggable databases associados permaneciam por padrão no estado MOUNT (com exceção do pluggable database SEED que fica em READ-ONLY).
Um mecanismo muito utilizado até então para se iniciar os pluggable databases eram triggers de startup. Quando o container era iniciado a trigger era disparada e todos os pluggable databases configurados abaixo da trigger eram automaticamente alterados para READ WRITE ou READ ONLY.
create or replace trigger startup_pdbs
after startup on database
begin
execute immediate 'alter pluggable database DBHMG1 open';
end;
/
Em um container database (CDB) com vários pluggable databases (PDBs) associados a solução começava a se tornar mais complexa, pois cada PDB poderia ter seu OPEN MODE diferente dos demais (MOUNTED, READ WRITE, READ ONLY). A cada necessidade de se disponibilizar um PDB em outro modo se tornava necessário também alterar a trigger manualmente ajustando o novo estado do PDB.
Iniciando na versão 12.1.0.2, a Oracle disponibilizou a feature pdb_save_or_discard_state junto ao comando ALTER PLUGGABLE DATABASE onde permite que o estado (state) de um PDB seja salvo ou descartado, agora sempre que o CDB é iniciado os pluggable databases (PDBs) voltam ao seu estado em que foram salvos (READ WRITE/READ ONLY).
Se um PDB não possui estado salvo ou ele foi descartado, então por default o estado dele será MOUNT quando o CDB for novamente iniciado.
SAVE: Salva o atual estado de OPEN MODE do(s) PDB(s) de modo que seja mantido após o restart do CDB;
DISCARD: Descarta o estado salvo do(s) PDB(s) resultando no retorno ao padrão MOUNTED;
INSTANCES_CLAUSE: Adicionado ao comando, permite salvar/descartar o estado de uma instance específica ou para todas as instances (RAC) – instances = (‘cdb1′,’cdb2’). Se omitido, modifica o estado do PDB apenas para a instance corrente;
ALL: Salva/descarta o estado para todos pluggable database;
ALL EXCEPT: Salva/descarta o estado para todos pluggable databases exceto pelos listados na cláusula EXCEPT;
Demonstrações de uso:
— Verificando o estado corrente dos pluggable databases
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DBHMG1 READ WRITE NO
4 DBHMG2 READ ONLY NO
5 DBHMG3 READ WRITE YES
Existem diferentes estados (open mode) para os pluggable databases, incluindo o DBHMG3 em modo restrito.
— Verificando o estado salvo dos pluggable databases
SQL> select con_name, instance_name, state, restricted from dba_pdb_saved_states;
no rows selected
Neste momento nenhum PDB possuía seu estado salvo, ou seja, se o container database (CDB) for reiniciado, todos os pluggable databases irão ficar em estado MOUNT.
— Salvando o estado de apenas um pluggable database
SQL> alter pluggable database DBHMG1 save state;
Pluggable database altered.
— Salvando o estado de todos os pluggable databases exceto o DBHMG3
SQL> alter pluggable database ALL EXCEPT DBHMG3 save state;
Pluggable database altered.
— Salvando o estado de todos os pluggable databases
SQL> alter pluggable database ALL save state;
Pluggable database altered.
— Verificando o estado salvo dos pluggable databases
SQL> select con_name, instance_name, state, restricted from dba_pdb_saved_states;
CON_NAME INSTANCE_NAME STATE RES
------------------------------ --------------- -------------- ---
DBHMG3 cdb OPEN YES
DBHMG1 cdb OPEN NO
DBHMG2 cdb OPEN READ ONLY NO
O retorno da DBA_PDB_SAVED_STATES representa o estado salvo de cada PDB, se um outro PDB existir e o mesmo não for listado significa que ele não possui nenhum estado salvo até o momento, desta forma, um restart do container resultaria no retorno dele ao estado default, MOUNT.
— Forçando um restat do container
SQL> startup force
ORACLE instance started.
Total System Global Area 629145600 bytes
Fixed Size 2927528 bytes
Variable Size 281019480 bytes
Database Buffers 339738624 bytes
Redo Buffers 5459968 bytes
Database mounted.
Database opened.
— Verificando o estado corrente dos pluggable databases
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DBHMG1 READ WRITE NO
4 DBHMG2 READ ONLY NO
5 DBHMG3 READ WRITE YES
Com o restart do CBD, todos os pluggable databases voltaram ao seu estado salvo.
Sempre que o estado de um PDB for alterado e este precise ser persistido após um restart do container, execute um novo SAVE STATE, sem o SAVE STATE ele voltara ao antigo estado salvo.
— Descartando o estado salvo de um pluggalbe database
SQL> alter pluggable database DBHMG3 discard state;
Pluggable database altered.
— Verificando o estado salvo dos pluggable databases
SQL> select con_name, instance_name, state, restricted from dba_pdb_saved_states;
CON_NAME INSTANCE_NAME STATE RES
------------------------------ --------------- -------------- ---
DBHMG1 cdb OPEN NO
DBHMG2 cdb OPEN READ ONLY NO
— Forçando um restat do container
SQL> startup force
ORACLE instance started.
Total System Global Area 629145600 bytes
Fixed Size 2927528 bytes
Variable Size 281019480 bytes
Database Buffers 339738624 bytes
Redo Buffers 5459968 bytes
Database mounted.
Database opened.
— Verificando o estado corrente dos pluggable databases
SQL> show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
3 DBHMG1 READ WRITE NO
4 DBHMG2 READ ONLY NO
5 DBHMG3 MOUNTED
A mudança proporcionada através da feature pdb_save_or_discard_state, embora pequena, representa uma melhoria significativa no mecanismo de gerenciamento dos pluggable databases (PDBs) principalmente aos DBAs que possuem muitos pluggable databases para gerenciar abaixo de um único container database (CDB).
Referências