강좌
클라우드/리눅스에 관한 강좌입니다.
데이터베이스 분류

Flashback (과거시점에서 질의실행)

작성자 정보

  • 웹관리자 작성
  • 작성일

컨텐츠 정보

본문

Flashback (과거시점에서 질의실행)

 

t.gif
t.gif
OS: Windows 2000 Advanced Server
Oracle9i Enterprise Edition Release 9.2.0.1.0 - Production
작성자: 강명규(kang@dbakorea.pe.kr)  


FLASHBACK은 9i부터 지원되는 기능으로, 과거시점에서 질의를 실행할 수 있게 해준다.
FLASHBACK모드(과거시점)는 시간, SCN 2가지중 하나로 지정할 수 있다.

시간으로 지정: dbms_flashback.enable_at_time(query_time IN TIMESTAMP);
SCN으로 지정 : dbms_flashback.enable_at_system_change_number(query_scn IN NUMBER);

나머지 DBMS_FLASHBACK패키지에서 제공되는 프로시저는 다음과 같다.

FLASHBACK모드 해제: dbms_flashback.disable;
현재 SCN파악: dbms_flashback.get_system_change_number(RETURN NUMBER);

SCN은 System Change Number의 약자로 트랙잭션마다 주어지는 번호이다.
SCN을 이용하면 정확한 과거시점을 지정할 수 있지만, 해당 시점의 정확한 SCN을 알아내기가 쉽지 않다.
시간으로 지정시, 데이터베이스는 지정한 시간전후 5분내 발생한 SCN을 임의로 선택하여 FLASHBACK을 enable한다.
따라서, 시간으로 지정할때는 현재보다 5분이상 차이가 나는 과거시점으로 지정해야 한다.

flashback모드를 사용하여 과거의 시점에 있더라도 sysdate는 현재의 시간을 반영하는 것에 주의!

FLASHBACK은 DBMS_FLASHBACK 패키지를 통해 사용할 수 있다.
FLASHBACK은 해당 세션에서만 유효하고, DML, DDL연산은 할 수 없다.
따라서 접속이 종료되면 자동으로 현재 시점으로 돌아오게 된다.

FLASHBACK이 유용하게 사용될 수 있는 부분은 다음과 같다.

. 실수로 삭제한 데이터의 복구
. 과거시점의 데이터에 대한 분석


일반사용자가 FLASHBACK을 이용하기 위해서 DBMS_FLASHBACK패키지에 대한 EXECUTE권한이 있어야 한다.

Automatic UNDO Management(AUM)모드하에서, 언제까지 과거데이터를 유지할 것인지 undo_retention패러미터를
설정함으로써 지정할 수 있다. 초단위로.


SQL> show parameter undo

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_management                      string      AUTO
undo_retention                       integer     10800
undo_suppress_errors                 boolean     FALSE
undo_tablespace                      string      UNDOTBS1
SQL>



[테스트]
kang이 소유한 test테이블에는 4개의 row가 존재한다.
이를 삭제하고 난뒤, flashback을 이용하여 과거시점에서 조회하여 어떻게 보이는지 본다.
또한, 삭제된 데이터를 PL/SQL을 이용하여 어떻게 복구하는지도 보이겠다.

SQL> conn kang
암호 입력: **********
연결되었습니다.
SQL> select * from test;

ID         NAME
---------- ----------
maddog     강명규
dbakorea   강명규
superman   슈퍼맨
batman     배트맨

삭제하기전의 날짜를 잘 봐두기 바란다.
FLASHBACK을 이용하여 이 시점에서 데이터를 조회해 볼 것이다.
SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') from dual;

TO_CHAR(SYSDATE,'YY
-------------------
2003-02-24 03:11:14

SQL> delete from test;

4 행이 삭제되었습니다.

SQL> commit;

커밋이 완료되었습니다.

SQL> select * from test;

선택된 레코드가 없습니다.


system유저는 kang이 소유했던 test테이블에 대한 조회를 할 것이다.
kang에게 DBMS_FLASHBACK패키지에 대한 EXECUTE권한이 준다면 이 작업은 kang이 할 수도 있다.

SQL> conn system
암호 입력: ***********
연결되었습니다.
SQL> exec dbms_flashback.enable_at_time(to_timestamp('2003-02-24 03:11:14', 'yyyy-mm-dd hh24:mi:ss'))

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> select * from kang.test;

ID         NAME
---------- ----------
maddog     강명규
dbakorea   강명규
superman   슈퍼맨
batman     배트맨

SQL> exec dbms_flashback.disable;

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> select * from kang.test;

선택된 레코드가 없습니다.



[삭제된 데이터의 복구]

SQL> DECLARE
  2  CURSOR test_cursor is
  3   SELECT * FROM kang.test;
  4   v_test kang.test%ROWTYPE;
  5  BEGIN
  6   dbms_flashback.enable_at_time(to_timestamp('2003-02-24 03:11:14', 'yyyy-mm-dd hh24:mi:ss'));
  7  
  8   open test_cursor;
  9   dbms_flashback.disable; -- flashback을 disable했지만(현재 시점으로 돌아왔음을 의미),
10                           -- 커서(test_cursor)는 여전히 과거시점의 데이터를 가지고 있음을 주의
11   loop
12    fetch test_cursor into v_test;
13    exit when test_cursor%NOTFOUND;
14    insert into kang.test values (v_test.id, v_test.name);
15   end loop;
16   close test_cursor;
17   commit;
18  END;
19  /

PL/SQL 처리가 정상적으로 완료되었습니다.

SQL> select * from kang.test;

ID         NAME
---------- ----------
maddog     강명규
dbakorea   강명규
superman   슈퍼맨
batman     배트맨



Reference:
Oracle Online Manual
Using Flashback in Oracle 9i ( http://dbasupport.com/oracle/ora9i/Flashback_Oracle9i.shtml )

This article comes from dbakorea.pe.kr (Leave this line as is)

관련자료

댓글 0
등록된 댓글이 없습니다.

공지사항


뉴스광장


  • 현재 회원수 :  60,045 명
  • 현재 강좌수 :  35,861 개
  • 현재 접속자 :  135 명