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
Que massa Vitor, bem interessante.
ResponderExcluir