GPO ( Grupo de Profissionais Oracle )
A maior comunidade Oracle do Brasil !

Flashback

Olá pessoal!

Neste post vou falar um pouco sobre o “FlashBack” e dar uns exemplos de como utilizar.

Breve Descrição:

A partir da versão 10g foi implantado no Oracle o Flashback.
Este é um grupo de recurso que fornece uma maneira de visualizar estados passados de objetos do banco, ou para retornar registros para um estado anterior a alguma atualização, sem utilizar backup.

O Flashback utiliza o “Automatic Undo” do Oracle para desfazer de dados afetados por operações individuais.

Vamos para a prática….

Imaginem a seguinte situação:

Você chega para trabalhar e logo as 08h05min toca o telefone, a ligação é de seu superior pedindo um suporte urgente em uma rotina da contabilidade, pois o pessoal da contabilidade precisa entregar um balancete até as 17h00min e os dados que estão retornando estão incorretos.

A primeira coisa a se fazer neste momento é respirar fundo, pegar um cafezinho e por a mão na massa!

Após as análises necessárias você chega à conclusão que é necessário modificar algumas rotinas e também decide deletar alguns registros “inúteis” da tabela “X” e dropar a tabela temporária “Y”.

Em determinado momento, você criou um script que deletava alguns registros, e também dropava a tabela “Y” e no final você “commitou” a transação, pois você acredita ser essa a solução para o problema.

Eis que você executa seu script e informa seu superior que está tudo pronto.
Logo após seu superior liga e diz:
“Viu fulano, está tudo certo, mas não estão aparecendo determinados registros, esses são muito importante para o relatório, poderia verificar?”

Pronto, agora sim, se você já passou por uma situação parecida, não preciso nem descrever o quanto seu coração disparou e bateu um calor insuportável. Pois os registros que ele precisa é justamente aqueles que você deletou, e para piorar você também vai precisar daquela tabela temporária “Y” que você dropou.

E agora? Se você deseja recuperar dados deletados, recuperar tabela dropada ou algo do tipo, para não tomar um “fumão” no final da tarde, felizmente vou mostrar como se utiliza o Flashback.

Abaixo vou mostrar uma de suas utilizações:
Recuperando os dados excluídos da tabela “X”.

Antes de apagar os dados da tabela, esses eram os registros.

Na imagem acima, estou simulando o “script errado”, aquele que apagou e modificou os registros. Suponhamos que após executar o script, teremos os registros acima, mas nós desejamos voltar os dados da tabela.

Na imagem acima temos 4 selects, vou explicar um por vez:

1º Select (Tempo desde o último commit)
Com este select, podemos visualizar dados importantes, para utilizarmos o Flashback, ele informa quando foi realizada a ultima atualização (ULTIMA_ATUALIZACAO), a hora atual(HORA_ATUAL) e quanto tempo decorreu desde a última atualização(TEMPO_ULT_ATUALIZACAO).
Neste caso, podemos ver que a última atualização ocorreu em 5:55 minutos.

2º Select (Habilitando Movimento de Linhas)
Com este select, nós habilitamos o “movimento de linhas” da tabela, este é necessário para que o Oracle consiga recuperar os dados “anteriores”.

3º Select (Recuperando estado anterior dos registros)
Esse é o famoso “flashback”, nele você informa a tabela que deseja recuperar os registros e o intervalo que deseja “voltar no tempo”. Neste caso, devemos voltar antes da última atualização ou seja antes de 5:55 minutos, como exemplo utilizei 10 minutos.
“Portanto com este “flashback” estamos voltando 10 minutos atrás”.

4º Select (Desabilitando Movimento de Linhas)
Com este select, nós desabilitamos o “movimento de linhas” da tabela, pois já realizamos o flashback.

Após executar os passos acima, podemos visualizar novamente os dados da tabela e assim, recuperamos nossos registros antigos!

Recuperando a tabela dropada “Y”.
Qualquer tabela dropada com o comando “drop table ;” é enviada para a “lixeira” do Oracle, o Recyclebin. Assim podemos recuperar qualquer tabela dropada.

Atenção: Quando dropamos uma tabela utilizando o comando “purge” (dropa table purge;) a tabela é dropada direto, não indo para o recyclebin, sendo impossível sua recuperação através do FlashBack.

Para recuperar uma tabela dropada utilizei os comandos acima, a saída desses comandos estará na imagem a seguir com suas devidas explicações.

Esta imagem é a saída do script executado na tela anterior.

