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
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