본문 바로가기
일/개발, IT정보

오라클 DB RECYCLEBIN 관리 및 사용법

▷ RECYCLEBIN (휴지통) 이란?

Oracle에는 10g 버전부터 휴지통(RECYCLEBIN)이라고 불리는 공간이 존재합니다.

RECYCLEBIN은 테이블 Drop 시, 완전히 삭제되어서 저장 공간이 반환되기 전 이동하는 공간으로 바로 복구가 가능한 기능을 제공합니다. (Windows 휴지통과 유사)

객체가 DROP 될 때, 해당 객체는 완전히 삭제되는 것이 아니라 휴지통으로 이동되고 휴지통에 이동된 객체는 'BIN$' 접두어가 붙은 이름으로 저장됩니다.

참고로 DROP 명령어는 DDL 명령어로, 명령문이 수행된 후 자동으로 COMMIT 되기 때문에 ROLLBACK이 되지 않습니다.

 

 

▷ RECYCLEBIN 관련 뷰

- USER_RECYCLE_BIN (= RECYCLEBIN)

  : 현재 사용자의 휴지통 객체에 대한 정보를 제공, 사용자 자기 자신이 직접 DROP한 오브젝트 볼 수 있는 뷰

- DBA_RECYCLEBIN

  : 모든 사용자의 휴지통 객체에 대한 정보를 제공, 관리자가 DROP된 모든 오브젝트를 볼 수 있는 뷰

 

 

▷ DAB_RECYCLEBIN 뷰 컬럼 설명

Column Description
OWNER Object의 원래 소유자명 (USER_RECYCLE_BIN에서는 제외되는 컬럼)
OBJECT_NAME Recyclebin에서 사용하는 Object 새 이름
ORIGINAL_NAME Object Original name (원래 테이블, 인덱스 명 확인 가능)
OPERATION Object에 대해 수행된 작업 (ex. DROP, TRUNCATE)
TYPE Object 유형 (Table, Index )
TS_NAME Object가속한 Tablespace 이름
CREATETIME Object 생성 시간
DROPTIME Object Drop 시간
DROPSCN Object Recyclebin으로 옮긴 트랜잭션 SCN
PARTITION_NAME 삭제된 파티션 
CAN_UNDROP Object Drop 취소할 수있는지(Yes) 없는지(No) 확인
CAN_PURGE Object Purge  수있는지(Yes) 없는지(No) 확인
RELATED 상위 Object 번호
BASE_OBJECT 기본 Object 번호
PURGE_OBJECT Purge되는 Object 번호
SPACE Object가사용하는 block 

 

 

▷ RECYCLEBIN Object의 네이밍 규칙

 - RECYCLEBIN의 오브젝트 이름은 동일 이름 충돌을 방지하기 위해 고유 이름을 사용합니다.

BIN$[Unique_id]$[Version]
ex) BIN$+hFk2F4lQsjgUzOKEKxu1Q==$0

 

 

▷ RECYCLEBIN 기능 활성화 조회

‘on’이면 활성화 되어있는 상태, ‘off’이면 비활성화 상태입니다.

SQL> select name, value from v$parameter where name like '%recyclebin%';
 
 
 
SQL> show parameter recyclebin;
NAME                                 TYPE        VALUE
-------------------------------- ----------- --------------------
recyclebin                           string      on

 

 

▷ RECYCLEBIN 활성화/비활성화

●   시스템레벨 수준 (DB 재시작 후 적용 가능)

SQL> ALTER SYSTEM SET RECYCLEBIN=ON SCOPE=SPFILE;

 

  세션레벨 수준

SQL> ALTER SESSION SET RECYCLEBIN=ON;

 

 

 휴지통 Object 조회

  user가 직접 drop 한 휴지통 object 조회 (Drop 한 시간 기준)

SQL> SELECT * FROM [RECYCLEBIN | USER_RECYCLEBIN] order by droptime desc;

 

  관리자가 DROP 모든 Object   있는 뷰 (sys 계정 실행)

SQL> SELECT * FROM DBA_RECYCLEBIN order by droptime desc;

 

- 휴지통 Object 조회 예시

SQL> select * from t1;
 
 


SQL> drop table t1;
 
SQL> select * from RECYCLEBIN order by droptime desc;
 
 
 


--recyclebin  object_name 기준 조회 (원래 테이블 내용이 조회됩니다.)
SQL> select * from "BIN$BIHn+L+mQB/gYwo4qMBS/A==$0";
 
 

 

 

