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