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
Olá Danilo,
Excelente post. Simples e direto. Parabéns!
Abraços,
Eduardo Legatti
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