Oracle Database 12c, O que acontece em um CDB quando um PDB tem ser recuperado

Por Joel Pérez, Mahir M. Quluzade e Rodrigo Mufalani ,
Postado em Agosto 2014

Introducción Neste artigo nós queremos responder a questão: O que acontece durante a inicialização de um CDB se um dos PDB’s tiver com problemas de mídia (precisa de recover)? Visão geral da arquitetura Multitenant Oracle Multitenant é uma nova arquitetura do Oracle Database 12c Enterprise Edition que ajuda aos clientes a reduzir custos de TI simplificando a consolidação, provisionamento, upgrades e mais. Isso é suportado pela noa arquitetura que permite um container database (CDB) ter um ou muitos pluggable databases (PDBs). A quantidade de PDBs em um único CDB compartilha memória e background processes, deixando você operar muito mais PDBs em uma plataforma espefícica do que você pode com databases únicos na arquitetura antiga. Este é o mesmo benefício que uma consolidação baseada em schemas trás. Mas há barreiras significantes para adaptar consolidação baseada em schemas, e isso causa prpoblemas de operação. A nova arquitetura remove essas barreriras e problemas de operação.

A arquitetura Multitenant preenche completamente outras opções, incluindo Oracle Real Application Clusters (RAC) e Oracle Active Data Guard. Um database existente pode adaptado simplesmente, sem mudanças , como um pluggable database , e não há necessidade de qualquer outra mudança em outra camada de aplicação.

Um PDB pode ser desplugado de um CDB e plugado em outro. Alternativamente, você pode clonar um, no mesmo CDB, ou de um CDB para outro. Estas operações, juntas com criação de um pluggable database, são feitas com novos comandos SQL e levam alguns segundos. Consolidando um banco de dados existente como pluggable databases, simplifica a administração, que pode ser feita como um todo.

O tempo investido e os esforços para aplicar patches em um CDB resulta em aplicar patches em todos os pluggable databases. Para aplicar patch em um database específico, você simplesmente pode desplugar e plugar este em uma versão diferente do Oracle Database software, já com patch aplicado.

Oracle Database 12c Resource Manager é uma funcionalidade estendida que instantâneamente controla a competição por recursos entre os pluggable databases em um container database.

Muitos database em um servidor Antes do Oracle Database 12c , a Oracle recomendava: somente um database armazenado em um servidor. Depois do 12c nós podemos usar multiplos pluggable databases em um único container database em um único servidor. Agora questões emergem: O que acontece em um CDB quando um dos PDBs tem um problema de mídia? Como este problema de mídia afeta outros PDB’s ou o CDB? Neste artigo em nosso ambiente de testes prmcdb é um Container Database e tem dois Pluggable databases neste CDB: prmpdb01, prmpdb02

 

[oracle@oel62-ora12c /]$ export ORACLE_SID=prmcdb 
[oracle@oel62-ora12c /]$ sqlplus / as sysdba 
 
SQL*Plus: Release 12.1.0.1.0 Production on Wed Feb 12 12:53:16 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
 
Connected to:
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> select con_id, cdb, name, open_mode from v$database; 
 
CON_ID  CDB NAME      OPEN_MODE
------  --- --------- --------------------
     0  YES PRMCDB    READ WRITE
 
SQL> select con_id, name, open_mode from v$pdbs;     
 
CON_ID  NAME               OPEN_MODE
------  ------------------ ----------
     2  PDB$SEED           READ ONLY
     3  PRMPDB01           READ WRITE
     4  PRMPDB02           READ WRITE
 
SQL> select file#, name from v$datafile; 
 
FILE#  NAME
-----  --------------------------------------------------------
  1    /u01/app/oracle/oradata/prmcdb/system01.dbf
  3    /u01/app/oracle/oradata/prmcdb/sysaux01.dbf
  4    /u01/app/oracle/oradata/prmcdb/undotbs01.dbf
  5    /u01/app/oracle/oradata/prmcdb/pdbseed/system01.dbf
  6    /u01/app/oracle/oradata/prmcdb/users01.dbf
  7    /u01/app/oracle/oradata/prmcdb/pdbseed/sysaux01.dbf
  8    /u01/app/oracle/oradata/prmcdb/prmpdb01/system01.dbf
  9    /u01/app/oracle/oradata/prmcdb/prmpdb01/sysaux01.dbf
 10    /u01/app/oracle/oradata/prmcdb/prmpdb01/prmpdb01_users01.dbf
 11    /u01/app/oracle/oradata/prmcdb/prmpdb02/system01.dbf
 12    /u01/app/oracle/oradata/prmcdb/prmpdb02/sysaux01.dbf
 13    /u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf
 
SQL> select file#, status, error from v$datafile_header; 
 
