FLASHBACK TABLE LEVEL
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
1 Table Level Flashback[편집]
- 다른 테이블에 영향을 주지 않고 대상이 되는 테이블만 복구하는 기술이다.
- Table Level Flashback 은 두가지 방법으로 나눌 수 있다.
- - SCN 기반 Flashback
- - 시간 기반 Flashback
1.2 SCN 기반 Flashback[편집]
- 이벤트가 발생하기 전의 SCN 을 이용한 Flashback 기능을 사용하는 방법.
- 이 방법은 이벤트를 발생시키기 전에 미리 SCN을 기록해 두거나 , 변경 이력 조회 방법등으로 알아낸SCN 을 이용하여 Table Level 의 Flashback 방법
- 전제 조건
- Flashback을 사용하는 테이블은 row movement 가 활성화되어 있어야 한다.
1.2.1 복구실습[편집]
-- map 은 복구 대상 테이블 명
SQL> flashback table map to scn '604359' -- 테이블 레벨에서 SCN 604359 으로 Flashback 을 시도.
ERROR at line 1:
ORA-08189: cannot flashback the table because row movement is not enabled
SQL> ALTER table map enable row movement;
Table altered.
SQL> flashback table map to scn '604359';
Flashback complete.
- 설명
- 테이블 레벨에서 SCN 604359 으로 Flashback 을 시도한다.
- - 이 값은 앞선 포스팅에서( 4. 변경 이력 조회 ) 조회된 값이다.
- - 삭제전에 현재 SCN 조회를 하여 기록해 놨던 SCN 으로 사용해도 된다.
- 테이블에 row movement 가 설정되어 있지 않아서 메시지가 표시된다.
- 테이블에 row movement 를 활성화한다.
- flashback 을 재시도 한다.
1.3 시간 기반 Flashback[편집]
- SCN 과 마찬가지로 undo 를 사용하며 시간을 기반으로 Flashback 기능 사용.
1.3.1 복구실습[편집]
-- 1.대상 테이블 조회
SQL> select * from map;
KEY NAME
-------------------- --------------------
동물 강아지
바다 배
하늘 비행기
-- 2. 테이블 삭제
SQL> delete from map;
3 rows deleted.
-- 3. 복구
SQL> flashback table map to timestamp(systimestamp - interval '2' minute);
Flashback complete.
1.4 관련 에러[편집]
1.4.1 ORA-01466: unable to read data - table definition has changed[편집]
시간을 너무 뒤로 돌려서 해당 테이블이 존재하지 않은 시간대를 선택했거나, alter 명령어로 테이블을 수정시 수정 전 시간으로 Flashback 을 시도하면 위와같은 에러 발생
1.4.2 UNDO Data가 없을때[편집]
ORA-00604 : error occurred at recusive SQL... ORA-12801 error signaled in parallel... ORA-01555 : snapshot too old : rollback segment number ...
1.5 Recycle Bin[편집]
- 윈도우의 휴지통같은 기능
- 테이블을 drop 할때 purge 옵션을 주지 않으면 완전히 삭제되지 않고 복구가 가능한 상태로 바뀌게 되는데. 삭제되어 복구가 가능한 테이블들은 조회 할 수 있으며 복구 할 수 있다.
- 주의사항
- - 테이블이 삭제되면 다른영역으로 이동하는것이 아니라 상태만 변경.
- 그래서 테이블스페이스에 공간이 부족하게되면 우선적으로 recycle bin 이 차지하고 있는 영역을 사용하게 되는데 그러면 recycle bin 을 이용하여 복구가 불가능하다.
- - 인덱스가 존재하는 테이블을 삭제하고 flashback 을 사용하여 복구하면 인덱스도 같이 복구 된다.
- 하지만 인덱스 명이 BIN$. 으로 시작하므로 이름을 변경시켜 주던지 아니면 삭제하고 다시 생성한다.
1.5.1 인덱스 조회[편집]
select table_name, column_name,index_name
from user_ind_columns
where table_name='&tableName' -- map 테이블 인덱스 조회
-- map 테이블 삭제
SQL> drop table map;
Table dropped.
-- 테이블 존재하는지 확인
SQL> select * from tab;
TNAME TABTYPE CLUSTERID
------------------------------ ------- ----------
DEPT TABLE
EMP TABLE
BONUS TABLE
SALGRADE TABLE
BIN$vL0lpMaYHDDgQAB/AQA0Tw==$0 TABLE
SYS_TEMP_FBT TABLE
-- 휴지통 확인
SQL> show recyclebin
ORIGINAL NAME RECYCLEBIN NAME OBJECT TYPE DROP TIME
---------------- ------------------------------ ------------ -------------------
MAP BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0 TABLE 2012-04-04:06:37:26
- select * from tab; 명령을 통한 조회에서는 이름만 표시되고 있으며 show recyclebin 명령은 원본 명과 recycle 명 타입 삭제된 시간 등을 알 수 있다.
1.6 테이블 복구[편집]
1.6.1 drop 한 테이블 명으로 복구[편집]
flashback table map to before drop;
1.6.2 recycle bin name 으로 복구[편집]
flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop;
-- ORA-38312: original name is used by an existing object 이미 존재하는 경우 새이름으로 복구
flashback table "BIN$vM4c+mQ5ZZ/gQAB/AQBU0Q==$0" to before drop rename to map2;