quinta-feira, 2 de setembro de 2010

Como recuperar registros alterados/excluídos no Oracle com Flashback.

Este artigo da uma introdução e alguns exemplos de como utilizar o Oracle Flashback para recuperar dados alterados/excluídos no banco de dados.


Este artigo será sobre uma feature disponível nos bancos 9i ou superior e que eu considero uma ferramenta muito poderosa do Oracle, o Oracle Flashback.

A partir da versão 9i do banco, a Oracle introduz o conceito de UNDO e com ela uma funcionalidade que permite ao usuário errar e ao DBA recuperar um registro muito mais facilmente do que nas versões anteriores.

Quem já teve que voltar dados na versão 8i sabe que é muito trabalhoso porque ou usa-se um backup frio (export) ou utilizando o LogMiner ou para quem pagou os pecados montado somente uma parte de uma instancia com hot backup.

Com o conceito do UNDO veio o tempo de retenção definido pelo parâmetro UNDO_RETENTION (em segundos). Este parâmetro vai ser muito importante para o Flashback porque o seu “significado” é: “Quanto tempo de TENTAR manter as transações no segmento de UNDO?”. Por padrão 15 minutos.

Isso significa que durante UNDO_RETENTION segundos o banco tentar manter as transações mesmo comitadas no segmento de undo para que você possa utilizá-la para recuperar os registros alterados/excluídos.

Faremos com exemplos, criando uma simples tabela para realizar os testes como segue:

create table artigo3 (id number);

insert into artigo3 values(1);
insert into artigo3 values(2);
insert into artigo3 values(3);
insert into artigo3 values(4);

commit;

É claro que se fizermos um select agora obtemos os registros que acabaram de ser incluido:

SQL> select * from artigo3;
ID
----------
1
2
3
4

Para que o flashback funcione como esperado, vamos atualizar algumas linhas:

update artigo3 set id = id+10 where id = 1;
update artigo3 set id = id+10 where id = 2;
update artigo3 set id = id+10 where id = 3;
update artigo3 set id = id+10 where id = 4;

commit;

Após este commit, espere por 5 ou 10 minutos para simularmos o tempo que iremos saber que o usuário fez algo errado e para trabalhar com um período de tempo mais fácil.

Após estes cinco minutos, faca a simples query na tabela novamente. Os dados atualizados irão aparecer:

SQL> select * from artigo3;

ID
----------
11
12
13
14


Agora utilizando o flashback, vamos visualizar os dados antes da alteração:

SQL> select *
from artigo3
as of timestamp systimestamp - interval '5' minute;

ID
----------
1
2
3
4

A mágica esta no simples “AS OF” da query acima. Este é o flashback na sua forma simplificada. Nas primeiras versões do Oracle 9i era necessário utilizar uma package e era mais trabalhoso também.

Se você quiser salvar estes dados para que não se percam do UNDO, faca um simples insert como se segue:

SQL> insert into artigo3
select *
from artigo3
as of timestamp systimestamp - interval '35' minute;

commit;

Se ainda utilizando o flashback visualizar os dados atualizados, aumente o intervalo na query “interval ‘x’ minute’ ate encontrar o desejado.

Como descrito no começo, o UNDO_RETENTION tenta manter os dados. Não significa que ira funcionar, dependendo da quantidade de transações no seu banco X tempo de retenção.

No banco 10g esta feature se estendeu. Agora é possível visualizar os dados alterados ao mesmo tempo dos dados atuais. O banco 10g também tem uma tabela, a “flashback_transaction_query” que da o usuário que fez a alteração e até o comando para restaurar o registro antigo.

Também no banco 10g a funcionalidade se estendeu a tabela. Agora o conceito de flashback se ao banco, onde temos um dos primeiros conceitos do Apple e já deveria existir a muito tempo, a “Lixeira”.

Agora não há mais perigo de fazer drop de tabela no banco 10g porque podemos recuperar da lixeira, isso tudo como comportamento padrão do banco. Mas quem sabe será tema para outro artigo.

O flashback também se aplica ao dicionário de dados. Se você por exemplo mudou a senha de um usuário e precisa restaura-la, utilize o flashback que funciona perfeitamente.

Como usual, este é só a ponta do iceberg do flashback e parâmetros como UNDO_RETENTION. Existem mais configurações que afetam este parâmetro como o FAST_START_MTTR_TARGET e muito, muito mais sobre flashback no 10g.

Mais informações:
http://tahiti.oracle.com