컴퓨터일반/DB

[Oracle] "아차!" 하는 순간 필요한 데이터 복구 전략: Flashback Query 활용법

G-Ryon 2026. 3. 24. 12:21

데이터베이스를 다루다 보면 누구나 한 번쯤 실수로 WHERE 절을 빼먹고 UPDATE를 날리거나, 중요한 데이터를 DELETE 하는 아찔한 경험을 하곤 합니다.

오라클에서는 이런 상황을 대비해 특정 과거 시점의 데이터를 조회할 수 있는 강력한 기능인 Flashback Query를 제공합니다.

1. Flashback Query란?

오라클의 Undo 데이터를 활용하여, 현재 시점이 아닌 과거 특정 시점의 테이블 상태를 마치 스냅샷을 찍듯 조회하는 기능입니다. 별도의 백업 복원 과정 없이 SQL만으로 빠르게 데이터를 확인할 수 있다는 것이 가장 큰 장점입니다.


2. 과거 데이터 조회하기 (AS OF TIMESTAMP)

가장 일반적으로 사용하는 방법은 AS OF TIMESTAMP 구문을 사용하는 것입니다.

특정 시간 기준으로 조회

지금으로부터 10분 전의 데이터를 조회하고 싶다면 아래와 같이 작성합니다.

SQL
 
SELECT * FROM 테이블명 
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);

특정 시점 시각으로 조회

정확히 특정 시각(예: 오후 2시)의 데이터를 보고 싶을 때 사용합니다.

SQL
 
SELECT * FROM 테이블명 
AS OF TIMESTAMP TO_TIMESTAMP('2026-03-24 14:00:00', 'YYYY-MM-DD HH24:MI:SS');

3. 잘못된 데이터 복구 프로세스

조회에 성공했다면 이제 실제 운영 테이블에 반영할 차례입니다.

STEP 1: 삭제된 데이터 다시 삽입 (INSERT)

실수로 삭제한 데이터만큼을 과거 시점에서 긁어와 다시 집어넣습니다.

SQL
 
INSERT INTO 테이블명
SELECT * FROM 테이블명 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE 복구대상_조건;

STEP 2: 잘못 업데이트된 데이터 원복 (UPDATE)

특정 행의 값이 변했다면 서브쿼리를 이용해 과거 값으로 되돌릴 수 있습니다.

SQL
 
UPDATE 테이블명 A
SET A.컬럼명 = (SELECT B.컬럼명 
                FROM 테이블명 AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '30' MINUTE) B
                WHERE A.PK_컬럼 = B.PK_컬럼)
WHERE A.PK_컬럼 = '수정대상ID';

4. 주의사항 및 한계점

이 마법 같은 기능에도 몇 가지 제약 사항이 있습니다.

  • Undo Retention: 오라클 설정값(UNDO_RETENTION)에 따라 보관 주기가 결정됩니다. 설정된 시간이 지나 Undo 세그먼트가 덮어씌워지면 "ORA-01555: snapshot too old" 에러가 발생하며 조회가 불가능합니다.
  • DDL 변경: 데이터를 수정한 후 테이블 구조(DDL)를 변경(컬럼 삭제 등)했다면 Flashback Query를 사용할 수 없습니다.
  • 발생 즉시 대응: 실수를 인지한 즉시 데이터를 확보하는 것이 가장 중요합니다.

보너스 팁: 시점이 기억나지 않는다면? (Versions Query)

데이터가 정확히 언제 변했는지 모를 때는 VERSIONS BETWEEN 구문을 사용해 변경 이력을 추적할 수 있습니다.

SQL
 
SELECT VERSIONS_STARTTIME, VERSIONS_ENDTIME, VERSIONS_OPERATION, 컬럼명
FROM 테이블명
VERSIONS BETWEEN TIMESTAMP MINVALUE AND MAXVALUE
WHERE PK_컬럼 = '대상값';

이 쿼리를 통해 어떤 사용자가 언제 데이터를 넣고(I), 지우고(D), 고쳤는지(U) 확인할 수 있습니다.


마치며 가장 좋은 방법은 COMMIT 전 반드시 확인하는 습관이지만, 이미 사고가 발생했다면 오라클의 Flashback 기능을 믿고 차분하게 대응해 보시기 바랍니다!