sexta-feira, 24 de junho de 2011

Flashback Query no Oracle 11g


O Oracle 11g implementa várias tecnologias de Flashback como Flashback Database, Flashback Table, Flashback Drop entre outros,
abordarei o uso do recurso de Flashback Query.

Introduzido com o Oracle 9i, este recurso fornece a habilidade de visualizar os dados como eles estavam em um determinado tempo no passado.
Por padrão, operações no banco de dados usam os dados disponíveis mais recentemente "comitados".
Se você quiser pesquisar determinados dados em algum ponto no passado, você precisará utilizar o recurso de Flashback Query
na qual será necessário especificar um "horário" ou um SCN (System change Number) para efetuar a pesquisa.

Este recurso também é muito útil, quando você precisa restaurar dados que foram erroneamente deletados ou alterados.
Antes da versão Oracle 9i, você tinha que recuperar o banco de dados até um determinado ponto que lhe interessasse.
Dependendo do tamanho do banco de dados, este processo poderia ser lento e demorado.

Apenas para elucidar uma situação em que muitos DBAs, já passaram ou poderão passar, vou ilustrar um diálogo entre Usuário e DBA:

Usuário: meus dados sumiram, pode me ajudar?
DBA: o que vc fez?
Usuário: fiz um delete e esqueci de colocar where
DBA: vc deu commit ?
Usuario: claro!
DBA: humm...

Este artigo é para quem já passou por isso ou ainda vai passar usando um SGBDR Oracle.

Antes de mais nada, para você poder usar o recurso de Flashback Query, é necessário configurar o seu banco de dados para usar o gerenciamento automático de UNDO (Automatic Undo Management).

Verifique se o seu banco de dados já está com esta configuração setada, caso contrário, altere o parâmetro com o valor e privilégios apropriados.

Conforme script abaixo:
-- É necessário configurar o seu banco de dados para usar o gerenciamento automático de UNDO (Automatic Undo Management).
-- Checando parametros, verificando se está setado para Flashback

c:\>sqlplus /nolog

CONNECT / AS SYSDBA;

show parameter undo_management;

-- No parâmetro abaixo, o valor é especificado (em segundos) no qual está no valor padrão 900,  15 minutos de retenção de dados de undo.

show parameter undo_retention;

CREATE USER emerson IDENTIFIED BY emerson DEFAULT TABLESPACE users QUOTA UNLIMITED ON users;

GRANT CONNECT TO emerson;

show user;

CONNECT / AS SYSDBA;

show user;

-- dando permissões 

GRANT EXECUTE ON dbms_flashback TO emerson;
GRANT CREATE ANY TABLE TO emerson;
GRANT COMMENT ANY TABLE TO emerson;

CONNECT emerson/emerson@orcl;

-- criando a tabela
-- DROP TABLE produto;
CREATE TABLE produto
(
  cod  NUMBER PRIMARY KEY,
  data DATE,
  descricao VARCHAR2 (100)
);

-- inserindo registros ...
INSERT INTO produto VALUES (1, sysdate, 'Computador');
INSERT INTO produto VALUES (2, sysdate, 'Laptop');
INSERT INTO produto VALUES (3, sysdate, 'Impressora');
INSERT INTO produto VALUES (4, sysdate, 'Monitor');
INSERT INTO produto VALUES (5, sysdate, 'Mouse');

COMMIT;

-- listando a tabela produto com detalhes de horas e minutos e segundos
SELECT cod, to_char(data,'dd/mm/yyyy hh24:mi:ss') data, descricao FROM produto; 

-- esperar um tempo para inserir estes para simular um recuperação baseada no tempo
INSERT INTO produto VALUES (6, sysdate, 'Teclado');
INSERT INTO produto VALUES (7, sysdate, 'HD');
INSERT INTO produto VALUES (8, sysdate, 'Processador');

COMMIT;

-- listando a tabela produto com detalhes de horas e minutos e segundos
SELECT cod, to_char(data,'dd/mm/yyyy hh24:mi:ss') data, descricao FROM produto; 

-- apenas para entender como funciona as datas
SELECT SYSTIMESTAMP, (to_timestamp('02/06/2011 13:37:07','DD/MM/YYYY HH24:MI:SS')) FROM dual;
SELECT SYSTIMESTAMP FROM dual; -- mesma coisa que sysdate porem com horas e fuso horario

-- habilitando a linha do tempo no flashback, altera tempo conf. necessidade
EXECUTE dbms_flashback.enable_at_time (to_timestamp('02/06/2011 13:37:07','DD/MM/YYYY HH24:MI:SS'));
-- EXECUTE dbms_flashback.enable_at_time (SYSTIMESTAMP - 60); -- mesma coisa de outra forma,  também  em minutos

COMMIT;

SELECT cod, to_char(data,'dd/mm/yyyy hh24:mi:ss') data, descricao FROM produto;

-- disabilitando o flashback
EXECUTE dbms_flashback.disable;

-- listando a tabela produto com detalhes de horas e minutos e segundos
SELECT cod, to_char(data,'dd/mm/yyyy hh24:mi:ss') data, descricao FROM produto;

-- linha do tempo para recuperação
SELECT * FROM produto AS OF TIMESTAMP (to_timestamp('02/06/2011 13:37:07','DD/MM/YYYY HH24:MI:SS'));  

-- mesma coisa de outra forma, linha do tempo para recuperação 1 minuto
-- SELECT * FROM produto AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' MINUTE); 


Referencias:
http://eduardolegatti.blogspot.com/2007/05/utilizando-flashback-query-no-oracle-9i.html
http://www.dbasupport.com/oracle/ora11g/Flashback-TIMESTAMP-or-SCN.shtml
http://www.eduardomorelli.com/
Oracle 9i, SQL PL/SQL e Administração - Morelli, Eduardo
Dominando Oracle 9i - Modelagem e Desenvolvimento - Fanderuff, Damaris
OCA Oracle Database 11g Administração I ( Guia do Exame 1Z0-052 ) - Watson, John

3 comentários:

  1. E ai Herman..
    Muito bom o artigo.Vejo que estar focando na certificação, esses casos são muito eficientes quando se precisa de uma janela de recuperação pequena.
    Mandou bem amigo..Abraços!

    ResponderExcluir
  2. Tô estudando justamente flashback Query. Encontrei este artigo pelo google massa =D

    ResponderExcluir