-Flashback이란?

Flashback Database는 데이터베이스를 위한 '되감기 버튼'과도 같다.

작업 중 실수로 테이블이 날라갔을 시 기존의 복구 방법은 Online 백업본 + Archivelog를 이용하여 복구 하였는데, 9i에서 지원되는 flashback query와 10g에서 지원하는 다양한 flashback 기능을 통하여  특정 시점의 특정 segment 데이터까지도 Online 에서 복구가 가능하게 되었다.

DATABASE 전체를 과거의 특정 시점으로 돌린다는 점에서 불완전 복구와 비슷한 개념. (이전까지 사용했던 Point in Time Recovery 또한 사용가능) 

△ 9i : Flashback query

△ 10g : Flashback Database

              Flashback Drop

              Flashback Version Query

              Flashback Transaction Query

              Flashback Table

 - 기존 복구 방식과 비교

* 기존 복구 방식 :

Redo, Archive Log를 이용한 복구,  복구 후 재차 복구 불가능 ( resetlog 때문에 ),  

* Flashback database 복구 방식 :

Flashback Log 를 이용한 복구, 필요에 따라 Redo log 사용. 복구 후 재차 복구 가능(Flashback 쿼리 재차 수행가능)

Flashback Log File이란 ?
Flashback Log File은 오라클 Database를 구성하는 Block(변경되기 이전의 이미지 Block)을 저장하는 로그 파일로서 10g에서 새롭게 소개되고 있는 데이터베이스 복구영역(database recovery area)에 생성되어진다.
기존의 redo log와의 차이점 - redo log의 경우에는 archive할 수 있는 기능이 함께 제공되었지만, Flashback Log는 archive 기능이 따로 제공될 필요가 없다.(db_recovery_file_dest, db_recovery_file_dest_size)
 Flashback Log의 경우에는 물리적인 database 복구에는 사용될수 없다

- Prerequisite

1. Archive log mode & Flashback Database mode

SQL> alter database archivelog;

SQL> alter database flashback on;

SQL> select flashback_on from v$database;                                << Flashback 모드 확인
FLASHBACK_ON
------------------
YES

SQL> archive log list                                                                      << Archive 모드 확인
Database log mode              Archive Mode

2. Undo Retention 지정

SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     3600

3. Parameter 설정 :

db_recovery_file_dest : 파일 저장 경로

db_recovery_file_dest_size : 공간 크기 (기본값은 2G)

db_flashback_retention_target : 분단위 파라미터. 지정한 시간안에 복구가능. 시간을 많이 주면 용량이 커짐

 

예제 >> 테이블 truncate 장애 복구
 

SQL> select count(*) from sapr3.test;

  COUNT(*)
----------
        10
                 

SQL> select to_char(sysdate, 'YYYY-MM-DD HH24:MI:SS') from dual;              << 장애이전 시간조회

TO_CHAR(SYSDATE,'YY
-------------------
2014-04-07 11:28:38

 

SQL> truncate table from sapr3.test;                                                               << 장애발생
    
Table truncated.

SQL> select count(*) from sapr3.test;

  COUNT(*)
----------
         0

SQL> shutdown immediate

SQL> startup mount                                                                                           << mount 상태에서 복구 실행

SQL> flashback database to timestamp timestamp '2014-04-07 11:28:38';       << 장애이전 시간으로 복구

Flashback complete.  

SQL> alter database open resetlogs;                                        

Database altered.


SQL> select count(*) from sapr3.test;                                                             

  COUNT(*)
----------
        10

>> shutdown 하지 않고 복구용 테이블을 생성하여 덮어쓰기도 가능

create table sapr3.BACK_test as (select * from sapr3.test as of timestamp to_timestamp ('2014-04-07 11:28:38', 'YYYY-MM-DD HH24:MI:SS'));


------------------------------------------------------------------------------------------

*참고 : 관련 에러

ORA-01031: insufficient privileges
▶ 권한에러 : DBA 권한을 가지고 있어야 한다!!

ORA-38757: Database must be mounted and not open to FLASHBACK.
▶ MOUNT 상태에서 수행해야 한다!!
 

ORA-01589: must use RESETLOGS or NORESETLOGS option for database open
▶ Flashback database 명령어는 모든 데이터 파일을 불완전 복구처럼 과거 특정시간으로 돌린다.
   → 데이터파일과 리두로그파일, 컨트롤파일의 SCN정보가 다르게 된다. OPEN시킬때 반드시 resetlogs 옵션을 주어야 한다