RECOVERY ORACLE DATABASE
Bem-vindos ao nosso laboratório de recuperação de dados no Banco de Dados Oracle, onde vamos aprender sobre o processo de recuperação em diferentes contextos: Ambiente Standard e Ambiente Enterprise. Neste ambiente de aprendizado, vamos desvendar os passos essenciais para recuperar dados valiosos em cenários desafiadores.
Durante este lab abordaremos cenários como:
1. Recuperação Após Perda Total de Datafiles: Exploraremos como recuperar dados quando todos os arquivos de dados estão perdidos, utilizando estratégias de recuperação.
2.Recuperação de Um Tablespace Específico: Mostraremos como restaurar um tablespace comprometido, destacando as nuances da recuperação.
3.Recuperação Ponto a Ponto: Aprenderemos como atingir um ponto específico no tempo, executando recuperações pontuais.
4.Recuperação Após Falha de Mídia: Abordaremos como lidar com falhas de mídia e como realizar recuperação.
5.Recuperação Após Erro Humano: Discutiremos como reverter alterações indesejadas, com foco na aplicação prática desses procedimentos em ambientes distintos.
Este laboratório é uma oportunidade única para desenvolver uma compreensão clara das diferenças e semelhanças entre a recuperação de dados em ambientes Standard e Enterprise no Banco de Dados Oracle. Ao final, você estará equipado com conhecimentos práticos que permitirão enfrentar com confiança as situações de perda de dados e manter a integridade de seu ambiente de banco de dados, independentemente de sua configuração. Vamos começar a jornada rumo à maestria na recuperação de dados no Oracle!
Requisitos:
- Oracle linux 7.9
- Oracle Database 19c Standard Edition
- Oracle Database 19c Standard Edition
Recuperação Após Perda Total de Datafiles
Neste primeiro caso iremos simular uma perca total de todos Datafiles. Seja em ambienteStandard ou Enterprise, iremos realizar a recuperação da mesma forma.
$ cd /u01/oradata/WINT/ $ rm -rf *.dbf
Passo 1: Avaliação da Situação
- Se todos os seus datafiles foram pro espaço, não entre em pânico. Você tem seus backups do RMAN, certo? E os registros de redo log também são seus amigos.
$ su - oracle $ . ~/.profileWINT $ tail -200f $ORACLE_BASE/diag/rdbms/$ORA_DB_UNQ_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log
Passo 2: Preparar o Ambiente Para Recuperação
- Vamos tentar acessar o rman porem não vamos conseguir, vai ser necessário baixar o banco e tentar montar novamente para listar os backups
- Como o banco de dados estava em aberto, vamos precisar encerrar ele para iniciar a recuperação.
- Ao tentar baixar o banco vamos observar que vai ser necessário utilizar o comando abort para encerrar a instância.
- Agora iremos iniciar o banco em mount para iniciar a recuperação
$ rman target / $ sqlplus / as sysdba # shutdown immediate; ( Vai dar erro ) # shutdown abort; # startup mount;
Passo 3: Listar os backups disponível
- Vamos primeiro listar os backups e verificar qual backup está mais recente.
$ rman target / > list backupset of database;
Passo 4: Restauração do banco de dados
- Agora chegou a hora de restaurar os datafiles a partir do backup mais recente.
> restore database;
Passo 5: Recuperação do banco de dados
- Depois de restaurar os datafiles, você precisa recuperar o banco de dados para deixá-lo consistente. O RMAN vai aplicar os registros de redo log nos datafiles
restaurados. - Após a recuperação, o banco de dados estará em modo de recuperação.
> recover database; > alter database open;
Finalizado! Independentemente de estar no Oracle Standard ou Enterprise, o processo é bastante similar.
Recuperação de Um Tablespace Específico
Agora iremos simular a perca de um datafile de alguma tablespace. Neste caso iremos deletar um datafile da TS_DADOS e iremos recuperar ele.
$ cd /u01/oradata/WINT/ $ rm -rf ts_dados01.dbf
Passo 1: Identificação do Problema
- Identificamos pelo alert.log que após tentativa de utilizar o banco ele mostra que não encontrou o datafile 4 no diretório.
- No rman podemos realizar uma validação para identificar também o problema
$ su - oracle $ . ~/.profileORCL $ tail -200f $ORACLE_BASE/diag/rdbms/$ORA_DB_UNQ_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log $ rman target / > validate database:
Passo 2: Localizando a Peça de Backup
- Agora iremos verificar quais backups de datafile estão disponíveis.
> list backup of datafile 4;
- Para iniciar a restauração do datafile, primeiro iremos deixar ele em OFFLINE.
- Agora podemos restaurar o datafile afetado
> alter database datafile 4 offline; > restore datafile 4;
- Após a restauração, você precisa recuperar o datafile para deixá-lo consistente. Então vamos realizar a recuperação.
- Quando a recuperação estiver completa, você pode abrir o datafile para que os usuários possam acessar os dados novamente.
> recover datafile 4; > alter database datafile 4 online;
Finalizado! Independentemente de estar no Oracle Standard ou Enterprise, o processo também é bastante similar.
Recuperação Ponto a Ponto
Agora iremos simular uma alteração indevida em alguma tabela, e iremos realizar uma recuperação desse banco de dados para um ponto específico no tempo, utilizando backups incrementais e logs de redo.
$ su - oracle $ . ~/.profileWINT $ sqlplus / as sysdba # UPDATE ORACLE.CLIENTE SET NOME = 'MURILO'; # COMMIT;
Passo 1: Identificação do Momento Específico
Antes de começar, identifique o momento específico no tempo para o qual deseja recuperar o banco de dados.
# SELECT SEQUENCE#, FIRST_TIME FROM V$ARCHIVED_LOG WHERE APPLIED = 'NO';
Passo 2: Restauração e Recuperação
- No RMAN, baixe o banco de dados e depois coloque o mesmo em mount.
- Agora inicie o processo de recuperação.
# shutdown immediate; # startup mount; $ rman target /
Opção 1: utilizar a sequência para recuperar
RUN { SET UNTIL SEQUENCE=34; RESTORE DATABASE; RECOVER DATABASE; }
Opção 2: utilizar o dia e hora para recuperar
RUN { SET UNTIL TIME="TO_DATE('03/09/2023 20:00:00','DD/MM/YYYY HH24:MI:SS')"; RESTORE DATABASE; RECOVER DATABASE; }
Passo 3: Abrindo o Banco de Dados
- Quando a recuperação estiver completa, você pode abrir o banco de dados para que os usuários possam acessar os dados recuperados.
- Ao tentar abrir o banco normalmente, podemos verificar que vai dar erro e será necessário iniciar uma nova encarnação.
- Também podemos validar;
> alter database open; ( Vai dar erro ) > alter database open resetlogs; $ sqlplus / as sysdba $ select * from oracle.cliente;
Recuperação finalizada!
Recuperação Após Falha de Mídia
Agora iremos simular a perca de dois arquivos após uma falha na mídia. Vamos simular a perca do spfile e controlfile.
$ cd /u01/app/oracle/19.3.0.0/db_1/dbs/ $ rm -rf initWINT.ora spfileWINT.ora # rm -rf /u01/oradata/WINT/control01.ctl # rm -rf /u01/app/oracle/fast_recovery_area/WINT/control02.ctl
Passo 1: Identificando o problema
- Verificamos no alertlog que os erros apresentados, no primeiro momento podemos ver que ele alertou somente sobre a falta do controlfile.
$ su - oracle $ . ~/.profileWINT $ tail -200f $ORACLE_BASE/diag/rdbms/$ORA_DB_UNQ_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log
Passo 2: Preparação para restauração
- Como não vamos conseguir baixar a instância normalmente, vamos precisar executar o comando “Shutdown Abort” para poder iniciar a restauração
- Para iniciar a restauração do Control file é necessário deixar o banco de dados em Nomount, pois para montar o banco o Control file é necessário.
- Ao tentar deixar o banco de dados em Nomount, ele nos da o erro de que também não tem o Spfile.
$ sqlplus / as sysdba $ shutdown immediate; ( Vai dar erro ) $ shutdown abort; $ startup nomount;
Passo 3: Restauração spfile
- Para deixar o banco em Nomount primeiro vamos resolver o erro sobre o Spfile.
- Para recuperar o spfile, nos podemos ir no alert.log da instância para verificar os parâmetros necessários para criar um pfile. Esses parâmetros foram gravados
quando o banco foi iniciado anteriormente. - Agora que pegamos os parâmetros, iremos criar o Pfile com os parâmetros que copiamos no alert.log e iremos colocar o banco em Nomount com o Pfile criado.
$ vim $ORACLE_BASE/diag/rdbms/$ORA_DB_UNQ_NAME/$ORACLE_SID/trace/alert_$ORACLE_SID.log $ vim /u01/app/oracle/19.3.0.0/db_1/dbs/initWINT.ora # sqlplus / as sysdba # startup nomount pfile='/u01/app/oracle/19.3.0.0/db_1/dbs/initWINT.ora';
Passo 4: Restauração Control file
- Pronto, com o banco em Nomount já podemos restaurar o Control file pelo backup e criar o Spfile.
Passo 5: Finalizando recuperação.
- Após realizar o restauração do Control file é necessário realizar a recuperação para atualizar o Control file
- Ao tentar deixar o banco de dados em open vamos verificar que é necessário iniciar uma nova encarnação após perca do Control file.
> recover database; > alter database open; ( Vai dar erro ) > alter database open resetlogs;
Obs: Como é iniciado uma nova encarnação é importante realizar um novo backup físico full.
Recuperação finalizada!
Recuperação Após Erro Humano
Agora iremos simular erros humanos no banco de dados e iremos realizar a recuperação.
Neste passo iremos fazer um Drop e realizar alguns Update e depois iremos recuperar utilizando backups lógicos e a função flashback.
CASO 1 – Neste caso iremos realizar um drop na tabela e iremos recuperar pelo backup lógico realizado.
$ su – oracle
$ . ~/.profileORCL
$ sqlplus / as sysdba
# DROP TABLE ORACLE.PRODUTO;
OPÇÃO 1 – IMPDP
Passo 1: Identificar a tabela Localizar o backup
- Após saber qual tabela iremos realizar a recuperação, agora iremos analisar o backup logico.
- Verificamos que foi feito o backup logico, agora iremos descompactar o arquivo para iniciar a importação do backup
$ cd /u02/oradata/ORCL/export/ $ rar e EXPDP_ORCL_FULL_28082023-12h.rar
Passo 2: Realizar importação da tabela
- Agora que descompactamos o backup iremos realizar a importação do dump. Para realizar a importação somente de uma tabela iremos utilizar o parâmetro “TABLES” iniciando com o nome do schema.
- Após importação esta produto a recuperação da tabela.
$ impdp system/oracle DUMPFILE=EXPDP_ORCL_FULL_28082023-12h.dmp LOGFILE=IMPDP_TABELA_03092023.LOG TABLES=ORACLE.PRODUTO DIRECTORY=EXPORT_DIR
CASO 2 – Neste caso iremos realizar um UPDATE na tabela sem utilizar a clausula
WHERE iremos recuperar pela cláusula FLASHBACK QUERY usando o operador AS OF TIMESTAMP ou AS OF SCN
$ su - oracle $ sqlplus / as sysdba # UPDATE ORACLE.PRODUTO SET DESCRICAO='TOMADA'; # COMMIT; # SELECT * FROM ORACLE.PRODUTO; ## UPDATE ORACLE.PRODUTO T1 SET T1.DESCRICAO=(SELECT T2.DESCRICAO FROM ORACLE.PRODUTO_BACKUP T2 WHERE T1.CODPROD=T2.CODPROD);
Passo 1: Identificar o tempo para recuperação
- Usuário realizou a alteração na tabela tem pouco tempo e precisamos recuperar essas informações que foram atualizadas indevidamente.
- Para realizar recuperação por SCN precisamos consultar a sequence que está atualmente com esse select abaixo.
# SELECT ORA_ROWSCN, CODPROD, DESCRICAO, MARCAPROD FROM ORACLE.PRODUTO;
Passo 2: Iniciando recuperação dos dados
Opção 1 ‘AS OF TIMESTAMP’
# CREATE TABLE ORACLE.PRODUTO_BACKUP AS SELECT * FROM ORACLE.PRODUTO AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);
Opção 2 ‘AS OF SCN’
# CREATE TABLE ORACLE.PRODUTO_BACKUP AS SELECT * FROM ORACLE.PRODUTO AS OF SCN 1730589;
CASO 3 – Neste caso iremos realizar recuperação da tabela utilizando uma configuração de FLASHBACK que só pode ser ativada na versão Enterprise.
Requisitos :
- Versão Enteprise
- Fashback_on ativado
$ su - oracle $ .~/.profileWINT $ sqlplus / as sysdba # ALTER DATABASE FLASHBACK ON; # ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET = 4320 SCOPE=BOTH; # SELECT FLASHBACK_ON FROM V$DATABASE;
# UPDATE ORACLE.CLIENTE SET NOME='Carolina Almeida' WHERE CODCLI=60; # COMMIT;
Passo 1: Identificando o ponto para recuperação
3. Vamos identificar qual ponto vamos realizar a recuperação pelo Select.
# COLUMN VERSIONS_STARTSCN FORMAT 99999999999999999 # COLUMN VERSIONS_STARTTIME FORMAT A24 # COLUMN VERSIONS_ENDSCN FORMAT 99999999999999999 # COLUMN VERSIONS_ENDTIME FORMAT A24 # COLUMN VERSIONS_XID FORMAT A16 # COLUMN VERSIONS_OPERATION FORMAT A1 # COLUMN NOME FORMAT A24 # SET LINESIZE 200 # SELECT VERSIONS_STARTSCN, VERSIONS_STARTTIME, VERSIONS_ENDSCN, VERSIONS_ENDTIME, VERSIONS_XID, VERSIONS_OPERATION, NOME FROM ORACLE.CLIENTE VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2023-08-28 15:05:08', 'YYYY-MM-DD HH24:MI:SS') AND TO_TIMESTAMP('2023-08-28 15:15:34', 'YYYY-MM-DD HH24:MI:SS') WHERE CODCLI=60;
Passo 2: Agora que identificamos o ponto que foi feito alteração na tabela iremos realizar a recuperação dos dados.
# CREATE TABLE ORACLE.CLIENTE_BACKUP AS SELECT * FROM ORACLE.CLIENTE AS OF SCN 1482822; # UPDATE ORACLE.CLIENTE T1 SET T1.NOME=(SELECT T2.NOME FROM ORACLE.CLIENTE_BACKUP T2 WHERE T2.CODCLI=60) WHERE T1.CODCLI=60;
A diferença do parâmetro flashback_on estar ativo significa que teremos um tempo maior de “retenção” das informações que foram alteradas para realizar a recuperação delas. Os comandos executados para recuperação também são possíveis realizar em ambiente standard, porém com um período menor de retenção dessas informações.