Olá, amiguinhos! Vamos falar a respeito de uma situação que pode causar muita dor de cabeça: quando um desenvolvedor acidentalmente executa um DELETE sem WHERE e acaba excluindo todos os registros de uma tabela. Não se preocupe, vou mostrar como resolver esse problema utilizando o FLASHBACK VERSION QUERY
no Oracle Database.
01. Criar a Tabela e Inserir Dados
Primeiro, vamos criar a tabela PEDIDOS para poder demosntrar o caso na prática.
CREATE TABLE PEDIDOS AS
SELECT LEVEL AS PED_NUM,
'Descricao ' || LEVEL AS DESCRICAO,
LEVEL * 10 AS VALOR
FROM DUAL
CONNECT BY LEVEL <= 50;
Table created.
SELECT * FROM PEDIDOS;
PED_NUM DESCRICAO VALOR
------- ----------- ------
1 Descricao 1 10
2 Descricao 2 20
3 Descricao 3 30
...
50 Descricao 50 500
02. Simular Exclusão Errada
Agora, simulamos a exclusão errada de todos os registros. A primeira “;"
foi responsável pela execução indevida devido a falta de atenção do programador:
DELETE PEDIDOS;
WHERE PED_NUM IN (10568, 24698);
50 rows deleted.
COMMIT;
Commit complete.
03. Verificar Exclusão
Confirmei que todos os registros foram excluídos:
SELECT * FROM PEDIDOS;
no rows selected
04. Recuperar Dados Usando FLASHBACK VERSION QUERY
Uma dúvida comum que os DBAs têm é se isso vai funcionar somente se o Flashback estiver ativo no banco de dados. Na verdade, o FLASHBACK VERSION QUERY
pode ser utilizado mesmo se o Flashback não estiver ativado globalmente no banco de dados. Ele depende principalmente das informações armazenadas nos segmentos de UNDO.
Com o FLASHBACK VERSION QUERY
podemos ver as versões anteriores dos registros:
SELECT VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_XID, PED_NUM, DESCRICAO, VALOR
FROM PEDIDOS VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE;
VERSIONS_STARTTIME VERSIONS_ENDTIME VERSIONS_XID PED_NUM DESCRICAO VALOR
---------------------- ---------------------- ------------------ --------- -------------- ------
2024-06-01 10:00:00 2024-06-01 10:05:00 0002000300000000 1 Descricao 1 10
2024-06-01 10:00:00 2024-06-01 10:05:00 0002000300000000 2 Descricao 2 20
...
2024-06-01 10:00:00 2024-06-01 10:05:00 0002000300000000 50 Descricao 50 500
100 rows selected.
Os resultados mostram os registros antes da exclusão. Para garantir que estou recuperando a última versão antes da exclusão, verifiquei a coluna VERSIONS_ENDTIME
e confirmei que o registro estava ativo até o momento da exclusão.
Agora, recuperamos os dados de volta na tabela:
INSERT INTO PEDIDOS (PED_NUM, DESCRICAO, VALOR)
SELECT PED_NUM, DESCRICAO, VALOR
FROM PEDIDOS VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE VERSIONS_ENDTIME IS NOT NULL;
50 rows created.
COMMIT;
Commit complete.
05. Confirmar Recuperação
SELECT * FROM PEDIDOS;
PED_NUM DESCRICAO VALOR
------- ----------- ------
1 Descricao 1 10
2 Descricao 2 20
3 Descricao 3 30
...
50 Descricao 50 500
50 rows selected.
Por que isso é possível?
A recuperação dos dados excluídos é possível porque o Oracle Database mantém versões anteriores das linhas nas tabelas através do uso de UNDO segments. A configuração UNDO_RETENTION
define por quanto tempo essas informações de UNDO são mantidas após uma operação DML. O FLASHBACK VERSION QUERY
utiliza essas informações de UNDO para mostrar versões anteriores das linhas e permitir que você recupere os dados. É importante realizar a recuperação dentro do período de retenção definido por UNDO_RETENTION
para garantir que os dados ainda estejam disponíveis.
Conclusão
Recuperar dados excluídos acidentalmente pode ser feito de forma eficiente utilizando o FLASHBACK VERSION QUERY
, mesmo que o Flashback esteja desligado. Este método permite revisar versões anteriores dos registros e restaurá-los rapidamente. Se você é um DBA, não precisa se desesperar ao enfrentar esse tipo de situação. Agora você sabe como recuperar rapidamente os dados excluídos acidentalmente utilizando o FLASHBACK VERSION QUERY
.
Para mais informações, confira a documentação oficial:
🚀🚀🚀 #GuinaNãoTinhaDó #BóBó #OracleDatabase #DBA #OracleTips #DicasDeDBA #CaceteDeAgulha #Chaves #PlanetHempAindaGostaDaMaryJane🚀🚀🚀