1- Fiz um select na tabela dropada, para visualizar os dados da mesma.
2- Dropei a tabela
3- Fiz um select na tabela para verificar sua exclusão
4- Consultei a “lixeira” do oracle.
5- Recuperei a tabela através do comando flashback
6- Realizei novamente um select na tabela dropada, para verificar a integridade dos dados
7- Dropei a tabela utilizando o comando “purge”
8- Verificamos que a tabela dropada não foi para a lixeira desta vez.
9- Confirmando a exclusão da tabela pelo comando purge

Scripts utilizados neste artigo:

Criando e Populando a tabela “TipoEndereco”

-- Create table
create table TIPOENDERECO
(
TIPOENDERECO NUMBER(5) not null,
DESCRICAOTIPOENDERECO VARCHAR2(30),
DATAAUTIALIZACAO DATE,
CODIGOUSUARIOATUALIZACAO VARCHAR2(15)
);

insert into tipoendereco (TIPOENDERECO, DESCRICAOTIPOENDERECO, DATAAUTIALIZACAO, CODIGOUSUARIOATUALIZACAO)
values (1, 'RESIDENCIAL', to_date('05-04-2007 11:37:58', 'dd-mm-yyyy hh24:mi:ss'), '1');

insert into tipoendereco (TIPOENDERECO, DESCRICAOTIPOENDERECO, DATAAUTIALIZACAO, CODIGOUSUARIOATUALIZACAO)
values (2, 'COMERCIAL', to_date('27-08-2009 09:53:39', 'dd-mm-yyyy hh24:mi:ss'), 'Bruno');

insert into tipoendereco (TIPOENDERECO, DESCRICAOTIPOENDERECO, DATAAUTIALIZACAO, CODIGOUSUARIOATUALIZACAO)
values (3, 'OUTROS', to_date('27-08-2009 09:54:55', 'dd-mm-yyyy hh24:mi:ss'), 'Bruno');

Utilizando o Flashback

Visualizando todos os dados da tabela

select * from tipoendereco

–Script que causou o erro

–Realizando Insert Na Tabela

insert into tipoendereco
(tipoendereco, descricaotipoendereco, dataautializacao, codigousuarioatualizacao)
values
(4, 'TESTE', sysdate, 'Bruno');

–Realizando Update no registro

update tipoendereco set descricaotipoendereco = 'AVENIDA' where tipoendereco = 1;

–Realizando Delete na Tabela

delete tipoendereco
where tipoendereco in (2,3);
Commit;

–Utilizando o flashback

–Tempo Desde o Último Commit

select lpad(ltrim((x.a - x.c), '-000000000'), 10) as Tempo_Ult_Atualizacao,
x.a as ultima_atualizacao,
x.c as Hora_Atual
from (SELECT SCN_TO_TIMESTAMP(ORA_ROWSCN) a, ora_rowscn b, sysdate c
FROM tipoendereco)X;

–Habilitando Movimento de Linhas

ALTER TABLE tipoendereco
ENABLE ROW MOVEMENT;

–Recuperando estado anterior dos registros

FLASHBACK TABLE tipoendereco
TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' minute);

–Desabilitando Movimento de Linhas

ALTER TABLE tipoendereco
DISABLE ROW MOVEMENT;

Criando e Populando a tabela “TMP_TESTE”

Create table
create table TMP_TESTE
(
CODIGO NUMBER,
NOME VARCHAR2(50),
IDADE NUMBER
);
--Inserindo dados na tabela
insert into tmp_teste
(codigo, nome, idade)
values
(1, 'Bruno', 20);

--Inserindo dados na tabela
insert into tmp_teste
(codigo, nome, idade)
values
(2, 'Gustavo', 21);

--Inserindo dados na tabela
insert into tmp_teste
(codigo, nome, idade)
values
(3, 'Luiz', 22);

--Comitando transação
Commit;

Utilizando FlashBack da tabela–Fazendo select na tabela que será dropada

select * from tmp_teste;

–Dropando tabela

drop table tmp_teste;

–Fazendo select na tabela já dropada

select * from tmp_teste;

–Consultando lixeira

select * from recyclebin;

–Recuperando tabela dropada

flashback table tmp_teste to before drop;

–Realizando select na tabela recuperada, para verificar integridade de dados

select * from tmp_teste;

–Uma tabela só será dropada efetivamente se utilizado o comando purge
–Pois o comando purge não manda a tabela para a “lixeira”

drop table tmp_teste purge;

–Consultando a “lixeira” novamente para confirmação do comando “purge”

select * from recyclebin;

Bom pessoal, é isso, agora vocês já sabem recuperar registros alterados, inseridos e deletados e também recuperar tabelas dropadas mantendo a integridade dos registros.

Espero ter ajudado.
Grande abraço e até a próxima.

Share

You may also like...

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *