Restaurando backup ORACLE com RMAN

Como restaurar um backup RMAN

Bem pessoal aqui, neste breve artigo, explicarei como restaurar uma base completamente de um backup RMAN.
Para que tudo ocorra bem, tenha em mãos:
– Backup do Controlfile;
– Backup dos datafiles;
– Backup dos archives;
– Backup ou uma breve noção de seu SPFILE ( PFILE ) hahaha;

Para este artigo estarei usando Oracle11G em plataforma unix ( serve para linux também e para windows com ajustes no caso de criar o PFILE )

* Ao final deste artigo estão os comando usados de forma compilada.

Preparando seu ambiente

Bem, primeiramente, antes de tudo e para começar, vamos prepara nossa base de dados….
Neste artigo, assumirei que as pastas para restore já existem.

Primeiro criemos nosso PFILE. O legal é que o spfile/pfile dificilmente mudam, então tu podes manter uma cópia atualizada dele. Se você não tiver nenhuma cópia dele, não se preocupe! Use sua super memória para lembrar de algumas coisas como:
– db_block_size
– db_name

Só isso Dartanghan? A resposta é: depende! Num caso de uma base simples, sem muitos “frus-frus”, apenas estes dois parametros serão necessários, o resto podemos deduzir ou especificar.

Veja como ficaria um pfile ( extremamente simples ) :

*.memory_target=427819008
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl',
'/u01/app/oracle/oradata/orcl/control02.ctl'
*.db_block_size=8192
*.db_name='orcl'

Bem, isto é o mínimo do mínimo para iniciarmos uma base de dados oracle.
Este arquivo deverá estar no diretório $ORACLE_HOME/dbs, logo veja como criei o meu arquivo:

-bash-4.1$ cat > $ORACLE_HOME/dbs/initorcl.ora
*.memory_target=427819008
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl',
'/u01/app/oracle/oradata/orcl/control02.ctl'
*.db_block_size=8192
*.db_name='orcl'

Uma vez com o PFILE criado, iniciemos nossa base em NOMOUNT:

sqlplus / as sysdba <<< "startup nomount"

-bash-4.1$ sqlplus / as sysdba <<< "startup nomount"

SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 3 20:55:57 2014

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

Connected to an idle instance.

SQL> ORACLE instance started.

Total System Global Area  425897984 bytes
Fixed Size                  2211688 bytes
Variable Size             264241304 bytes
Database Buffers          155189248 bytes
Redo Buffers                4255744 bytes
SQL> Disconnected from Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

Restaurando controlfiles

Bem, aqui começa nossa brincadeira. Vamos pegar nosso arquivo de backup do controlfile e restaurá-lo usando o comando RMAN.
Aqui usaremos a seguinte sintaxe:

restore controlfile from ‘ARQUIVO’;

-bash-4.1$ rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 3 20:58:08 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (not mounted)

RMAN> restore controlfile from '/backup/rman/orcl/cf_ORCL_c-1390267789-20141103-00';

Starting restore at 03-NOV-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=19 device type=DISK

channel ORA_DISK_1: restoring control file
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
output file name=/u01/app/oracle/oradata/orcl/control01.ctl
output file name=/u01/app/oracle/oradata/orcl/control02.ctl
Finished restore at 03-NOV-14

RMAN>

Observe que o RMAN utiliza os caminhos informados em nosso recém criado PFILE para criar os controlfiles.
OBS: é possível restaurar uma base de dados sem os controlfiles originais, porém é muito conteúdo para este simples artigo 🙂

Restaurando Datafiles

Agora o bicho pega, nesta fase deveremos subir a base em MOUNT e catalogar os arquivos de backup. Uma vez com eles catalogados, iniciaremos o restore.

Primeiramente abriremos o RMAN, iniciaremos em MOUNT e catalogaremos os arquivos:

sql ‘alter database mount’;: Monta a base.
catalog start with ‘/backup/rman/orcl’ noprompt;: cataloga todos os arquivos de um diretório.

-bash-4.1$ rman target /

Recovery Manager: Release 11.2.0.1.0 - Production on Mon Nov 3 21:01:30 2014

Copyright (c) 1982, 2009, Oracle and/or its affiliates.  All rights reserved.

connected to target database: ORCL (not mounted)

RMAN>  sql 'alter database mount';

using target database control file instead of recovery catalog
sql statement: alter database mount

RMAN> catalog  start with '/backup/rman/orcl' noprompt;

searching for all files that match the pattern /backup/rman/orcl

List of Files Unknown to the Database
=====================================
File Name: /backup/rman/orcl/df_ORCL_20141103_862688405
File Name: /backup/rman/orcl/df_ORCL_20141103_862688231
File Name: /backup/rman/orcl/cf_ORCL_c-1390267789-20141103-01
File Name: /backup/rman/orcl/cf_ORCL_c-1390267789-20141103-00
File Name: /backup/rman/orcl/df_ORCL_20141103_862688229
cataloging files...
cataloging done

List of Cataloged Files
=======================
File Name: /backup/rman/orcl/df_ORCL_20141103_862688405
File Name: /backup/rman/orcl/df_ORCL_20141103_862688231
File Name: /backup/rman/orcl/cf_ORCL_c-1390267789-20141103-01
File Name: /backup/rman/orcl/cf_ORCL_c-1390267789-20141103-00
File Name: /backup/rman/orcl/df_ORCL_20141103_862688229

