ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • SQL 데이터 복원 | FLASHBACK
    Data Base_Oracle/SQL 2020. 1. 13. 17:52

    데이터 복원_FLASHBACK

    Oracle 10g 이후부터 가능

    항상 복원 가능한 것은 아님

    § 형식

    ▶ 테이블명이 중복되지 않는 경우
    [ SQL> flashback table 테이블명 to before drop; ]

     

    ▶ 테이블명이 중복되는 경우(테이블명을 바꾸면서 복구하고 싶은 경우)
    [ SQL> flashback table "휴지통 테이블명" to before drop rename to 새로운 테이블명; ]


    # 예제_DROP TABLE / FLASHBACK

    ① b_emp3 테이블 삭제
    [ SQL> drop table b_emp3;
    테이블이 삭제되었습니다.
    desc b_emp3
    ERROR:
    ORA-04043: b_emp3 객체는 존재하지 않습니다. ]

     

    ※ 테이블의 구조까지 전부 삭제됨

     

    ② scott 계정의 모든 작업 내용 확인
    [ SQL> select * from tab; ]

    TNAME TABTYPE CLUTERID
    BIN$/OOlj1g6RdSYzCxOK9xRSw==$0 TABLE  
    ... ... ..

    ※ 테이블이 recyclebin에 저장되어 있는 상태

     

    ③ b_emp3를 삭제되기 전으로 복구
    [ SQL> flashback table b_emp3 to before drop;
    플래시백이 완료되었습니다. ]

     

    ④ b_emp3 구조확인
    [ SQL> desc b_emp3 ]

    이름 널? 유형
    EMPNO   NUMBER(4)
    JOB   VARCHAR2(9)
    ... ... ...

    ※ 테이블 삭제 전에 데이터를 삭제했기 때문에 데이터는 없는 상태로 복원됨

     

    ⑤ user_recyclebin 확인
    [ SQL> select * from user_recyclebin;
    선택된 레코드가 없습니다.
    show recyclebin
    (출력 내용 없이 바로 넘어감) ]

     

    ※ 휴지통에서 꺼내오는 것이기 때문에 recyclebin에서의 데이터는 사라짐


    # 예제_같은 이름을 가진 여러 테이블 복원

    1. 아무리 손이 빨라도 시간차를 두고 삭제되기 때문에
      테이블을 구분할 수 있음
    2. SCN을 확인하는 방법도 있음

    ① t1테이블 생성/삭제 3번 반복
    [ SQL> create table t1(a number);
    drop table t1;
    .....x3 ]

    ② recyclebin 내용 확인
    [ SQL> show recyclebin ]

    ORIGINAL_NAME OBJECT_NAME OBJECT TYPE DROPTIME
    T1 BIN$~ TABLE 2020-01-13:14:13:36
    T1 BIN$~ TABLE 2020-01-13:14:13:31
    T1 BIN$~ TABLE 2020-01-13:14:13:26

    ※ 삭제된 시간이 서로 다름을 알 수 있음, 테이블 고유 번호(SCN)을 알고 싶으면
    user_recyclebin내의 DROPSCN을 조회해야함

    ※ 삭제된 테이블은 recyclebin의 아래에서부터 저장됨

    ③ flashback을 통해 T1테이블 복구
    [ SQL> flashback table t1 to before drop;
    플래시백이 완료되었습니다. ]

    ORIGINAL_NAME OBJECT_NAME OBJECT TYPE DROPTIME
    T1 BIN$~ TABLE 2020-01-13:14:13:31
    T1 BIN$~ TABLE 2020-01-13:14:13:26

    ※ flashback을 통해 복구할 때는 가장 최근에 삭제된 테이블부터 복구됨


    # 예제_복원할 테이블명이 이미 존재하는 경우

    복원할 때 이름을 변경해서 복원하면 됨

    ① 가장 먼저 삭제한 T1테이블 복원, BIN$~ 이하의 이름을 알면 이름을 변경하면서 복구 가능
    [ SQL> flashback table "BIN$X6zRARPVSwutTIzMJdfARg==$0" to before drop rename to t2;
    플래시백이 완료되었습니다. ]

     

    ② t2 테이블 구조 확인
    [ SQL> desc t2 ]

    이름 널? 유형
    A   NUMBER

    ※ 복원되면서 테이블명이 t2로 변경된 것을 알 수 있음

     

    ③ recyclebin 확인
    [ SQL> show recyclebin ]

    ORIGINAL_NAME OBJECT_NAME OBJECT TYPE DROPTIME
    T1 BIN$~ TABLE 2020-01-13:14:13:31

    ※ 가장 먼저 삭제된 테이블도 OBJECT_NAME을 알면 그 뒤에 삭제된 테이블보다 먼저 복구 가능


    flashback을 사용하여 데이터를 복구하는 여러가지 방법에 대해 알아보았습니다.

    flashback으로 테이블을 복구하기 위해서는 recyclebin에 담겨있는 상태여야 하기 때문에

    데이터를 실수로 삭제했을 경우에는 빠른 시간 내에 복구하는 것이 좋겠습니다.

     

    ※일정 용량 초과시 recyclebin에 오래 담겨 있던 내용부터 삭제된다고 합니다.

    댓글

Designed by Tistory.