FILE#  STATUS     ERROR
-----  ---------  ---------------------------------------------
  1    ONLINE
  3    ONLINE
  4    ONLINE
  5    ONLINE
  6    ONLINE
  7    ONLINE
  8    ONLINE
  9    ONLINE
 10    ONLINE
 11    ONLINE
 12    ONLINE
 13    ONLINE
 
12 rows selected.
 
SQL> select action_time,action,version,bundle_series,comments from dba_registry_history; 
 
ACTION_TIME                       ACTION  VERSION    BUNDLE_SERIES    COMMENTS
--------------------------------  ------- ---------  ---------------  ---------------
24-MAY-13 01.20.05.485655000 PM   APPLY   12.1.0.1   PSU      Patchset 12.1.0.0.0
08-JUL-13 04.12.17.807394000 PM   APPLY   12.1.0.1   PSU      Patchset 12.1.0.0.0
				

Nota: Como você pode ver pela view dba_registery_history nosso database não teve nehum patch aplicado ainda.

Cenário: Nós iremos remover um datafule de um dos pluggable database com um comando do sistema operacional e iremos reiniciar o container database. Como você sabe, quando inicializamos um container database, os pluggable databases não são abertos automaticamente. Nós devemos usar o comando SQL alter pluggable database <pluggable database name> open; ou alter pluggable database all open; Antes de tudo fizemos um backup full do Container Database com o Recover Manager (RMAN):

 [oracle@oel62-ora12c /]$ rman target /

Recovery Manager: Release 12.1.0.1.0 - Production on Wed Feb 12 12:52:32 2014
Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
connected to target database: PRMCDB (DBID=2504197888)
 
RMAN> backup database plus archivelog delete all input;
 
Starting backup at 12-FEB-14
current log archived
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
 
...
 
Finished backup at 12-FEB-14
 
Starting Control File and SPFILE Autobackup at 12-FEB-14
piece handle=/u01/app/oracle/fra/PRMCDB/autobackup/2014_02_12/o1_mf_s_839336238_9hpfvkm7_.bkp comment=NONE
Finished Control File and SPFILE Autobackup at 12-FEB-14 

Agora Irei remver um datafile do Pluggable Database prmpdb02.

 SQL> select con_id, name, open_mode from v$pdbs;

 
CON_ID   NAME          OPEN_MODE
------   ------------  ----------
  2      PDB$SEED      READ ONLY
  3      PRMPDB01      READ WRITE
  4      PRMPDB02      READ WRITE
 
SQL> select file#, name from v$datafile; 
 
FILE#    NAME
-----    -----------------------------------------------------
  1      /u01/app/oracle/oradata/prmcdb/system01.dbf
  3      /u01/app/oracle/oradata/prmcdb/sysaux01.dbf
  4      /u01/app/oracle/oradata/prmcdb/undotbs01.dbf
  5      /u01/app/oracle/oradata/prmcdb/pdbseed/system01.dbf
  6      /u01/app/oracle/oradata/prmcdb/users01.dbf
  7      /u01/app/oracle/oradata/prmcdb/pdbseed/sysaux01.dbf
  8      /u01/app/oracle/oradata/prmcdb/prmpdb01/system01.dbf
  9      /u01/app/oracle/oradata/prmcdb/prmpdb01/sysaux01.dbf
 10      /u01/app/oracle/oradata/prmcdb/prmpdb01/prmpdb01_users01.dbf
 11      /u01/app/oracle/oradata/prmcdb/prmpdb02/system01.dbf
 12      /u01/app/oracle/oradata/prmcdb/prmpdb02/sysaux01.dbf
 13      /u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf
 
SQL> ! rm –fr /u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf
 
SQL> shutdown immediate;
ORA-03113: end-of-file on communication channel
 
SQL> exit
 
Disconnected from Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
With the Partitioning, OLAP, Advanced Analytics and Real Application Testing options 

Como você vê, nós precisamos inicializar o Container Database:

  [oracle@oel62-ora12c /]$ sqlplus "/ as sysdba"

 
SQL*Plus: Release 12.1.0.1.0 Production on Wed Feb 12 13:52:32 2014
 
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to an idle instance.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area 801701888 bytes
Fixed Size        2293496 bytes
Variable Size     377487624 bytes
Database Buffers  419430400 bytes
Redo Buffers      2490368 bytes
Database mounted.
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf' 

O que ocorre? Container Database não está aberto Não, o database não está aberto, por causa do datafile 13 que não foi encontrado. Sim, nós podemos abrir o container database colocando este datafile offline, então podemos abrir o CDB and podemos abrir os outros PDBs. Por um outro lado, podemos restaurar e recuperar o datafile antes de abrir os outros databases. Eu restaurei o datafile removido e abri todos os PDBs novamente. Se você aplicar o Patch 17552800 (12.1.0.1.2 Database Patch Set Update released: January 14, 2014), não irá conhecer este problema, CDB irá abrir normalmente. Quando for abrir todos os PDBs, o CDB irá pular a abertura do PDB com problemas e irá abrir os demais.

