본문 바로가기
Be Smart/SQL

[Oracle] 오라클 DB DELETE 후 Commit 한 데이터 복구

by 반월하 2024. 7. 15.
728x90

 

 

안녕하세요, 오늘은 오라클 9i Release 2부터 도입된 Flashback 기능에 대해 소개해드리겠습니다. Flashback 기능은 데이터베이스의 과거 데이터를 조회하고 복구할 수 있는 매우 유용한 기능입니다.

Flashback 기능 소개

Flashback 기능은 데이터베이스의 특정 시점으로 되돌아가 데이터를 조회하거나 복구할 수 있는 기능입니다. 이를 통해 실수로 삭제한 데이터를 복구하는 등의 작업이 가능합니다.

1. TIMESTAMP를 이용한 과거 데이터 조회

AS OF TIMESTAMP 구문을 사용하여 특정 시간 또는 시점의 데이터를 조회할 수 있습니다. 예를 들어, 15분 전의 테이블 데이터를 조회하는 쿼리는 다음과 같습니다:

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

예시

30분 전의 데이터를 조회하고자 할 때는 아래와 같은 쿼리를 사용할 수 있습니다:

SELECT *
FROM COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '30' MINUTE)
WHERE CODE = '1234';

2. 조회한 데이터를 삽입 또는 수정

과거 데이터를 조회하여 현재 테이블에 삽입하거나 수정할 수 있습니다.

데이터 삽입

조회한 데이터를 삽입할 때는 다음과 같은 쿼리를 사용합니다:

INSERT INTO 테이블명
(SELECT *
 FROM 테이블명 AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE));

예시

30분 전의 데이터를 삽입하는 예시는 다음과 같습니다:

INSERT INTO COMPANY
(SELECT *
 FROM COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '30' MINUTE));

데이터 수정

기존 데이터를 과거 데이터로 수정할 때는 다음과 같은 쿼리를 사용할 수 있습니다:

UPDATE 테이블명 A
SET (A컬럼, A컬럼, ...)
    = (SELECT B컬럼, B컬럼, ...
       FROM (테이블명 AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE)) B)
WHERE A컬럼 = B컬럼;

예시

UPDATE COMPANY A
SET (A.NAME, A.ADDRESS) = 
    (SELECT B.NAME, B.ADDRESS
     FROM (COMPANY AS OF TIMESTAMP(SYSTIMESTAMP - INTERVAL '15' MINUTE)) B)
WHERE A.CODE = B.CODE;

모든 테이블에서 데이터 찾는 쿼리문 생성

특정 값을 포함하는 데이터를 모든 테이블에서 찾기 위해 다음과 같은 쿼리를 사용할 수 있습니다:

SELECT 'SELECT ''' || A.TABLE_NAME || ''', '''
       || A.COLUMN_NAME || ''', COUNT(*) FROM '
       || A.TABLE_NAME || ' WHERE '
       || A.COLUMN_NAME || ' LIKE ''%값%'' UNION '
FROM USER_TAB_COLUMNS A
LEFT OUTER JOIN (SELECT TABLE_NAME FROM USER_TABLES WHERE NUM_ROWS > 0) B
    ON A.TABLE_NAME = B.TABLE_NAME
WHERE A.DATA_TYPE = 'VARCHAR2';

모든 테이블에서 원하는 컬럼명 찾기

특정 컬럼명을 모든 테이블에서 찾기 위해 다음과 같은 쿼리를 사용할 수 있습니다:

SELECT TABLE_NAME, COLUMN_NAME 
FROM ALL_TAB_COLUMNS 
WHERE COLUMN_NAME LIKE '%컬럼명%';

결론

Flashback 기능은 데이터베이스 관리에 있어 매우 강력한 도구입니다. 실수로 데이터를 삭제했을 때 유용하게 사용할 수 있으며, 특정 시점의 데이터를 복구하는 데에도 큰 도움이 됩니다. 위의 쿼리들을 활용하여 더 효율적으로 데이터베이스를 관리해보세요.

728x90

댓글