Notice
Recent Posts
Recent Comments
Link
«   2024/10   »
1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30 31
Tags
more
Archives
Today
Total
관리 메뉴

붓, 그리다

데이터 복원 flashback 본문

Oracle

데이터 복원 flashback

붓그린 2017. 6. 16. 16:57


데이터 복원 : 10g 이후부터 가능


[데이터 삭제 방법]

1) delete

2) truncate

3) drop



Q1. 데이터를 삭제하는 방법 두가지 : delete구문, truncate 구문의 공통점과 차이점을 알아보자

- 공통점 : 두 구문 모두 테이블 내의 데이터를 삭제, 테이블의 구조는 살아있음
- 차이점 : delete 구문은 DML로 rollback으로 복원이 가능, truncate 구문은 DDL 계열로 rollback으로 복원이 안됨


1) delete(DML)

delete from 테이블명 // 테이블 내부 데이터 삭제

delelte from 테이블명
where 조건 // 조건에 해당하는 데이터만 삭제

2) b_emp3 테이블, delete로 삭제

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
        14

SQL> delete from b_emp3;

14 행이 삭제되었습니다.

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
         0

SQL> rollback;

롤백이 완료되었습니다.

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
        14


3) truncate(DDL)

truncate table 삭제시킬 테이블명 // 테이블 내 데이터 삭제


4) truncate로 b_emp3 삭제

SQL> truncate table b_emp3;

테이블이 잘렸습니다.

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
         0

SQL> rollback;

롤백이 완료되었습니다.

SQL> select count(*) from b_emp3;

  COUNT(*)
----------
         0

-> 롤백해도 복원되지 않음
-> 데이터 삭제외에 트랙, 섹터





Q2. drop문으로 데이터를 삭제 시키기

drop table 삭제시킬 테이블명;

- 테이블 자체가 삭제, 즉 테이블 내 데이터도 모두 삭제
- DDL 계열로 일반적으로 복원이 안됨 -> 10g 이후 복원이 가능함
- flashback

1) drop으로 b_emp3 삭제하기

SQL> drop table b_emp3;

테이블이 삭제되었습니다.

SQL> select * from b_emp3;
select * from b_emp3
              *
1행에 오류:
ORA-00942: 테이블 또는 뷰가 존재하지 않습니다

-> rollback으로 복원되지 않음


2) 삭제된 테이블 확인(10g 이후)

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$D/WPbc7sSF+mO6/vS1EFnw==$0 TABLE // 오라클 휴지통에 들어간 상태
BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE
BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE
BONUS                          TABLE
BUSOR                          SYNONYM
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP4                         TABLE
DEPT                           TABLE
DEPT30                         VIEW
EMP                            TABLE

-> 컴퓨터 휴지통에 들어가 있는 형태로 테이블을 복구할 기회가 있음



Q3. 삭제된 테이블 조회하기(user_recyclebin)

1) user_recyclebin 사전 조회

SQL> desc user_recyclebin
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 OBJECT_NAME(삭제 후 테이블 이름)           NOT NULL  VARCHAR2(30)
 ORIGINAL_NAME(삭제 전 테이블 이름)                   VARCHAR2(32)
 OPERATION                                          VARCHAR2(9)
 TYPE(오라클 객체 종류->테이블)                        VARCHAR2(25)
 TS_NAME                                            VARCHAR2(30)
 CREATETIME                                         VARCHAR2(19)
 DROPTIME(삭제된 시간)                                VARCHAR2(19)
 DROPSCN(같은 테이블이라도 서로 내부적으로 구분 가능한 고유번호) NUMBER
        (system change nuber)  
 PARTITION_NAME                                     VARCHAR2(32)
 CAN_UNDROP                                         VARCHAR2(3)
 CAN_PURGE                                          VARCHAR2(3)
 RELATED                                   NOT NULL NUMBER
 BASE_OBJECT                               NOT NULL NUMBER
 PURGE_OBJECT                              NOT NULL NUMBER
 SPACE                                              NUMBER



2) 삭제된 테이블 확인하는 명령어 : recycle

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
B_DEPT3          BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE        2017-05-12:09:50:43
B_EMP2           BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE        2017-05-10:17:17:52
B_EMP3           BIN$D/WPbc7sSF+mO6/vS1EFnw==$0 TABLE        2017-05-12:10:05:33

-> 뷰를 만들지 않아도 휴지통에 들어간 테이블을 확인 할 수 있음


형식) 테이블 복원 : flashback

flashback table 복원시킬 테이블명 to before drop;


3) b_emp3 테이블 복원하기

SQL> flashback table b_emp3 to before drop;

플래시백이 완료되었습니다.

SQL> select * from b_emp3;

선택된 레코드가 없습니다.

SQL> desc b_emp3;
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 EMPNO                                              NUMBER(4)
 JOB                                                VARCHAR2(9)
 MGR                                                NUMBER(4)
 HIREDATE                                           DATE
 SAL                                                NUMBER(7,2)
 COMM                                               NUMBER(7,2)
 DEPTNO                                             NUMBER(2)




*) 삭제된 테이블명과 같은 테이블명이 존재할 경우 -> Q7

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE
BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE
BONUS                          TABLE
BUSOR                          SYNONYM
B_DEPT2                        TABLE
B_EMP2                         TABLE
B_EMP3                         TABLE

-> 현 scott의 자원에 b_emp2 테이블이 존재함


SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
B_DEPT3          BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE        2017-05-12:09:50:43
B_EMP2           BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE        2017-05-10:17:17:52
B_EMP3           BIN$D/WPbc7sSF+mO6/vS1EFnw==$0 TABLE        2017-05-12:10:05:33

-> 휴지통에 같은 이름의 테이블 b_emp2를 삭제되어 존재함


SQL> flashback table b_emp2 to before drop;
flashback table b_emp2 to before drop
*
1행에 오류:
ORA-38312: 원래 이름이 기존 객체에 의해 사용됨

-> 같은 이름의 테이블이 존재하여 삭제된 b_emp2 테이블이 복원되지 않음
-> drop time으로 테이블 명으로 변경하여 복구 가능




Q5. 테이블 영구삭제하기

-> 휴지통을 거치지 않고 완전삭제하여 flashback 기술이 적용이 안됨

형식)

drop table 삭제시킬 테이블명 [purge]


1) b_emp3 영구 삭제하기

SQL> drop table b_emp3 purge;

테이블이 삭제되었습니다.

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
B_DEPT3          BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE        2017-05-12:09:50:43
B_EMP2           BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE        2017-05-10:17:17:52

-> 휴지통에 b_emp3가 존재하지 않음

SQL> flashback table b_emp3 to before drop;
flashback table b_emp3 to before drop
*
1행에 오류:
ORA-38305: 객체가 RECYCLE BIN에 없음

-> flashback을 해도 복원되지 않음(11g 기준)






Q6. 만약에 같은 테이블을 여러개 삭제 시킨 경우, 어떻게 복원하는가?

1) 같은 이름의 테이블 생성 및 삭제, t1을 4번 삭제

SQL> create table t1(a number);

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

SQL> create table t1(a number);

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

SQL> create table t1(a varchar2(10));

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.

SQL> create table t1(a date);

테이블이 생성되었습니다.

SQL> drop table t1;

테이블이 삭제되었습니다.


2) 삭제된 테이블 확인

SQL> show recyclebin

ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
B_DEPT3          BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE        2017-05-12:09:50:43
B_EMP2           BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE        2017-05-10:17:17:52
T1               BIN$Y5AIJgTLRleK08nTuFAKmg==$0 TABLE        2017-05-12:10:47:47
T1               BIN$v2dP+FgLRtGQl4YHFpXQLQ==$0 TABLE        2017-05-12:10:46:35
T1               BIN$XIsDs7ouSoOn/OwqNZrm0g==$0 TABLE        2017-05-12:10:46:08
T1               BIN$R0dz/QdqStWBZt8xTa1qRg==$0 TABLE        2017-05-12:10:44:23

-> 같은 이름의 테이블은 삭제된 시간(DROP TIME)으로 구분


3) 테이블 복원하기

SQL> flashback table t1 to before drop;

플래시백이 완료되었습니다.

SQL> show recyclebin
ORIGINAL NAME    RECYCLEBIN NAME                OBJECT TYPE  DROP TIME
---------------- ------------------------------ ------------ -------------------
B_DEPT3          BIN$ztWI7ad/QqKowG0F60bg2g==$0 TABLE        2017-05-12:09:50:43
B_EMP2           BIN$ya0dchYcQwimk09CIcch9w==$0 TABLE        2017-05-10:17:17:52
T1               BIN$v2dP+FgLRtGQl4YHFpXQLQ==$0 TABLE        2017-05-12:10:46:35
T1               BIN$XIsDs7ouSoOn/OwqNZrm0g==$0 TABLE        2017-05-12:10:46:08
T1               BIN$R0dz/QdqStWBZt8xTa1qRg==$0 TABLE        2017-05-12:10:44:23

-> 가장 최근에 삭제된 테이블이 복구됨

SQL> select * from tab;

TNAME                          TABTYPE  CLUSTERID
------------------------------ ------- ----------
BIN$R0dz/QdqStWBZt8xTa1qRg==$0 TABLE
BIN$XIsDs7ouSoOn/OwqNZrm0g==$0 TABLE
BIN$v2dP+FgLRtGQl4YHFpXQLQ==$0 TABLE
....
EMP_20                         VIEW
EMP_DPTNO                      TABLE
SALGRADE                       TABLE
T1                             TABLE
TEST1                          TABLE



Q7. 이미 복원시킬 테이블이 존재하는 경우(동일한 테이블명)
     -> 이름을 변경 시켜서 복원

형식) 

flashback table "삭제후 휴지통의 테이블명(RECYCLEBIN NAME)"
 to before drop
 rename to 새로운 테이블명;


1) RECYCLEBIN NAME으로 테이블 복원

SQL> flashback table "BIN$v2dP+FgLRtGQl4YHFpXQLQ==$0"
  2  to before drop
  3  rename to imsitest;

플래시백이 완료되었습니다.

SQL> desc imsitest
 이름                                      널?      유형
 ----------------------------------------- -------- ----------------------------
 A                                                  VARCHAR2(10)

-> 기존에 존재하는 테이블명을 변경하거나 복구할 테이블의 이름을 변경한다.






'Oracle' 카테고리의 다른 글

테이블스페이스  (0) 2017.06.16
사용권한 : 객체 권한  (0) 2017.06.16
사용권한 : 시스템 권한(Lock, Role)  (0) 2017.06.16
동의어(synonym) ★  (0) 2017.06.16
인덱스, 시퀀스  (0) 2017.06.16
Comments