RMAN>

Prontoooo! Agora basta restaurar os arquivos do banco ( datafiles ) com o comando:

restore database;

RMAN> restore database;

Starting restore at 03-NOV-14
using target database control file instead of recovery catalog
allocated channel: ORA_DISK_1
channel ORA_DISK_1: SID=1 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 00001 to /u01/app/oracle/oradata/orcl/system01.dbf
channel ORA_DISK_1: restoring datafile 00002 to /u01/app/oracle/oradata/orcl/sysaux01.dbf
channel ORA_DISK_1: restoring datafile 00003 to /u01/app/oracle/oradata/orcl/undotbs01.dbf
channel ORA_DISK_1: restoring datafile 00004 to /u01/app/oracle/oradata/orcl/users01.dbf
channel ORA_DISK_1: reading from backup piece /backup/rman/orcl/df_ORCL_862686048
...
channel ORA_DISK_1: restore complete, elapsed time: 00:06:56
Finished restore at 03-NOV-14

Finalizando com recover

E agora é a reta final, vamos aplicar os archives e subir nossa base restaurada!
Primeiramente, apliquemos os archives com:

recover database;

RMAN> recover database;

Starting recover at 03-NOV-14
...
starting media recovery

channel ORA_DISK_1: starting archived log restore to default destination
channel ORA_DISK_1: restoring archived log
archived log thread=1 sequence=55
channel ORA_DISK_1: reading from backup piece /backup/rman/orcl/df_ORCL_20141103_862688229
channel ORA_DISK_1: piece handle=/backup/rman/orcl/df_ORCL_20141103_862688229 tag=TAG20141103T193709
channel ORA_DISK_1: restored backup piece 1
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
...
channel ORA_DISK_1: restore complete, elapsed time: 00:00:01
archived log file name=/u01/app/oracle/product/11.2.0/dbhome_1/dbs/arch1_56_862487053.dbf thread=1 sequence=56
unable to find archived log
archived log thread=1 sequence=57
RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03002: failure of recover command at 11/03/2014 22:18:05
RMAN-06054: media recovery requesting unknown archived log for thread 1 with sequence 57 and starting SCN of 647088

Observe que ao final do recover um erro será exibido. Aqui o RMAN está dizendo que faltou um archive para aplicar. Não se preocupe! é natural faltar um archive ao final de um restore, pois o Oracle vai aplicando os archive conforme vai achando e, se o backup for feito antes dos redos tenham sido archivados, pode faltar archive. ( Para não reclamar deveriamos ter a cópia dos redologs, que está fora do escopo deste artigo hehehe ).

E finalmente, vamos subir nossa baseeee!

RMAN> sql 'alter database open resetlogs';

sql statement: alter database open resetlogs

Confirme o start da base com:
sqlplus / as sysdba <<< "select status,INSTANCE_NAME from v\$instance;"

-bash-4.1$ sqlplus / as sysdba <<< "select status,INSTANCE_NAME from v\$instance;"

SQL*Plus: Release 11.2.0.1.0 Production on Mon Nov 3 22:22:30 2014

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


Connected to:
Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

SQL>
STATUS       INSTANCE_NAME
------------ ----------------
OPEN         orcl

SQL> Disconnected from Oracle Database 11g Release 11.2.0.1.0 - 64bit Production

Conclusão

Este procedimento é um conjunto de passos bem simples para o restore de uma base. Sempre tenha um backup de sua base atualizado, sempre tenha uma cópia do PFILE para evitar surpresas e sempre, sempre, sempre faça backup dos archivelogs!

Para fins de documentação, segue o script de backup que usei para montar este artigo:

#!/bin/bash

export ORACLE_SID=orcl

mkdir /backup/rman/$ORACLE_SID
rman target / << _EOF
CONFIGURE CONTROLFILE AUTOBACKUP FORMAT FOR DEVICE TYPE DISK TO '/backup/rman/$ORACLE_SID/cf_%d_%T_%t';
CONFIGURE CHANNEL DEVICE TYPE DISK FORMAT '/backup/rman/$ORACLE_SID/df_%d_%T_%t';
CONFIGURE CONTROLFILE AUTOBACKUP ON;
run{
backup as backupset incremental level 1 database plus archivelog ;
}
_EOF

Isso ai!

Um grande abraço para você e tudo de bom!

Comandos usados

CRIAR PFILE:

cat > $ORACLE_HOME/dbs/initorcl.ora
*.memory_target=427819008
*.control_files='/u01/app/oracle/oradata/orcl/control01.ctl','/u01/app/oracle/oradata/orcl/control02.ctl'
*.db_block_size=8192
*.db_name='orcl'

RESTAURAR CONTROLFILE ( coloque o caminho do backup do controlfile )

sqlplus / as sysdba <<< "startup nomount"
rman target / << _EOF
run{
restore controlfile from 'ARQUIVO';
}
_EOF

RESTAURAR COMPLETAMENTE A BASE ( informe o diretorio onde os backups estão )

rman target / << _EOF
run{
sql 'alter database mount';
catalog  start with 'DIRETORIO' noprompt;
restore database;
recover database;
sql 'alter database open resetlogs';
}
_EOF

Deixe uma resposta