Artigo de Partes Práticas do Flashback:
Published: 2023-12-08 02:12:54


Conforme analisado a postagem anterior, onde trazemos a teoria. Agora vamos ver como ficaria na prática para se executar um flashback, através de casos de uso apresentados, exemplos, códigos e fotos apresentadas no artigo em questão: 


Flashback Versions Query

    O Flashback Versions Query fornece uma maneira simples e fácil de mostrar todas as versões de todas as linhas em uma tabela entre dois SCN's ou tempos de intervalo (time stamps), informando se as linhas foram inseridas, deletadas ou atualizadas. Na verdade, acredito que o Flashback Versions Query é uma extensão à linguagem SQL que permite ao DBA recuperar diferentes versões de linhas de tabela em qualquer intervalo de tempo. Uma nova versão de registro será criada toda vez que o comando COMMIT for emitido, e mesmo que uma linha seja deletada e re-inserida várias vezes, todas estas alterações estarão disponíveis para acesso.

```
SELECT versions_starttime, versions_endtime, versions_xid, versions_operation, emp_id, emp_name, emp_salary
FROM employees
VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP('2023-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS')
AND TO_TIMESTAMP('2023-12-31 23:59:59', 'YYYY-MM-DD HH24:MI:SS');
```

Essa consulta retorna todas as versões das linhas da tabela de funcionários entre os tempos especificados, juntamente com informações sobre o início e o fim de cada versão, a operação realizada (inserção, atualização, exclusão), e os detalhes dos funcionários.

Este caso de uso demonstra como o Flashback Versions Query pode ser utilizado para realizar uma auditoria detalhada das mudanças em uma tabela específica ao longo de um intervalo de tempo determinado. Essa funcionalidade é valiosa para administradores de bancos de dados que precisam rastrear e compreender as mudanças nos dados ao longo do tempo para fins de auditoria e análise histórica.


Flashback Transaction Query:
    O Flashback Transaction Query usa a view de dicionário de dados FLASHBACK_TRANSACTION_QUERY para recuperar informações de transações de banco de dados para todas as tabelas envolvidas em uma transação. Esta view possui uma coluna UNDO_SQL que fornece a sentença SQL que poderá ser utilizada para desfazer uma mudança feita anteriormente. A propósito, nas versões anteriores ao Oracle 10g, o LogMiner poderia ser utilizado para fornecer estas informações.

```
SELECT xid, table_name, undo_sql
FROM FLASHBACK_TRANSACTION_QUERY
WHERE xid = 'ID_DA_TRANSACAO';
```

Essa consulta retorna informações sobre as tabelas afetadas pela transação, o ID da transação (XID) e a sentença SQL de "undo" para cada operação que pode ser utilizada para desfazer as mudanças.

Este caso de uso demonstra como o Flashback Transaction Query pode ser utilizado para analisar uma transação específica, entender suas operações e fornecer sentenças SQL de "undo" que podem ser usadas para desfazer mudanças indesejadas em várias tabelas do banco de dados. Essa funcionalidade é útil para a gestão de banco de dados ao lidar com situações em que é necessário reverter transações problemáticas.

*Flashback Table:*
    O FLASHBACK TABLE é usado para restaurar um estado anterior de uma tabela no caso de erro humano ou de aplicativo. O tempo no passado para o qual a tabela pode sofrer flashback depende da quantidade de dados de desfazer no sistema. Além disso, o Oracle Database não pode restaurar uma tabela para um estado anterior em quaisquer operações DDL que alterem a estrutura da tabela.

```

FLASHBACK TABLE clientes TO TIMESTAMP TO_TIMESTAMP('2023-12-01 08:00:00', 'YYYY-MM-DD HH24:MI:SS');
```

Esta consulta reverte a tabela clientes para o estado que estava em 1º de dezembro de 2023 às 08:00 da manhã.

Este caso de uso demonstra como o Flashback Table pode ser utilizado para recuperar registros específicos em uma tabela após eles terem sido excluídos erroneamente. Essa funcionalidade permite a restauração seletiva de dados em uma tabela para um estado anterior, sem a necessidade de restaurar todo o banco de dados a partir de um backup.


DBMS_FLASHBACK:
    Usando DBMS_FLASHBACK, você pode voltar para uma versão do banco de dados em um horário especificado ou para um número de alteração do sistema (SCN) especificado.

```
DECLARE
  v_scn NUMBER;
BEGIN
  SELECT SCN
  INTO v_scn
  FROM V$DATABASE;
```

  DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER(v_scn - 1);

 

```
 UPDATE produtos
  SET preco = (SELECT preco_anterior
               FROM produtos_versoes
               WHERE produtos_versoes.id_produto = produtos.id_produto
               AND produtos_versoes.data_versao = (
                 SELECT MAX(data_versao)
                 FROM produtos_versoes
                 WHERE produtos_versoes.id_produto = produtos.id_produto
                 AND data_versao < TO_DATE('2023-12-01', 'YYYY-MM-DD')
               )
              )
  WHERE produtos.id_produto IN (SELECT id_produto
                                FROM produtos_versoes
                                WHERE data_versao < TO_DATE('2023-12-01', 'YYYY-MM-DD')
                               );

  DBMS_FLASHBACK.DISABLE;
END;
```

Neste exemplo, o DBMS_FLASHBACK é utilizado para habilitar o flashback até o SCN anterior ao momento da atualização incorreta. Em seguida, é realizada uma atualização na tabela produtos, revertendo os preços para um estado anterior usando informações de uma tabela de versões (produtos_versoes), onde os preços antigos são mantidos. Por fim, o DBMS_FLASHBACK.DISABLE é usado para desativar o flashback após a atualização.

Este caso de uso demonstra como o DBMS_FLASHBACK pode ser usado para realizar uma restauração seletiva de dados após uma atualização incorreta, permitindo recuperar informações específicas de uma tabela para um estado anterior com precisão e controle avançado.


*Flashback Data Archive:*
    No Oracle Database, o DBMS_FLASHBACK_ARCHIVE é um pacote que permite controlar e gerenciar a captura e retenção de alterações em tabelas específicas usando o recurso de Archive Flashback Data (AFD). Essa funcionalidade mantém um registro detalhado de todas as mudanças feitas nas tabelas designadas para o Flashback Data Archive, permitindo a consulta e recuperação de dados históricos.

EXECUTE DBMS_FLASHBACK_ARCHIVE.ENABLE_ARCHIVE('clientes', retention_time=>365);

Isso habilita o Flashback Data Archive para a tabela clientes, mantendo o histórico de alterações por um ano (365 dias).

Este caso de uso exemplifica como o DBMS_FLASHBACK_ARCHIVE pode ser utilizado para configurar, capturar e gerenciar um histórico detalhado de mudanças em uma tabela específica, atendendo a requisitos de auditoria e fornecendo um registro preciso das alterações nos dados ao longo do tempo.



![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/frju8ccvp103ru30d1bl.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6bl0ej94lvw2z57rno5s.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/r17mpvquusirhdfvb204.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/3fxxb3i4e044xb5ytd1b.jpg)


![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/o34gnj9opzhl3fsfpc7c.jpg)