Oracle9i의 Flashback Query를 확장한 내용이 Flashback Versions QueryFlashback Transaction Query이다. Flashback Versions Query는 Select시 versions between명령을 넣으면 해당 정보의 history 정보가 나온다. Flashback Versions Query와 Flashback Transaction Query는 undo tablespace의 정보를 이용하기 때문에, flashback log와는 관련이 없다.

Flashback Versions Query Test

테스트 개요

Flashback Version Query는 두 가지로 나뉜다. 하나는 System Change Number(SCN)를 기준으로 하는 것과 다른 하나는 timestamp를 기준으로 하는 것이다. 여기서는 두 가지를 다 테스트 해보겠다.

테스트 환경

Undo data를 이용하여 해당 정보의 history를 볼 수 있는 Flashback Versions Query를 테스트 해보겠다. Undo 정보의 retention guarantee를 위해서는 undo tablespace를 retention guarantee해야 한다. 이 내용은 위에서 언급하였으므로 여기서는 생략한다.

Flashback Versions Query는 Flashback database와 상관없음을 확인해 보겠다.

SQL> conn / as sysdba

Connected.

SQL> select flashback_on from v$database;

 

FLASHB

——

NO

테스트 예제

두 가지 versions query에 대해 test해보겠다.

SQL> conn scott/tiger

Connected.

SQL> select to_char(sysdate, ‘YY-MM-DD HH24:MI:SS’) from dual;

 