Patch

Nós baixamos e aplicamos este patch .

  SQL> select action_time,action,version,bundle_series,comments from dba_registry_history;

 
ACTION_TIME                       ACTION   VERSION   BUNDLE_SERIES  COMMENTS
--------------------------------  ------- ---------  ------------- ---------------
24-MAY-13 01.20.05.485655000 PM   APPLY   12.1.0.1   PSU      Patchset 12.1.0.0.0
08-JUL-13 04.12.17.807394000 PM   APPLY   12.1.0.1   PSU      Patchset 12.1.0.0.0
12-FEB-14 09.48.05.383369000 AM   APPLY   12.1.0.1   PSU      PSU 12.1.0.1.2
 
SQL> select * from dba_registry_sqlpatch;
 
PATCH_ID ACTION STATUS ACTION_TIME DESCRIPTION LOGFILE
17552800 APPLY SUCCESS 12-FEB-14 09.49.00.559171000 AM bundle:PSU 
/u01/app/oracle/product/12.1.0/dbhome/sqlpatch/17552800/17552800_apply_PRMCDB_CDBROOT_2014Feb12_09_47_49.log

Nós backupeamos nosso database e tentamos mais uma vez reproduzir o mesmo problema.

  SQL> ! rm -fr /u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf

 
SQL> shut immediate;
Database closed.
Database dismounted.
ORACLE instance shut down.
 
SQL> startup
ORACLE instance started.
 
Total System Global Area 801701888 bytes
Fixed Size      2293496 bytes
Variable Size    377487624 bytes
Database Buffers   419430400 bytes
Redo Buffers      2490368 bytes
Database mounted.
Database opened.

Agora o Container Database abriu sem qualquer erro. Agora irei abrir todos os Pluggable Databases.

 SQL> alter pluggable database all open;

alter pluggable database all open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file  - see DBWR trace file
 
SQL> select name, open_mode from v$pdbs;
 
NAME          OPEN_MODE
------------- ----------
PDB$SEED      READ ONLY
PRMPDB01      READ WRITE
PRMPDB02      MOUNTED
 
SQL> select file#, status, error from  v$datafile_header;
 
FILE#   STATUS    ERROR
-----   --------  ---------------------------------------
  1     ONLINE
  3     ONLINE
  4     ONLINE
  5     ONLINE
  6     ONLINE
  7     ONLINE
  8     ONLINE
  9     ONLINE
 10     ONLINE
 11     ONLINE
 12     ONLINE
 13     ONLINE    FILE NOT FOUND  

Eu peguei o erro, mas outro pluggable database pode ser aberto e agora o alert log mostra:

 SQL> alter pluggable database all open;

alter pluggable database all open
*
ERROR at line 1:
ORA-01157: cannot identify/lock data file  - see DBWR trace file
 
SQL> select name, open_mode from v$pdbs;
 
NAME          OPEN_MODE
------------- ----------
PDB$SEED      READ ONLY
PRMPDB01      READ WRITE
PRMPDB02      MOUNTED
 
SQL> select file#, status, error from  v$datafile_header;
 
FILE#   STATUS    ERROR
-----   --------  ---------------------------------------
  1     ONLINE
  3     ONLINE
  4     ONLINE
  5     ONLINE
  6     ONLINE
  7     ONLINE
  8     ONLINE
  9     ONLINE
 10     ONLINE
 11     ONLINE
 12     ONLINE
 13     ONLINE    FILE NOT FOUND
 
12 rows selected.

Eu peguei o erro, mas outro pluggable database pode ser aberto  e agora o alert log mostra:

alter pluggable database all open

Wed Feb 12 15:11:15 2014
Errors in file /u01/app/oracle/diag/rdbms/prmcdb/prmcdb/trace/prmcdb_dbw0_11432.trc:
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf'
ORA-27037: unable to obtain file status
Linux-x86_64 Error: 2: No such file or directory
Additional information: 3

Wed Feb 12 15:11:15 2014
Pdb PRMPDB02 hit error 1157 during open read write and will be closed.
ALTER SYSTEM: Flushing buffer cache inst=0 container=4 local

Wed Feb 12 15:11:15 2014
Errors in file /u01/app/oracle/diag/rdbms/prmcdb/prmcdb/trace/prmcdb_p001_11482.trc:
ORA-01157: cannot identify/lock data file 13 - see DBWR trace file
ORA-01110: data file 13: '/u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf'

