본문 바로가기

데이터베이스/오라클

[오라클]플래쉬백(Flashback)을 통한 데이터 복구 -3 (TABLE LEVEL FLASHBACK, Flashback Transaction Query)


 이번에는 플래쉬백(Flashback) 복구 방법 중에 테이블 복구에 관한 것을 다룰까 합니다.
로우 레벨 플래쉬백 복구 방법과 다른 점은 로우 레벨 플래쉬백다른 로우(ROW)에 영향을 주지 않고 해당 로우의 데이터를 복구합니다.

 하지만 테이블 레벨 플래쉬백 복구 방법은 테이블에 있는 전체 로우에 대해서 어느 한 시점으로 복구하는 것이기때문에,
해당 테이블의 모든 로우의 데이터가 영향을 받게 됩니다.

 우선적으로 작업을 할려는 테이블에는 'ROW MOVEMENT'가 'ENABLE' 되어 있어야 합니다.
다음과 같이 설정 가능하겠습니다.
SQL> ALTER TABLE 테이블명 ENABLE ROW MOVEMENT;

[실행화면]





이제 신나게 업데이트를 해볼까요? 다음 테이블에 작업을 합니다.


저는 1년, 2년이 지났다는(?)가정하에 나이를 연산자를 써서 더하고, 한 두사람정도가 국적을 바꿨다고 가정을 합니다.
- 사실 이 기간이 실제로 흘렀다면.. 플래쉬백을 할수 없겠죠 ^^;

[실행화면]


<<여기로 후에 복구합니다.>>

 똑같이 한번 더 해서 나이를 2살 더 먹게 합니다!!

그리고 나서 'maki'의 국적을 '멕시코'로 바꿉니다.

[실행화면]




캐나다인 'steve'를 'korea'로 국적을 바꿉니다.

[실행화면]



다음과 같이 최종적으로 바꼈습니다.

 

 



자, 업데이트 완료되었습니다. 여기서!! 그런데 우리는 다시 1년전의 테이블.. 그러니까 처음의 나이보다 한살 더 적용했을때로 돌아가려 합니다.
즉, 첫번째 쿼리를 적용하고 난 뒤로 말이죠. 어떻게 해야 할까요? 맞습니다.  로우(ROW)레벨 플래쉬백 복구 방법처럼 SCN을 이용하면 될겁니다.

현재는 예전의 SCN들을 잘 모르니까 버전 쿼리(VERSION QUERY)를 써서 한번 알아봅시다.

[실행화면]



보시게 되면.. 현재보다 한살 덜 먹을 때의 scn값을 확인해서 그 전으로 돌리면 되겠군요. 
다음과 같이 합니다.
SQL> FLASHBACK TABLE 테이블명 TO SCN 'SCN값';


[실행화면] 




위와 같이 확인 할 수 있군요.

이렇게 SCN으로도 복구가 가능하겠지만, 대충 언제쯤인지 시간을 기억하고 있을때는 다음도 가능합니다.
SQL> FLASHBACK TABLE hr.ftest TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '시간' MINUTE);

그러니까 만일에 제가 10분전의 테이블로 돌리고 싶다 그러면 다음과 같이 씁니다.
SQL> FLASHBACK TABLE hr.ftest TO TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE);

 하지만 꼭 아셔야 할건, ROW LEVEL 이든지 TABLE LEVEL 이든지 플래쉬 복구 방법은 언두(Undo) 데이터를 이용하기때문에,
일정시간이 지나거나 작업량이 많아 관련 언두 데이터가 지워지게 되면 본 방법을 쓴다 하더라도 복구가 불가능 합니다.

 그리고 TABLE LEVEL에서는 테이블이 DDL에 의해서 변경이 되면, 플래쉬백 복구 방법이 불가하다는 점 아시길 바랍니다.
 
도움 되셨다면 밑의 추천(손가락 표시)과 댓글 부탁드립니다.