Pular para o conteúdo

Preservando o estado dos pluggable databases após o restart do container database

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.

Preservando o estado dos pluggable databases

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

Anderson Graf

Anderson Graf

Anderson Graf é Bacharel em Sistemas de Informação, MBA em Oracle Database Management e Senior DBA na Teiko Soluções em TI. Está envolvido em soluções multi-plataforma de alta disponibilidade, como implementações de RAC, Dataguard, Oracle Engineered Systems entre outros. É um entusiasta da tecnologia Oracle, possui certificações, OCP 10g, 11g e 12c, OCS Linux, banco de dados e cloud control, OCE Performance Tuning, OPNCS, Oracle ACE Associate e autor em vários blogs e OTN (Oracle Technology Network).

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *

Marcações:
plugins premium WordPress