TO_CHAR(SYSDATE,’YY-MM-DDHH24:MI:S

———————————-

03-10-10 16:06:58

 

SQL> select empno, ename, job, sal, deptno from test_emp;

 

EMPNO ENAME JOB SAL DEPTNO

———- ——————– —————— ———- ———-

7782 CLARK MANAGER 2450 10

7839 KING PRESIDENT 5000 10

7934 MILLER CLERK 1300 10

 

 

SQL> update test_emp set sal = 1400 where ename =’MILLER’;

 

1 row updated.

 

 

SQL> select empno, ename, job, sal, deptno from test_emp

2
versions between scn minvalue and maxvalue

3 where ename=’MILLER’;

 

EMPNO ENAME JOB SAL DEPTNO

———- ——————– —————— ———- ———-

7934 MILLER CLERK 1400 10

7934 MILLER CLERK 1300 10

 

SQL> select empno, ename, job, sal, deptno from test_emp

2 versions between timestamp

3 to_timestamp(’03-10-10 16:06:58′, ‘YY-MM-DD HH24:MI:SS’) AND

4 to_timestamp(sysdate)

5 where ename =’MILLER’;

select empno, ename, job, sal, deptno from test_emp

*

ERROR at line 1:

ORA-30054: invalid upper limit snapshot expression

 

SQL> select empno, ename, job, sal, deptno from test_emp

2 versions between timestamp


3
to_timestamp(’03-10-10 10:06:58′, ‘YY-MM-DD HH24:MI:SS’) AND

4 to_timestamp(sysdate) where ename =’MIILER’;

select empno, ename, job, sal, deptno from test_emp

*

ERROR at line 1:

ORA-30052: invalid lower limit snapshot expression

VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE 는 별 문제 없이 수행되었다. 그러나 VERSIONS BETWEEN TIMESTAMP는 error를 떨어뜨렸다.

ORA-30054: invalid upper limit snapshot expression

error 4번째
줄의 to_timestamp(sysdate)
잘못되었다는 error
현재의 current_scn
미처
현재시간까지 update되지
않았음을
의미한다.

    ORA-30052: invalid lower limit snapshot expression

또한 minscn보다 이른 시간을 넣으면 위와 같은 error가 생긴다.

위와 같은 내용을 정확히 처리하기 위해서 Oracle Database 10g부터 새로운 pseudocolumn이 생겼다.

  • VERSIONS_STARTTIME
  • VERSIONS_STARTSCN
  • VERSIONS_ENDTIME
  • VERSIONS_ENDSCN
  • VERSIONS_XID
  • VERSIONS_OPERATION

또한 scn과 timestamp의 관계를 알아볼 수 있는 function 두 가지가 추가되었다.

  • SCN_TO_TIMESTAMP
  • TIMESTAMP_TO_SCN

위의 pseudocolumn을 이용하여 다시 정확히 query를 수행해 보겠다.

SQL> update test_emp set sal =1600 where ename =’MILLER’;

 

1 row updated.

SQL> COMMIT;

Commit complete.

 

SQL> select versions_starttime, versions_endtime, sal from test_emp

2 versions between scn minvalue and maxvalue

3 where ename=’MILLER’;

 

VERSIONS_STARTTIME VERSIONS_ENDTIME SAL

—————————— —————————— ———-

10-OCT-03 04.43.55 PM 1600

10-OCT-03 04.40.38 PM 10-OCT-03 04.43.55 PM 1500

10-OCT-03 04.40.38 PM 1400

SQL> select sal from test_emp

  1. versions between timestamp
  2. to_timestamp(‘2003-10-10 16:40:38′,’YYYY-MM-DD HH24:MI:SS’)

4 and to_timestamp(‘2003-10-10 16:43:55’, ‘YYYY-MM-DD HH24:MI:SS’)

5 where ename =’MILLER’;

 

SAL

———-

1500

1400

 

SQL> select scn_to_timestamp(current_scn) from v$database;

 

SCN_TO_TIMESTAMP(CURRENT_SCN)

—————————————————————————

10-OCT-03 04.50.51.000000000 PM

 

SQL> select sal from test_emp

  1. versions between timestamp
  2. to_timestamp(‘2003-10-10 16:40:38′,’YYYY-MM-DD HH24:MI:SS’) and
  3. to_timestamp(‘2003-10-10 16:50:51’, ‘YYYY-MM-DD HH24:MI:SS’)
  4. where ename =’MILLER’;

 

SAL

———-

1600

1500

1400


 

위의 내용과 같이 변경되기 전의 내용인 sal=1400인 정보는 VERSIONS_STARTTIME은 없고 VERSIONS_ENDTIME만이 있다. 또한 current_scn에 대한 정보에 대한 timestamp를 직접 query하여 정보를 넣으면 마지막 변경 사항을 볼 수 있다.

Flashback Transaction Query Test

테스트 개요

비교적 간단한 Flashback Transaction Query test를 해보겠다. 테스트 환경은 Flashback Versions Query와 차이가 없다.

테스트 예제

 

SQL> select sal from test_emp

2 versions between scn minvalue and maxvalue

3 where ename=’MILLER’;

 

SAL

———-

1600

 

SQL> update test_emp set sal=1700

2 where ename=’MILLER’;

 

1 row updated.

 

SQL> commit;

 

Commit complete.

 

SQL> update test_emp set sal=1800

2 where ename =’MILLER’;

 

1 row updated.

 

SQL> commit;

 

Commit complete.

 

SQL> select versions_xid, sal

2 from test_emp

3 versions between scn minvalue and maxvalue

4 where ename=’MILLER’;

 

VERSIONS_XID SAL

—————- ———-

0006000F0000001B 1800

0005000F00000036 1700

1300

 

SQL> select operation, undo_sql, table_name from

  1. flashback_transaction_query where xid=’0005000F00000036′;

 

OPERATION

——————————–

UNDO_SQL

—————————————————————————

TABLE_NAME

—————————————————————————

UPDATE

update “SCOTT”.”EMP” set “SAL” = ‘1300’ where ROWID = ‘AAAL+ZAAEAAAAAdAAN’;

EMP

 

 

 

 

활용가이드 및 결론

Database를 관리하는 DBA는 항상 주의를 요하게 된다. 하나의 실수가 돌이킬 수 없는 엄청난 결과를 초래할 수 있기 때문이다. 문제는 DBA는 사람이기 때문에 그러한 실수를 원천적으로 봉쇄할 방법이 없다는 것이다. 따라서 차후의 선책으로 Flashback Query를 이용할 수 있다. 이미 일어난 예기치 않은 장애에 대해 많은 부분을 Flashback Query가 해결해 줄 수 있다. 많은 양의 log들과 예기치 않은 장애 시 해결할 방법 및 대책을 효과적으로 만들어 놓았다면 Oracle의 새로운, 그리고 더욱 향상된 Flashback Query를 효과적으로 사용할 수 있을 것이다.

By haisins

오라클 DBA 박용석 입니다. haisins@gmail.com 으로 문의 주세요.

답글 남기기

이메일 주소를 발행하지 않을 것입니다. 필수 항목은 *(으)로 표시합니다