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

Flashback Table

Olá pessoal,

Começarei meu blog falando um pouco sobre o recurso Flashback Table:

O Flashback Table surgiu a partir do SGBD Oracle 10g e é suportado pelo segmento de undo que deve estar com gerenciamento automático (UNDO_MANAGEMENT = AUTO). O parâmetro UNDO_RETENTION, que vem configurado com 900 segundos, determina o quanto se podem retornar os dados.

Para deixar o tempo de retenção em 2 horas (7200 segundos):

ALTER SYSTEM SET UNDO_RETENTION = 7200;

Para verificar a retenção da tablespace de UNDO:Definido o tempo de retenção, é possível garantir a permanência dos dados na tablespace de undo através do RETENTION GUARANTEE (desabilitado por padrão). Essa opção habilitada faz com que o SGBD não sobrescreva dados com data menor ao período de retenção.

SELECT retention FROM dba_tablespaces WHERE contents = 'UNDO';

Montei o caso abaixo baseado em demandas do projeto que estou trabalhando atualmente, onde utilizo em um ambiente de homologação o Flashback Table (necessário privilégio de FLASHBACK ANY TABLE).

Por exemplo, para uma tabela de domínio chamada teste:

CREATE TABLE teste(ID NUMBER(2),

nome VARCHAR2(10),

CONSTRAINT pk_teste PRIMARY KEY (ID)

) ENABLE ROW MOVEMENT;

Ao analisar os relacionamentos da entidade de domínio são encontrados os dependentes. Por exemplo, para uma tabela chamada teste_filhos que referencie a tabela de domínio teste:É necessário habilitar a opção de movimentação de linhas (ENABLE ROW MOVEMENT) na tabela para que seja possível utilizar o flashback table. Pode-se habilitar esta opção apenas quando for efetuar um flashback e após isso desabilitá-la.

CREATE TABLE teste_filhos(ID NUMBER(2),

tipo VARCHAR2(1),

CONSTRAINT fk_teste FOREIGN KEY(ID)

REFERENCES teste(ID)

) ENABLE ROW MOVEMENT;

Iremos inserir as parametrizações iniciais do nosso “sistema”:Para as tabelas dependentes também é necessário habilitar o opção de movimentação de linhas (ENABLE ROW MOVEMENT).

INSERT INTO teste VALUES(1, 'um');

INSERT INTO teste VALUES(2, 'dois');

INSERT INTO teste VALUES(3, 'tres');

INSERT INTO teste_filhos VALUES(1, 'a');

INSERT INTO teste_filhos VALUES(2, 'b');

INSERT INTO teste_filhos VALUES(3, 'c');

COMMIT;

Depois de concluída a parametrização torna-se necessário marcar o ponto de partida para a homologação:

SELECT to_char(SYSDATE, 'dd/mm/rrrr hh24:mi') data FROM dual;

Com o início dos testes vários registros podem ser inseridos:

INSERT INTO teste VALUES(4, 'quatro');

INSERT INTO teste_filhos VALUES(4, 'd');

INSERT INTO teste VALUES(5, 'cinco');

INSERT INTO teste_filhos VALUES(5, 'e');

COMMIT;

Assim que a homologação for concluída ou surgir a necessidade de retornar ao ponto inicial devemos executar:

FLASHBACK TABLE teste_filhos TO TIMESTAMP to_timestamp('05/01/2010 08:42', 'dd/mm/rrrr hh24:mi');

FLASHBACK TABLE teste TO TIMESTAMP to_timestamp('05/01/2010 08:42', 'dd/mm/rrrr hh24:mi')

Com isso as tabelas envolvidas voltam no tempo para o ponto de partida, no caso dia 05/01/2010 às 08:42. A tabela que não é referenciada por outra teve sua recuperação realizada antes da tabela que é referenciada. Essa ordem foi necessária para não ocorrer violação de restrições quanto aos relacionamentos das tabelas.

Esse é apenas um simples exemplo de utilização do flashback table utilizando recuperação através de um determinado ponto no tempo, também é possível realizar a partir de número de SCN.

Abraços

Share

You may also like...

2 Responses

  1. Olá Danilo,

    Excelente post. Simples e direto. Parabéns!

    Abraços,

    Eduardo Legatti

  2. Thiago disse:

    Danilo,
    Boa noite, o auxilio do FLASHBACK é muito util, mas em empresas pequenas e até de medio porte que nao tem grana pra gastar com maquina, o flashback não é ligado, pra nao ocupar espaço de undo e tb pra evitar o estouro da area de LOG..

    Abraços

Deixe um comentário

O seu endereço de e-mail não será publicado.