Picture of Roberto Sobrinho
Roberto Sobrinho

06/06/2024

DELETE sem WHERE: Como Recuperar Seus Dados com Flashback Version Query no Oracle

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🚀🚀🚀

Compartilhe

Facebook
Twitter
LinkedIn
WhatsApp
Email
Print

Pesquisar

Roberto Sobrinho

Sou Roberto Fernandes Sobrinho, também conhecido como Sobrinho DBA , pós graduado em “Architecture and Database Administration”, entusiasta, dedicado e com 20 anos de experiência com Oracle Database e suas diversas distribuições e variações.

Oracle ACE Associate

2025

Specialist

Exadata Database Machine X9M

Professional

Oracle Database Administration

Professional

Oracle Database 19c: RAC, ASM, & Grid Infra Administrator

Professional

Oracle Autonomous Database Cloud

Professional

Oracle Cloud Database Migration and Integration

Professional

Oracle Database PL/SQL Developer

Associate

Oracle Cloud Infrastructure Architect

Associate

Oracle Cloud Infrastructure Foundations

Categorias

Categorias

Tags

DELETE sem WHERE: Como Recuperar Seus Dados com Flashback Version Query no Oracle