▷ 휴지통에 있는 Object 복구

  같은 테이블 이름으로 복구 (인덱스도 같이 복구되지만 Original name으로 변경 필요)

SQL> FLASHBACK TABLE “[OBJECT_NAME]” TO BEFORE DROP;
SQL> FLASHBACK TABLE [ORIGINAL_NAME] TO BEFORE DROP;

 

- 같은 테이블 이름으로 복구 예시

SQL> select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, TS_NAME, CREATETIME, DROPTIME from RECYCLEBIN order by droptime desc;
 
 
 
-- Object_name으로 복구
SQL> FLASHBACK TABLE “BIN$BIHn+L+mQB/gYwo4qMBS/A==$0” TO BEFORE DROP;
 
-- Orignal_name으로 복구
SQL> FLASHBACK TABLE t1 TO BEFORE DROP;
 
-- 복구한 t1 테이블 조회
SQL> select * from t1;
 
 

 

  다른 테이블 이름으로 복구

SQL> FLASHBACK TABLE [ORIGINAL_NAME] TO BEFORE DROP RENAME TO [테이블명];

 

- 다른 테이블 이름으로 복구 예시

SQL> select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, TS_NAME, CREATETIME, DROPTIME from RECYCLEBIN order by droptime desc;
 
 
 
-- t1 테이블을 object_name 이용해 t1_bak 이름으로 복구
SQL> FLASHBACK TABLE "BIN$BIHn+L+yQB/gYwo4qMBS/A==$0" TO BEFORE DROP RENAME TO t1_bak;
 
-- t1 테이블을 Recyclebin Orignal_name 이용해 t1_bak 이름으로 복구
SQL> FLASHBACK TABLE t1 TO BEFORE DROP RENAME TO t1_bak;
 
SQL> select * from t1_bak;
 
 

 

 

▷ 휴지통 테이블 복구시 종속된 인덱스 복구

Drop된 테이블을 복구할 경우 테이블에 종속된 인덱스도 같이 복구되는데 Original name이 아닌 Object name(Bin$로 시작하는 이름)으로 복구됩니다.

Original name로 복구하려면 수동으로 변경해줘야 합니다.

따라서 테이블을 복구하기 전에 각 Object의 Original name을 기록해 두어야 복구 후 이름을 수정하여 원래 테이블, 인덱스명으로 사용할 수 있습니다.

 

- 테이블 복구시 인덱스 복구 예시

-- t1 테이블 인덱스 조회
select table_name, index_name, column_name from user_ind_columns;
 
 
 
-- t1 테이블 Drop
Drop table t1;
 
-- recyclebin 조회
select OBJECT_NAME, ORIGINAL_NAME, OPERATION, TYPE, TS_NAME, CREATETIME, DROPTIME from RECYCLEBIN order by droptime desc;
 
 
 
-- t1 테이블 복구
FLASHBACK TABLE t1 TO BEFORE DROP;
 
-- t1 테이블 인덱스 조회 (Object name 명으로 복구된 것을 확인)
select table_name, index_name, column_name from user_ind_columns;
 
 
 
-- Original name으로 인덱스명변경
ALTER INDEX "BIN$BJO6cl1DCpbgYwo4qMCtRw==$0" RENAME TO PK_T1;
 
-- t1 테이블 인덱스 조회
select table_name, index_name, column_name from user_ind_columns;
 
 

 

 

▷ 휴지통 Object 삭제

  휴지통에 있는 OBJECT_NAME 별로 삭제 명령어

-- OBJECT_NAME 으로 삭제
SQL> PURGE TABLE “[OBJECT_NAME]”;

 

  휴지통에 있는 ORIGNAL_NAME 별로 삭제 명령어

-- ORIGNAL_NAME 으로 삭제
SQL> PURGE TABLE [ORIGNAL_NAME];

 

 

▷ 휴지통 비우기

  전체 휴지통 비우기

sqlplus / as sysdba 접속 후 아래 명령 실행

$ sqlplus / as sysdba
 
SQL> PURGE DBA_RECYCLEBIN;
 
DBA Recyclebin purged.

 

  Login 계정의 휴지통 비우기

SQL> PURGE RECYCLEBIN;

 

 

 

ORACLE Database의 RECYCLEBIN 기능은 실수로 삭제된 객체의 복원을 위한 강력한 도구로써, 데이터 관리에 큰 도움을 제공합니다.