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.