본문 바로가기

오라클 백업/복구

Flashback 2 - Table Level



2. Table Level Flashback

DML 에러가 발생 했을 때 특정 테이블 전체를 장애 발생 전 상태로 Flashback 하는 방법

장애난 테이블 전체의 내용이 변경, 다른 테이블의 내용은 당연 변경되지 않음



1) SCN으로 DML 에러 복구 - undo data 사용


다른 테이블은 변경하지 않고 특정 테이블만 데이터를 복구하기 위해서는

row movement라는 속성을 사용하게 됨

이 기능을 사용하려면 테이블에 row movement 속성이 enable 되어 있어야 함

> alter table 테이블명 enable row movement ;


하지만 특정 테이블의 row movement 속성을 enable 할 경우

그 테이블과 연관된 다른 기능들이 사용할 수 없게 됨 (invalid 상태가 됨)

예를들어 특정 테이블의 row movement 속성을 변경하면 연관되어있는 view가 사용할 수 없는상태

=invalid 상태로 변경되서 해당 뷰를 다시 생성해야된다

하지만 11g부터는 개선된 상태!


flashback으로 장애 발생 전의 특정 SCN을 확인한 후 해당 SCN을 사용해 복구

> flashback table 테이블명 to scn '#' ;


[실습]




2) 시간으로 DML 에러 복구 - undo data 사용


SCN을 기억할 수는 없음

Flashback Version Query를 사용해서 해당 테이블의 변경 사항을 조회하면 찾을 수 있기는 하지만 쉬운 작업은 아님


그.래.서

장애난 시간을 추측해서 flashback해서 복구

> flashback table 테이블명 to timestamp (systimestamp - interval '#' minute) ;


interval 뒤의 시간은 second도 가능 함

systimestamp는 쿼리를 수행하는 지금 시점의 시간을 의미 즉, 쿼리를 날리고 있는 현재 시점

(systimestamp - interval '5' minute) 라고 하면

이쿼리 날리는 시점으로부터 5분 전으로 돌아간다는 의미


이방법 역시 undo data를 이용하기 때문에 오래 전 데이터는 flashback 성공 가능성 낮음


[실습]




3) Flashback으로 복구 안되는 경우


누누히 말했지만 undo segment 해당 내역이 없으면 복구 불가능


복구 시간을 너무 오래 전 시간으로 돌리면 undo segment 내역을 찾지 못해 에러가 발생한다

ORA-01555: snaption too old:



undo에서 데이터를 못찾았을 때 발생하는 에러다

이 에러를 통해서도 flashback 기능은 undo data를 사용한다는 것을 알 수있음


또한 table 구조가 변경된 경우도 에러 발생

ORA-01466: unable to read data - table definition has changed



즉 테이블 구조 변경으로 flashback 할 수 없다는 에러 메시지가 나온다.

alter 명령어들은 flashback으로 복구 안되는 경우가 많다.

아무리 flashback이 수행 되더라도 alter로 변경된 데이터는 돌아오지 않음


[예제]


정리하자면,

flashback은 undo data를 사용하는 것이기 때문에

다른 사용자가 undo segment를 덮어쓰거나 테이블 구조가 변경되었다면

복구 할수가 없다.




4) drop table 복구 - 휴지통 기술


drop table 장애가 난 후

select * from tab로 테이블들 조회했을 때 

drop된 테이블의 TABLE NAME이 BIN$로 시작하는 이름으로 바껴있는 것을 볼 수있음 --> 휴지통으로 옮겨짐


10g부터 휴지통 기능이 등장해 테이블을 지우면 휴지통으로 옮겨진다.


휴지통 내용 확인

> show recyclebin


복구

> flashback table 테이블명 to before drop ;


[실습]



※ 휴지통 

테이블을 지우면 당연히 해당 테이블스페이스 용량이 줄어든다

하지만 해당 테이블스페이스 용량이 줄어들었다고 휴지통으로 사용되는 테이블 스페이스로 옮겨진 것은 아님

그대로 해당 테이블스페이스에 남아있고 논리적으로만 이름이 바뀐 상태 

(SYSTEM 테이블스페이스에는 recyclebin이 없음)


즉,

사용자가 테이블을 지우면 오라클은 테이블 이름을 그래서 BIN$로 시작하는 이름으로 바꾸고

점유하고 있던 공간을 할당 해제하지만 데이터는 지우지 않고 보관되어있다

그래서 flashback table 테이블명 to before drop ; 했을 때 복구 하는 것임


하지만 drop table했다고 영원히 데이터가 지워지지 않고 보관되어잇는것이 아니라

특정 시간이 지나면 테이블이 차지하던 공간이 다른 것에 의해 재사용이 되버림

이러면 더이상 복구 할 수 없게 됨


휴지통까지 비우려면 purge 명령어를 사용하면 된다

윈도우에서 shift+delete와 같은 개념


특정 테이블을 휴지통에서 삭제할 경우

> purge table 테이블명 ;


휴지통 전체를 비우는 방법

> purge recyclebin ;


휴지통에 넣지 않고 완전히 삭제할 경우 --> 이런식으로 테이블을 드랍하면 복구 안됨.

> drop table 테이블명 purge ;


[실습]


기본적으로 sys 사용자의 table은 휴지통으로 들어가지 않고 purge

sys사용자가 다른 사용자 소유의 테이블을 삭제하면 해당 사용자의 user_recyclebin에 지워진 테이블이 저장된다.


sys사용자가 다른 사용자 소유의 테이블을 삭제했을 때의 recyclebin 조회방법

>select object_name, original_name, type, droptime from dba_recyclebin 


recyclebin 기능 현재 설정 조회 방법

select a.ksppinm, b.ksppstvl, b.ksppstdf

from x$ksppi a, x$ksppcv b

where a.indx = b.indx

and a.ksppinm like '%recyclebin%'

order by a.ksppinm ;


recyclebin기능 off

> alter session set recyclebin=off ;            -> 현재 세션에서만 off

alter system set recyclebin=off ;             -> 전체 off


[실습]




5) 테이블 drop 후 다른 object 확인


테이블 삭제하면 해당 테이블과 관련된 모든 object들도 함께 삭제됨

Flashback으로 해당 테이블 복구하면 다른 object들도 복구되지만

완전히 복구되지 않기 때문에 수동으로 몇가지 작업을 해줘야 한다


뷰는 복구 후 여전히 사용 불가 상태로 나옴 (INVALID 상태)

그래서 다시 생성해 줘야 한다.


제약 조건은 복구 후 정상적으로 작동되지만

지정해준 constraint name 이 아닌 휴지통에 있던 이름으로 계속 변하지 않음

다시 원상복구 해줘야함

> alter table 테이블명 rename constraint "휴지통이름" to "제약조건이름" ;


인덱스 역시 제약조건과 동일

복구되었지만 이름이 아직도 휴지통에 있던 이름 그대로라서 원래 이름으로 변경

> alter index "휴지통이름" rename to 인덱스이름 ;

※인덱스만 삭제되었을 경우에는 flashback으로 index 복구 되지 없음


정리하면

테이블 drop 장애 flashback으로 복구 후

view 는 다시 재생성

constraint과 index는 원래 이름으로 변경해주기


[실습]


Object 상태 조회

select object_name, object_type, status

from dba_objects

where object_name like '테이블명%' ;


Constraint 제약조건 상태 조회

select table_name, constraint_name, column_name

from user_cons_columns

where table_name='테이블명' ;


인덱스 조회

select table_name, index_name, column_name

from user_ind_columns

 where table_name='테이블명' ;




6) 같은 이름 table일 경우 복구 우선 순위


동일한 이름의 테이블들이 drop 된 경우

flashback으로 복구 할 때

나중에 지워진 테이블부터 먼저 복구 됨


반대로 동일한 이름 테이블이 recyclebin에 있을 경우

purge 할 때는 가장 오래된것부터 purge 된다.


복구하려고 할 때 같은 이름의 테이블이 이미 존재할 경우

에러 발생하면서 복구가 안된다

ORA-38312: original name is used by an existing object


이 상황에서는 복구할 때 이름을 바꾸어서 복구해야함

> flashback table 테이블명 to before drop rename to 새테이블명 ;


[실습]







'오라클 백업/복구' 카테고리의 다른 글

RMAN - Recovery Catalog와 Channel  (0) 2013.02.18
Flashback 3 - Database Level  (0) 2013.02.17
Flashback 1 - Row Level  (0) 2013.02.13
백업 파일 / 아카이브 로그에 문제가 있을 때 복구  (0) 2013.02.13
SQL Loader  (0) 2013.02.11