본문 바로가기
CS/데이터베이스

[Oracle] 데이터 복구

by 김크롱 2020. 9. 24.

데이터 복구

 - FLASHBACK QUERY

 - FLASHBACK TABLE

 - FLASHBACK DROP

 - FLASHBACK VERSION QUERY

 - FLASHBACK TRANSACTION QUERY

 

 

FLASHBACK QUERY

: 복구 없이 과거 시점 데이터 조회

- 골든 타임 : 15분

 

기본

--사용법1
SELECT *
    FROM tablename1
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
    WHERE column1='KOREA';

--사용법2
SELECT *
    FROM tablename1
    AS OF TIMESTAMP '20/09/24 08:00:00'
    WHERE column1='KOREA';

: 10분 전 기준으로 데이터 조회

- AS OF TIMESTAMP (과거 시점)

- SYSTIMESTAMP : 현재 시간

 

시간 조회

--현재 시간
SELECT SYSTEMIESTAMP
    FROM DUAL;

--과거 시간
SELECT SYSTIMESTAMP - INTERVAL '10' MINUTE
    FROM DUAL;

 

골든타임 확인

- 데이터베이스 파라미터 UNDO_RETENTION으로 확인

SELECT column1, column2
    FROM V$PARAMETER
    WHERE column1='UNDO_RETENTION';

 

 

 

FLASHBACK TABLE

: DELETE 후 COMMIT 했을 경우 복구

 

--tablename 테이블이 플래쉬백 가능한 상태로 변경
ALTER TABLE tablename1 ENABLE ROW MOVEMENT;

--플래쉬백 가능 여부 확인
SELECT row_movement
    FROM user_tables
    WHERE table_name='tablename1';

 

기본

FLASHBACK TABLE tablename TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);

: 현재 시점에서 10분 전으로 FLASHBACK.

- 백업을 가지고 복구하는 것이 아님

- 10분 전부터 현재까지 수행한 DML 작업을 반대로 수행하며 복구시킴

  EX) INSERT -> DELETE, DELETE -> INSERT

- COMMIT 을 반드시 진행 해야 영구반영됨

 

 

특정 테이블만 특정 시점으로 되돌리기

FLASHBACK TABLE tablename TO TIMESTAMP
    TO_TIMESTAMP ('20/09/24 09:00:00', 'RR/MM/DD HH24:MI:SS';

: 20/09/24 09:00:00 부터 현 시점까지 모든 DML을 반대로 수행하며 tablename 테이블을 되돌림

- DDL, DCL문이 있었다면 에러가 발생함

 

 

 

FLASHBACK DROP

: DROP한 테이블 복구

 

 

기본

FLASHBACK TABLE tablename TO BEFORE DROP;

: 휴지통에서 복구

 

 

휴지통에 DROP한 테이블 존재 확인

SELECT ORIGINAL_NAME, DROPTIME
    FROM USER_RECYCLEBIN;

 

복구 시 테이블명 변경

FLASHBACK TABLE tablename1 TO BEFORE DROP RENAME TO tablename2;

 

 

 

 

FLASHBACK VERSION QUERY

: 테이블 데이터 변경 이력 확인

 

 

SELECT column1, column2, versions_starttime, versions_endtime, versions_operation
    FROM tablename
    VERSIONS BETWEEN TIMESTAMP
        TO_TIMESTAMP('2020/09/24 09:00:00', 'RRRR/MM/DD HH24:MI:SS')
        AND MAXVALUE
    WHERE column1='KOREA'
    ORDER BY versions_starttime;

: tablename 테이블이 2020/09/24 09:00:00 부터 현재까지 어떻게 변경되었는지 이력을 출력

 

 

 

 

FLASHBACK TRANSACTION QUERY

: 특정 테이블을 과거시점으로 되돌리기 위한 DML 추출

 

 

SELECT undo_sql
    FROM flashback_transaction_query
    WHERE table_owner='id' AND table_name='tablename1'
    AND commit_scn BETWEEN 9123450 AND 9123455
    ORDER BY start_timestamp DESC;

: 취소할 수 있는 SQL을 조회

- commit_scn : system change numer, commit 할 때 생성되는 번호. 특정 시간대의 scn번호를 범위로 지정