Wed Feb 12 15:11:18 2014
Due to limited space in shared pool (need 6094848 bytes, have 3981120 bytes), 
limiting Resource Manager entities from 2048 to 32
Opening pdb PRMPDB01 (3) with no Resource Manager plan active
Pluggable database PRMPDB01 opened read write
ORA-1157 signalled during: alter pluggable database all open...

Wed Feb 12 15:11:41 2014
Shared IO Pool defaulting to 24MB

Sim, outrso Pluggable Databases foram abertos normalmente. CDB pulou a abertura do prmdb02 (cujo um dos seus datafile não foi econtrado). Nós podemos restaurar o Pluggable Database com o RMAN:

  [oracle@oel62-ora12c ~]$ export ORACLE_SID=prmcdb

[oracle@oel62-ora12c ~]$ rman target / 
 
Recovery Manager: Release 12.1.0.1.0 - Production on Wed Feb 12 15:26:42 2014
 
Copyright (c) 1982, 2013, Oracle and/or its affiliates.  All rights reserved.
connected to target database: PRMCDB (DBID=2504197888)
 
RMAN> restore pluggable database prmpdb02;
 
Starting restore at 12-FEB-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=44 device type=DISK
 
channel ORA_DISK_1: starting datafile backup set restore
channel ORA_DISK_1: specifying datafile(s) to restore from backup set
channel ORA_DISK_1: restoring datafile 00011 to /u01/app/oracle/oradata/prmcdb/prmpdb02/system01.dbf
channel ORA_DISK_1: restoring datafile 00012 to /u01/app/oracle/oradata/prmcdb/prmpdb02/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00013 to /u01/app/oracle/oradata/prmcdb/prmpdb02/prmpdb02_users01.dbf
channel ORA_DISK_1: reading from backup piece /u01/app/oracle/fra/PRMCDB/F231EDEC22372112E043AA38A8C01F0B/
backupset/2014_02_12/o1_mf_nnndf_TAG20140212T125307_9hpfs0td_.bkp
channel ORA_DISK_1: piece handle=/u01/app/oracle/fra/PRMCDB/F231EDEC22372112E043AA38A8C01F0B/
backupset/2014_02_12/o1_mf_nnndf_TAG20140212T125307_9hpfs0td_.bkp tag=TAG20140212T125307
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:25
Finished restore at 12-FEB-14
 
RMAN> recover pluggable database prmpdb02;
 
Starting recover at 12-FEB-14
using channel ORA_DISK_1
 
starting media recovery
media recovery complete, elapsed time: 00:00:09
 
Finished recover at 12-FEB-14
 
RMAN> alter pluggable database prmpdb02 open;
 
Statement processed
 
RMAN> select name, open_mode from v$pdbs;
 
NAME                           OPEN_MODE 
------------------------------ ----------
PDB$SEED                       READ ONLY 
PRMPDB01                       READ WRITE
PRMPDB02                       READ WRITE

Conclusão Como podemos ver, depois de aplicado o PSU1, um problema de mídia em um PDB não afeta qualquer outro PDB. Isso quer dizer que quando usamos Pluggable Databases para diferentes aplicações, um problema em um PDB não vai afetar outras aplicações em outros PDBs.


Joel é um DBA expert com mais de 12 anos de experiência, especializado nas áreas de bases de dados com especial ênfase em soluções de alta disponibilidade (RAC, Dataguard, e outros). É um palestrante habitual em eventos de Oracle como: OTN LAD TOUR e outros. É o primeiro latino-americano a ser nomeado "OTN Expert " no ano de 2003 e é Oracle ACE Director. Durante estes anos, Joel trabalhou como consultor senior em um grande número de empresas e clientes em diversos países: Venezuela, Panama, Costa Rica, Dominican Rep., Haiti, Nicaragua, Guatemala, Colombia, Honduras, Ecuador, Mexico, India, Italy, France.

Mahir é um DBA Senior com mais de 10 anos de experiência no Oracle Database com foco especial em Alta disponibilidade e soluções de Recuperação contra desastres (RAC, Data Guard, RMAN,…). Atualmente trabalha para o Central Bank of the Republic of Azerbaijan. Ele é um Oracle Certified Professional DBA. Mahir é palestrante do Azerbaijan Oracle User Group (AZEROUG) e também é blogger.

Mufalani é um DBA Sr. com mais de 10 anos de experiência, começou com o Oracle 8i, mas teve a oportunidade de dar suporte a Oracle 7.3.4 em diante. É especialista em banco de dados Oracle com foco principal em Performance &Tuning e RAC. É palestrante em eventos de Oracle como: OTN LAD TOUR e outros. Atualmente trabalha como consultor diversas empresas no segmento de variados ramos como: Educação, Saúde, Tecnologia, Seguros e etc. Foi o terceiro Oracle ACE a ser nomeado no Brasil e é OCP DBA nas versões 10g e 11g. Siga Mufalani em seu blog ou no twitter @mufalani.