붓, 그리다
데이터 복원 flashback 본문
데이터 복원 : 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