ORACLE DUMP REDO LOG FILE
from IN ORACLE MILIEU … |
http://avdeo.com/2008/01/02/dumping-redo-log-file-information-oracle-database-10g/
1.
REDO LOG 의 DUMP 는 다음과 같은 정보를 가지고 할 수 있다.
A.
DBA
(Data Block Address)
B.
RBA
(Redo Block Address)
C.
SCN
D.
TIME
E.
DUMP THE
FILE HEADER INFORMATION
F.
ENTIRE
LOG FILE
마지막 경우는 A~D 에서 열거한 정보를 아무것도 모르는 상황이 아닌 이상 사용할 일이 없을 거라 생각된다. 10g 에서 50M 정도의
REDO LOG 를 DUMP 뜬 상황이 있었는데 시간도 오래걸리고 용량도 크다. (150M 정도의 크기가 결과물로 나왔다.)
2.
DUMP REDO LOG FILE
A.
DBA
ALTER SYSTEM DUMP LOGFILE ‘FILENAME’ DBA MIN
(FILENO) (BLOCKNO) DBA MAX (FILENO)(BLOCKNO);
FILENAME 에는 FULL PATH 가 들어가며 DATA BLOCK
ADDRESS 를 이용해 RANGE 를 지정하겠다는 의미이다. 그 RANGE 는 MIN ~
MAX 를 의미하며 FILENO, BLOCK ADDRESS 로 특정짓는다.
B.
RBA
ALTER SYSTEM DUMP LOGFILE ‘FILENAME’ RBA MIN
SEQNO BLOCKNO RBA MAX SEQNO BLOCKNO;
C.
SCN
ALTER SYSTEM DUMP LOGFILE ‘FILENAME’ SCN MIN
MINSCN SCN MAX MAXSCN;
특정 SCN 을 사용해
DUMP 한다.
D.
TIME
ALTER SYSTEM DUMP LOGFILE ‘FILENAME’ TIME MIN
VALUE TIME MAX VALUE;
TIME 정보는 REDO DUMP TIME 을 참조
E.
DUMP
FILE HEADER INFORMATION
모든 ONLINE REDO LOG FILE 에 대해 FILE HEADER 정보를 DUMP
ALTER SESSION SET EVENTS ‘IMMEDIATE TRACE
NAME REDOHDR LEVEL 10’
F.
ENTIRE
LOG FILE
ALTER SYSTEM DUMP LOGFILE ‘FILENAME’;
파일에 대해 조건없이 DUMP
3.
EXAMPLE
DBA, RBA, SCN, TIME, DUMP HEADER, DUMP ENTIRE
REDO LOG 와 같은 방법중에 DUMP
HEADER FILE OF REDO LOG 와 REDO LOG 전체를 DUMP 하는 경우를 제외하고 모두 입력값이 필요하다.
DBA 의 경우 DATA BLOCK ADDRESS 가 필요하고 RBA 의 경우 REDO BLOCK ADDRESS , SCN 의 경우 SCN, TIME 의
경우 TIME 정보가 필요하다.
<DBA>
*현재의 변경 작업이 current redo log file 에 쓰여졌다고 가정하였다.
SQL> select
data_object_id,object_id,object_name
2 from dba_objects
3 where owner = 'SCOTT';
DATA_OBJECT_ID OBJECT_ID OBJECT_NAM
-------------- ---------- ----------
51147 51147 PK_DEPT
51146 51146 DEPT
51148 51148 EMP
51149 51149 PK_EMP
51150 51150 BONUS
51151 51151 SALGRADE
6 rows selected.
SQL> update scott.emp
2 set sal = 4000
3 where empno = 7788;
1 row updated.
변경작업을 하나 수행했다. 변경된 작업 내역은 REDO LOG BUFFER 에 쓰이고 REDO LOG BUFFER ->
REDO LOG FILE 로 기록된다. 이 경우에는 3초
이상 기다렸다.
SQL> select group#,status from v$log;
GROUP# STATUS
---------- ----------------
1 INACTIVE
2 CURRENT
3 INACTIVE
SQL> select member from v$logfile where
group# = 2;
MEMBER
--------------------------------------------------------------------------------
/u01/app/oracle/oradata/ora102/redo02.log
변경된 내용은 현재 CURRENT 인 REDO LOG FILE 에 쓰여졌을 것이다. 사실 작업전에 REDO LOGFILE 의 CURRENT GROUP 을 확인하는게
더 정확하겠지만 운영도 아닌 로컬 시스템인지라 별도확인은 생략하였다.(라기 보다 까먹었다;)
현재 CURRENT REDO LOG FILE GROUP 은 2번이며 PATH 를 포함한
REDO LOG FILE 이름을 얻었다.
SQL> select
segment_name,segment_type,file_id,block_id
2 from dba_extents
3 where segment_name = 'EMP'
4 ;
dba_extents 조회를 통해 file_id 와 block_id 를
얻었다. extents
SEGMENT_NAME SEGMENT_TYPE FILE_ID BLOCK_ID
-------------------- ------------------
---------- ----------
EMP TABLE 4 25
*수정된 내용이 starting block 에 있다고 가정하였다. (block_id)*
/*+ rowid 에 대한 내용은 추후에 다시 이야기 하겠다. */
SQL> alter system dump logfile
'/u01/app/oracle/oradata/ora102/redo02.log'
2 dba min 4 25 dba max 4 25;
System altered.
<RBA>
/*+ 내용 추가
필요 */
<TIME>
/*+ 내용 추가
필요 */
/*+ redo dump time 을 이용한다고 한다. 적어도
systimestamp 는 아니다. */
<SCN>
SQL> alter system dump
2 logfile
'/u01/app/oracle/oradata/ora102/redo02.log'
3 scn min
timestamp_to_scn(systimestamp - 3/24/60)
4 scn max
timestamp_to_scn(systimestamp);
alter system dump
*
ERROR at line 1:
ORA-01975: Illegal character in change
number TIMESTAMP_TO_SCN
scn min 뒤에 함수를 사용하지 못한다. 이는 max 도 마찬가지이다.
SQL> alter system dump
2 logfile
'/u01/app/oracle/oradata/ora102/redo02.log'
3 scn min 558655
4 scn max
timestamp_to_scn(systimestamp);
alter system dump
*
ERROR at line 1:
ORA-01975: Illegal character in change
number TIMESTAMP_TO_SCN
에러가 나는 것을 확인할 수 있다.
SQL> select timestamp_to_scn(systimestamp)
from dual;
TIMESTAMP_TO_SCN(SYSTIMESTAMP)
------------------------------
558832
SQL> alter system dump
2 logfile
'/u01/app/oracle/oradata/ora102/redo02.log'
3 scn min 558655 scn max 558832;
System altered.
이와 같이 timestamp_to_scn 함수를 빼고 scn 을 직접 입력해야 에러가 나지 않는다. 다른 함수에 대해 추가로
확인해 보지 않아 모든 함수에 대해 사용이 불가능한건지 확인하지는 못하였다.