Oracle database 12c – Iniciando e parando Pluggable Databases (PDB)

Na verão Oracle database 12c tivemos o surgimento da Arquitetura Multitenant onde permite que o banco de dados funcione como um container – CDB(Container Database) e que inclua zero ou muitos bancos de dados plugáveis – PDB(Pluggable Database).

Neste novo cenário de CDB e PDB, o startup/shutdown de um banco de dados plugável pode ser feito de algumas formas diferentes do que estamos acostumados. O objetivo deste artigo é justamente demonstrar algumas destas formas de parar, iniciar e verificar o estado desdes pluggable databases.

Abrindo uma conexão com o CDB (no meu caso criado como ORCL):

C:>sqlplus sys@ORCL as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Tue Ago 13 15:56:07 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Informe a senha:

Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT

Observe que quando executo o comando “show con_name” para visualizar o container que estou conectado ele apresenta CDB$ROOT.

O CDB$ROOT é o recipiente raiz do banco de dados, nele é armazenado todos os metadados e usuários comuns. Um usuário comum é um usuário do banco de dados conhecido em cada recipiente.

Conectado no meu container(CDB) vou verificar o status de todos os pluggable databases utilizando a visão V$PDBS.

SQL> set lines 190
SQL> col open_time for a30
SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- ------------------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         MOUNTED    13/08/2013 16:38:47
TESTE2                         MOUNTED    13/08/2013 16:25:17

Na coluna NAME temos o nome de cada PDB.

Na coluna OPEN_MODE é exibido o estado do PDB. Quando um PDB esta fechado(closed) seu estado é MOUNTED. Um PDB pode ser aberto com as seguintes condições: READ WRITE, READ ONLY ou MIGRATE.

A coluna OPEN_TIME mostra o ultimo dia e horário em que o plugabble database estava aberto.

NOTA: O pluggable database PDB$SEED é um template que o CDB utiliza para criar novos PDBs. Nele não podemos adicionar ou modificar nenhum objeto.

Mudando o estado dos PDB através do comando ALTER PLUGGABLE DATABASE:

--Abrindo em read write
SQL> alter pluggable database teste1 open;

Banco de dados plugável alterado.

--Abrindo em read only
SQL> alter pluggable database teste2 open read only;

Banco de dados plugável alterado.

Verificando novamente o estado dos PDBs. Observe que a coluna OPEN_TIME também foi alterada!

SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- ------------------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         READ WRITE 13/08/2013 16:44:48
TESTE2                         READ ONLY  13/08/2013 16:45:04

--Fechando um pdb
SQL> alter pluggable database teste1 close immediate;

Banco de dados plugável alterado.

SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- ------------------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         MOUNTED    13/08/2013 16:46:18
TESTE2                         READ ONLY  13/08/2013 16:45:04

A palavra IMMEDIATE especificada depois do CLOSE significa que a base será fechada imediatamente, semelhante ao comando shutdown immediate. Caso o immediate seja omitido do comando o banco de dados é fechado de forma normal(shutdown).

Outro método para iniciar e parar um PDB é conectando no mesmo e emitindo os comandos startup e shutdown já conhecidos.

--conectando na teste2
SQL> alter session set container=teste2;

Sessão alterada.

SQL> show con_name

CON_NAME
------------------------------
TESTE2
SQL> shutdown immediate;
Banco de Dados plugável Fechado.

--conectando na teste1
SQL> alter session set container=teste1;

Sessão alterada.

SQL> show con_name

CON_NAME
------------------------------
TESTE1
SQL> startup
Banco de Dados plugável aberto.

--conectando no recipiente raiz
SQL> alter session set container=cdb$root;

Sessão alterada.

SQL> show con_name

CON_NAME
------------------------------
CDB$ROOT
SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- -------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         READ WRITE 13/08/2013 16:51:11
TESTE2                         MOUNTED    13/08/2013 16:48:37

Imagine agora que você tem 100 PDBs. Certamente seria muito trabalhoso executar 100x o mesmo comando ALTER PDB ou conectar em todos os PDBs para poder iniciar e parar cada um deles. Então, como fazemos?

Uma das soluções é especificar o nome dos PDBs desejados no mesmo comando:

SQL> alter pluggable database teste1, teste2 open;

Banco de dados plugável alterado.

Mas ainda seria trabalhoso.. Então para facilitar ainda mais temos as mágicas palavras:

ALL: Para alterar o estado de “todos” os PDBs (O PDB$SEED não é afetado!);
ALL EXCEPT: Para alterar o estado dos PDBs exeto do PDB especificado.

SQL> alter pluggable database all close immediate;

Banco de dados plugável alterado.

SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- -------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         MOUNTED    13/08/2013 16:53:31
TESTE2                         MOUNTED    13/08/2013 16:48:37

SQL> alter pluggable database all open;

Banco de dados plugável alterado.

SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- -------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         READ WRITE 13/08/2013 16:54:18
TESTE2                         READ WRITE 13/08/2013 16:54:18

SQL> alter pluggable database all except teste1 close immediate;

Banco de dados plugável alterado.

SQL> select name,
  2         open_mode,
  3         to_char(open_time,'dd/mm/yyyy hh24:mi:ss') open_time
  4    from v$pdbs
  5  /

NAME                           OPEN_MODE  OPEN_TIME
------------------------------ ---------- -------------------
PDB$SEED                       READ ONLY  13/08/2013 15:58:34
TESTE1                         READ WRITE 13/08/2013 16:54:18
TESTE2                         MOUNTED    13/08/2013 16:56:20

Para finalizar, ainda podemos iniciar/parar um PDB das seguintes formas:

SQL> startup pluggable database teste2;
Banco de Dados plugável aberto.

SQL> exit
Desconectado de Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

C:>sqlplus sys@TESTE2 as sysdba

SQL*Plus: Release 12.1.0.1.0 Production on Tue Ago 13 17:00:09 2013

Copyright (c) 1982, 2013, Oracle.  All rights reserved.

Informe a senha:

Conectado a:
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options

SQL> shutdown immediate;
Banco de Dados plugável Fechado.
Referências:http://docs.oracle.com/cd/E16655_01/server.121/e17633/cdbovrvw.htm
http://docs.oracle.com/cd/E16655_01/server.121/e17615/refrn30652.htm
http://docs.oracle.com/cd/E16655_01/server.121/e17209/statements_2007.htm
%name Oracle database 12c   Iniciando e parando Pluggable Databases (PDB)

Autor: Anderson Graf

Bacharel em Sistemas de Informação e MBA em Gestão de Banco de Dados Oracle. Entusiasta da tecnologia Oracle, ACE Associate ♠, autor em vários blogs e OTN. Consultor Oracle Senior na Exímio Soluções em TI

Envolvido em soluções de:
– Implementação, migração, gerenciamento e suporte a produtos Oracle, multiplataforma
– Monitoramento de ambientes 24×7
– Backup e Recovery
– Performance e Tuning
– Alta disponibilidade (HA) – RAC, Data Guard
– EM database/grid/cloud control
– Particionamento & Advanced Compression
– Oracle Engineered Systems – ODA, Exadata

Blog pessoal: http://www.andersondba.com.br
Articulista na Oracle Technology Network (OTN) – https://goo.gl/99R6yW
ACE Associate – https://goo.gl/MBB51b
Articulista GPO – http://profissionaloracle.com.br