Imagine a situação você faz backup da sua base todo dia as 17h, e um belo dia as 16:30h uma tabela é deletada indevidamente, você vai perder um dia de trabalho por isso? Lembrando que não é só o seu trabalho mas o de toda a empresa. Por isso a partir da versão 9i a Oracle implementou Flashback Query.
A primeira pergunta que deve ser feita é quanto tempo faz que os dados foram deletados, quanto mais rápido o erro for descoberto melhor, pois podemos simplesmente usar o comando " as of timestamp systimestamp - interval 'X' minute" o que ele faz, bem no meu caso ele é um salva vidas, ao colocar esse comando no seu select ele vai te apresentar a tabela como ela estava a X minutos, onde X é o tempo em que você sabe que a informação estava ali, consegui fazer isso ate 85 minutos, porem esse tempo vai depender da configuração da undo.
Para ficar claro como esse comando pode ser usado vou simular que todos os dados de uma tabela foram deletados indevidamente (delete sem where), esse comando pode ser usado apos qualquer comando DML que tenha alterado incorretamente os dados (insert, update, delete).
Recuperando seus dados
Primeiro vamos criar a tabela teste:
CREATE TABLE teste (id_teste NUMBER, nome_teste VARCHAR(50));
Depois vamos carregar alguns dados na tabela:
INSERT INTO teste VALUES (1, 'PRIMEIRO TESTE');
INSERT INTO teste VALUES (2, ' SEGUNDO TESTE');
INSERT INTO teste VALUES (3, 'TERCEIRO TESTE');
COMMIT;
SELECT * FROM teste;
O retorno será:
ID_TESTE NOME_TESTE
---------- --------------------------------------------------
1 PRIMEIRO TESTE
2 SEGUNDO TESTE
3 TERCEIRO TESTE
Agora damos um delete nessa tabela
DELETE teste;
nosso select terá o seguinte retorno:
ID_TESTE NOME_TESTE
---------- --------------------------------------------------
Mas se colocarmos o Flashback Query em 1 minuto teremos o seguinte retorno:
select * from teste as of timestamp systimestamp - interval '1' minute;
ID_TESTE NOME_TESTE
---------- --------------------------------------------------
1 PRIMEIRO TESTE
2 SEGUNDO TESTE
3 TERCEIRO TESTE
---------- --------------------------------------------------
Mas se colocarmos o Flashback Query em 1 minuto teremos o seguinte retorno:
select * from teste as of timestamp systimestamp - interval '1' minute;
ID_TESTE NOME_TESTE
---------- --------------------------------------------------
1 PRIMEIRO TESTE
2 SEGUNDO TESTE
3 TERCEIRO TESTE
Para recuperar os dados para a tabela basta realizar o insert abaixo:
INSERT INTO teste (SELECT * FROM teste AS OF TIMESTAMP SYSTIMESTAMP - INTERVAL '1' MINUTE);
Pronto os dados deletados a 1 minuto foram recuperados.
Esse tópico foi mais objetivo do que descritivo pois considero que quem esta buscando essa informação tempo pouco tempo para agir, em breve escrevo de forma mais detalhada e explicativa sobre recuperação de dados.