MigraTI - Soluções em banco de dados

sexta-feira, 18 de agosto de 2023

Features do Oracle Flashback

 

No dia 12/08/2023, participei do meu primeiro evento sobre banco de dados. Ocorreu na cidade de São Paulo a 12ª edição do evento GUOB Tech Day, no qual proporciona um grande encontro de profissionais Oracle.

Irei abordar nesse blog a palestra que mais me chamou atenção, sobre as features do Oracle Flashback. A palestra foi passada pelo profissional Tércio Costa e demonstra um método alternativo para recuperação de dados.

As features do Oracle Flashback nos permitem visualizar como os dados eram antes de um determinado tempo, antes de serem modificados, podendo nos salvar em possíveis corrupções ou perca de dados.

Todos os valores que as features do Oracle Falshback buscam, são consultados da tablespace Undo e do Redo Log. Ambos armazenam os arquivos modificados de seu banco de dados.

Tendo isso em mente, devemos nos atentar em efetuar a manutenção corretamente da tablespace Undo, pois quanto maior ela for, mais registros que podem ser recuperados estaram disponíveis.

Ah, claro, ainda sobre boas práticas de recuperação, não deixe de ativar o modo archivelog de seu database.

  

Vamos começar com a feature Flashback Query. Nessa feature podemos definir uma data e hora que desejamos consultar os registros de uma tabela. Basta utilizar a cláusula AS OF, juntamente com o TIMESTAMP ou SNC desejado.

Exemplo:


Consultando a data/hora e SCN atual:

SELECT TO_CHAR(SYSDATE, 'DD/MM/YYYY HH24:MI:SS') AS DATA_HORA, CURRENT_SCN FROM V$DATABASE;

 

Consultando o valor do registro atual:

SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE;

 

Alterando o registro:

UPDATE SCHEMA.TABLE SET COLUMN1 = ‘VITOR’;
Commit;

 

Consultando os registros novamente para validar a alteração:

SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE;

  

Consultando o valor antigo através do parâmetro TIMESTAMP:

SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE AS OF TIMESTAMP TO_TIMESTAMP('16/08/2023 22:28:40','DD/MM/YYYY HH24:MI:SS');

Obs: Nesse caso, o valor de TIMESTAMP deve ser a data/hora de antes da alteração, que foi consultado através do primeiro comando.

 

Consultando o valor antigo através do parâmetro SNC:

SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE
AS OF SCN 123456;

Obs: Nesse caso, precisa informar o SNC de antes da modificação, que foi consultado através do primeiro comando.




 

A segunda feature demonstrada na palestra foi a FLASHBACK VERSION QUERY. Nessa feature conseguimos consultar um registro antigo e já alterado, mesmo sem saber a hora exata em que o registro foi modificado. Para consultar utilizamos a cláusula BETWEEN e definimos uma faixa de tempo.

Exemplo:

SELECT VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_OPERATION, VERSIONS_XID, COLUMN1, COLUMN2 FROM SCHEMA.TABLE VERSIONS BETWEEN TIMESTAMP TO_TIMESTAMP(16/08/2023 22:00:00','DD/MM/YYYY HH24:MI:SS') AND SYSTIMESTAMP;

O resultado dessa consulta nos retornara o tempo inicial do registo (VERSIONS_STARTTIME), horário final do registro (VERSIONS_ENDTIME), junto a instrução DML executada (VERSIONS_OPERATION).



A próxima feature é a FLASHBACK TRANSACTION QUERY. Nessa feature fazemos uma consulta na view FLASHBACK_TRANSACTION_QUERY, passando o valor do XID desejado (O XID pode ser coletado na query anterior).

Exemplo:

SELECT UNDO_SQL, LOGON_USER FROM FLASHBACK_TRANSACTION_QUERY
WHERE  xid = HEXTORAW('123456789');


O resultado da consulta irá gerar um comando DML, que assim que executado, desfaz a modificação. Além de informar o usuário que efetuou a alteração, buscado pela coluna “LOGON_USER”.



Agora irei falar da utilização da package DBMS_FLASHBACK. Com ela você pode visualizar como eram os registros do banco inteiro (Não somente de uma tabela) em um determinado tempo. Basta você habilitar a package e passar o horário que deseja.

Exemplo:

Habilitando a package:

EXECUTE DBMS_FLASHBACK.ENABLE_AT_TIME(TO_TIMESTAMP('16/08/2023 22:20','DD/MM/YYYY HH24:MI'));

 

Em seguida você consulta o registro desejado:

SELECT COLUMN1, COLUMN2 FROM SCHEMA.TABLE;

 

Assim que finalizar, desabilite a package para voltar aos registros verdadeiros:

EXECUTE DBMS_FLASHBACK.DISABLE;

 


 


Ainda sobre boas práticas de recuperação, é ideal habilitar o parâmetro de registro suplementar.  Esse parâmetro também é utilizado para você capturar informações detalhadas sobre os registros já alterados do seu banco de dados.

ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;


 

Forte abraço!

Ass: Vitor Hugo

Um comentário: