본문 바로가기

오라클 백업/복구

Flashback 1 - Row Level



Flashback

사용자의 논리적인 오류를 아주 빠르게 복구 할 수 있는 방법


물리적인 장애는 Flashback을 쓸 수 없음

- 획기적인 여러가지 기능들로 논리적인 실수를 복구하는데는 킹왕짱

- 하지만 모든 논리적 장애를 복구 할 수 있는 것은 아님, 생각보다 안되는 경우가 많다.

- commit 된 데이터만 복구 가능

- 종류에는   1. Row Level Flashback

2. Table Level Flashback

3. Database Level Flashback



※ 장애 ※

물리적 장애 - 디스크 장애, 서버 장애 등으로 인한 파일 손상, 파일이 지워진다든지 덮어쓴다든지..

논리적 장애 - 사용자의 실수나 명령어 장애, 쳐서는 안되는 명령어를 쳤다거나 하는..

 오라클 입장에서는 장애가 아님 그냥 query 수행이라고 인식. 우리가 잘못친거지






1. Row Level Flashback


특정 테이블의 특정 Row만 Flashback 하는 기능


해당 Row의 커밋된 데이터만 변경 시킬 뿐 다른 테이블이나 다른 row의 데이터는 변경하지 않음

Undo data 정보를 이용해서 복구 -> undo segment를 찾아서 해당 row를 flashback

10g까지는 undo segment를 다른 트랜잭션에서 재사용 하면 Flashback 불가능 [밑에 실습2 참고]




Flashback Version Query 

해당 데이터의 과거 변경 이력을 전부 찾아주는 쿼리, 구간으로  검색 가능

commit 하지 않고 version query 를 조회하면 내역이 나오지 않음 = commit 데이터만 가능하다

9i 까지는 Flashback Query를 썼음, 이건 특정 시점, 딱 정해진 시간의 변경 내역만 찾을 수 있다.


조회방법

SELECT versions_startscn st_scn, versions_endscn endscn,

versions_xid txid, versions_operation opt, 칼럼들

FROM 테이블명 versions between scn minvalue and maxvalue

WHERE (조건) ;


조회된 내용은 아래에서 위로 읽어주면 된다. 맨 아랫줄이 먼저 변경된 내역 

하나의 row에 여러건의 변경이 있을 때는 현재 찾으려는 변경 사항이 무엇인지 구분해야 하는 경우가 있음

이 때에는 해당 변경 사항이 발생한 시간으로 짐작해 추적

해당 시간은 scn_to_timestamp( )라는 함수를 사용


SELECT scn_to_timestamp(st_scn) from dual ;


이 명령어를 사용해 scn을 시간으로 변경해서 조회하면 원하는 scn과 변경 사항을 찾아낼 수 있음

찾으면 Flashback Transaction Query 를 수행해 원래 데이터로 돌리면 됨




Flashback Transaction Query 

변경 사항을 취소시켜 이전 값으로 돌려주는 쿼리를 찾아주는 쿼리

flashback_transaction_query 라는 뷰를 select 할 수 있는 권한이 있어야 사용 가능

> grant select any transaction to 유저 ;


조회방법

SELECT undo_sql 

FROM flashback_transaction_query

WHERE table_name='테이블명대문자'

AND commit_scn between # and #

ORDER BY start_timestamp desc ;


조회한 내용들이 UNDO_SQL를 찾아주는 쿼리이기 때문에

원하는 작업의 쿼리를 실행 시켜주면 된다.


[실습]




주의해야 할 점은

undo segment를 다른 트랜잭션에서 재사용 하면 Flashback 불가능


대량의 DML 작업을 하기 위해서는 undo segment를 할당받아야 한다. 그래서 충분한 undo segment 용량이 필요함

용량이 부족할 경우 다른 사용자가 사용했던 undo segment를 덮어 사용한다.

그래서 Version Query를 조회했을 때 내용이 보이지 않는다. 지워진거나 마찬가지니까 


즉,

commit이 발생한지 오래 지난 데이터, 트랜잭션이 많이 일어나는 경우는

undo segment를 다른 사용자가 재사용할 확률이 높기 때문에 Flashback으로는 복구가 불가능할 가능성이 큼


[실습2]



이런 문제를 막기 위해서 11g에서는

Flashback Data Archive가 등장

해당 테이블의 undo segment 정보를 특정 위치로 archive해서

시간이 오래 지난 후에도 데이터를 조회하고 변경할 수 있게하는 기능