Flashback query

Função que veio no Oracle 9i, 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 é muito útil, quando você precisa restaurar dados que foram deletados ou alterados erroneamente. É melhor efetuar este procedimento do que voltar um export da tabela de um ponto no passado ou mesmo um backup full até um momento no tempo, que pode ser lento deixando a sua base totalmente inoperante até a sua conclusão.

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

— retificado

E um detalhe importante que é liberado para todas as edições do Oracle, podendo ser vistos nessa tabela de comparações das features contra suas edições.

CLAUSULA AS OF

Nas releases anteriores, o recurso FlashBack permitia ao usuario ter uma visao de um imagem mais antiga do banco de dados, com base em um horario ou em um SCN escolhido.

Para utilizar os dados dessa imagem mais antiga, por exemplo, para substituir linhas que haviam sido deletadas acidentalmente de uma tabela, a operação do Flashback precisava ser incorporada a um bloco PL/SQL.

Agora, pode-se obter imagens distintas, de tabelas individuais, em uma unica sessão. Para executar uma consulta em uma tabela individual, as clausulas AS OF, para deinir o tempo ou SCN, como mostrado nos exemplos a seguir.

As tabelas nao definidas como um clausula AS OF permanecem disponiveis no estado atual.

Exemplo 1:

 SQL> SELECT employee_id, manager_id
 2 FROM employees AS OF SCN 81791;

Exemplo 2:

 SQL> SELECT a.last_name, b.last_name
 2 FROM employees AS OF TIMESTAMP SYSDATE-1/24 a
 3 FULL OUTER JOIN
 4 employees AS OF TIMESTAMP SYSDATE-2/24 b
 5 ON (a.employee_id = b.employee_id);

Exemplo 3:

 SQL> CREATE TABLE new_employees AS
 2 SELECT * FROM employees AS OF SCN 90932;

FLASHBACK VERSIONS QUERY1. Crie uma tabela chamada RATES

CREATE TABLE rates(
			currency varchar2(4),
			rate   NUMBERS(15,10)
			);
		SQL> desc rates

2. Execute as operações a seguir:

insert into rates values ('EURO',1.1012);
commit;
update rates set rate = 1.1014;
commit;
update rates set rate = 1.1013;
commit;
delete rates;
commit;
insert into rates set values ('EURO',1.1016);
commit;
update rates set rate = 1.1011;
commit;

3. Consulte a tabela RATES. Veja que somente o dado correspondente a ultima transação efetivada foi mostrado:

SQL> select * from rates;

		CURR	RATE
		----	------

		EURO	1.1011

4. Execute a consulta conforme indicado na sequencia. Verifique que todas as alterações, ainda presentes em undo, efetuadas em linhas da tabela rate, são mostradas. Analise, ainda , que é fornecido o VERSIONS_XID, ou seja, o numero da transação responsavel pela alteração na linha:

select versions_starttime, versions_endtime, versions_xid, versions_operation, rate
    from rates versions between timestamp minvalue and maxvalue
order by VERSIONS_STARTTIME
/

VERSIONS_STARTTIME	     VERSIONS_ENDTIME       VERSIONS_XID         V        RATE
---------------------   ---------------------   ----------------	--	------
01-DEC-03 03.57.12 PM	01-DEC-03 03.57.30 PM	0002002800000C61	I	1.1012
01-DEC-03 03.57.30 PM	01-DEC-03 03.57.39 PM	000A000A00000029	U	1.1014
01-DEC-03 03.57.39 PM	01-DEC-03 03.57.55 PM	000A000B00000029	U	1.1013
01-DEC-03 03.57.55 PM	                        000A000C00000029	D	1.1013
01-DEC-03 03.58.07 PM	01-DEC-03 03.58.17 PM	000A000D00000029	I	1.1016
01-DEC-03 03.58.17 PM	                        000A000E00000029	U	1.1011

5. Faça a consulta abaixo na wiew FLASHBACK_TRANSACTION_QUERY. A partir do VERSIONS_XD (corespondente ao XID, na FLASHBACK_TRANSACTION_QUERY), é possivel visualizar exatamente o(s) comando(s) DML em que a transação específica consiste. Assim, é possivel se efetuar o flashback exclusivo dessa linha:

		SELECT UNDO_SQL
			FROM FLASHBACK_TRANSACTION_QUERY
			WHERE XID = '000A000D000000259';

		UNDO_SQL
		--------------------------------------------------------------------------
		insert into "ROBERTO"."RATES".("CURRENCY","RATES") values ('EURO','1.1013');
%name Flashback query

Autor: Rafael Stoever

Bacharel em Sistema de Informação pela Uniasselvi, atualmente cursando Gerenciamento de Projetos em TI pela Pós Graduação Uniasselvi. Atuo como Analista de suporte a banco de dados – DBA pela Lumina Serviços em TI residente de Blumenau/ SC, OPN Certified Specialist, Certificado OCP 10g/11g/12c, OCE RAC10g e Linux 10g. Conhecimentos em Microsoft SqlSever, Mysql e programação web (php,asp).