오라클 트랜잭션,블럭,언두,리두 덤프 테스트
DB CAFE
thumb_up 추천메뉴 바로가기
- DBA { Oracle DBA 명령어 > DBA 초급 과정 > DBA 고급 과정 }
- 튜닝 { 오라클 튜닝 목록 }
- 모델링 { 데이터 모델링 가이드 }
목차
1 트랜잭션,블럭,언두,리두 덤프 테스트[편집]
1.1 sid 확인[편집]
select * from v$mystat where rownum=1;
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
9 3 353
1.2 테이블 생성 및 데이터 입력[편집]
SYS>create table test(id number);
Table created.
-- 데이터 입력 (100건 )
SYS> begin
for i in 1..100 loop
insert into test values(i);
end loop;
end;
/
PL/SQL procedure successfully completed.
1.3 현재 트랜잭션 조회[편집]
SYS>select xidusn, xidslot, xidsqn from v$transaction
where addr =(select taddr from v$session where sid=149);
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
9 3 353
1.4 업데이트 진행[편집]
SYS>update test set id=10000 where rownum<50; 49 rows updated.
1.5 언두 세그먼트 조회[편집]
SYS>select file_id, block_id, segment_id from dba_rollback_segs where segment_id=9;
FILE_ID BLOCK_ID SEGMENT_ID
---------- ---------- ----------
2 137 9
1.6 언두 블럭 덤프[편집]
-- trace 파일을 찾기 쉽게 하기위해 파일명 식별자 적용
SYS>alter session set tracefile_identifier="UNDODUMP";
-- 언두 블럭 덤프
SYS>alter system dump datafile 2 block 137;
SYS>select b.object_name as TABLE_NAME, a.FILE#, a.DBABLK, a.obj, a.CR_SCN_BAS, a.BA, a.CR_UBA_FIL, a.CR_UBA_BLK
, decode (state,0,'FREE',1,'SCUR',3,'CR',4,'READ',5,'MREC',6,'IREC')AS STATE
from x$bh a, dba_objects b
where b.object_name = upper('test')
and a.obj=b.object_id;
TABLE_NAME FILE# DBABLK OBJ CR_SCN_BAS BA CR_UBA_FIL CR_UBA_BLK STATE
------------- ----- ------- ---- ------------- -------- ------------- ------------- ----------
TEST 1 60914 52754 0 289C8000 0 0 SCUR
TEST 1 60914 52754 746827 28C48000 0 0 CR
TEST 1 60913 52754 0 28C44000 0 0 SCUR
1.7 데이터 블럭 덤프[편집]
SYS>alter session set tracefile_identifier="BLOCKDUMP";
SYS>alter system dump datafile 1 block 60914;
System altered.
SYS>exit
1.8 데이터 블럭 덤프 파일 보기[편집]
*** 2010-03-21 17:43:09.122
Start dump data blocks tsn: 0 file#: 1 minblk 60914 maxblk 60914
buffer tsn: 0 rdba: 0x0040edf2 (1/60914)
scn: 0x0000.000b654c seq: 0x03 flg: 0x04 tail: 0x654c0603
frmt: 0x02 chkval: 0x50f3 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0CC29E00 to 0x0CC2BE00
CC29E00 0000A206 0040EDF2 000B654C 04030000 [......@.Le......]
....
CC2BDF0 0201012C 012C02C3 02C30201 654C0603 [,.....,.......Le]
Block header dump: 0x0040edf2
Object id on Block? Y
seg/obj: 0xce12 csc: 0x00.b6508 itc: 2 flg: O typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.003.00000161 0x008001e3.0125.31 ---- 100 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0xcc29e5c
===============
tsiz: 0x1fa0
hsiz: 0xda
pbl: 0x0cc29e5c
bdba: 0x0040edf2
76543210
flag=--------
ntab=1
nrow=100
frre=-1
fsbo=0xda
fseo=0x1d48
avsp=0x1b42
tosp=0x1b42
0xe:pti[0] nrow=100 offs=0
0x12:pri[0] offs=0x1f9a
0x14:pri[1] offs=0x1f94
....
0xd6:pri[98] offs=0x1d4e
0xd8:pri[99] offs=0x1d48
block_row_dump:
tab 0, row 0, @0x1f9a
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c3 02
.....
tab 0, row 99, @0x1d48
tl: 6 fb: --H-FL-- lb: 0x1 cc: 1
col 0: [ 2] c2 02
end_of_block_dump
End dump data blocks tsn: 0 file#: 1 minblk 60914 maxblk 60914
1.8.1 용어 해설[편집]
- ITL
- Interested Transaction List의 Entry Number.
- ITL Entry의 개수는 Table 생성시 INITRANS와 MAXTRANS Option을 통해 설정 가능.
- INITRANS는 최초 설정되는 ITL Entry의 개수이며 MAXTRANS는 동적으로 최대한 증가시킬 수 있는 ITL Entry의 개수 이다. (MAXTRANS의 값을 설정하더라도 무시 됨.)
- 처음 Block Header에는 두 개의 ITL Entry를 갖게 된다. 그래서 동시에 3개 이상의 Transaction이 해당 Block에 발생하지만 않는다면 두 개의 Entry가지고 재사용하며 Transaction 정보를 관리하게 된다. 때문에 가장 최근 해당 Block에 발생했던 2개의 Transaction에 대한 정보를 관리하게 된다.
- ITL List에 동시 3개 이상의 여러 Transaction이 동일 Block에 존재하는 Row들을 대상으로 Update를 수행한다면 Transaction의 개수만큼 동적으로 증가할 수 있으며 이렇게 증가한 ITL List는 줄어들지 않는다.
- XID
- Xid는 Transaction 발생 시 첫 번째 DML문장이 수행되는 동안에 Transaction에 할당되는 ID.
- Usn#, Slot#, Wrap# 의 3개의 필드로 구성
- V$TRANSACTION View를 이용해서 조회 가능
- 0x0005.02f.0000028b 을 10진수로 변환하면 USN=5, SLOT=47 SQN=651
- Flag
- Flag는 U와 C 두 종류가 있으며 U Flag는 Upper Bound Commit이라는 의미.
- Fast Commit은 Commit을 빠르게 수행하기 위한 기법이다.
- Commit을 빠르게 수행하기 위해 Commit시 수행 되어야 할 Cleanout작업(ITL정리작업, Row Record 정리작업, Block SCN 변경작업)에 대해 나중에 일부 또는 전부를 수행하는 것이다.
- Cleanout은 Buffer Cache에 상주하는 Block인지, Disk에 상주하는 Block 인지에 따라 처리하는 방식이 다르다.
- 하지만 Buffer Cache에 상주해 있을 때에 Cleanout이 수행된다는 것만은 동일하다.
- 이러한 방식을 채택한 것은 최상의 Commit속도를 내기 위함에 있다.
- Lck
- Lck은 Transaction 에 의해 변경된 row수를 의미.
- Commit이 이루어 졌는데도 불구하고 아직 락을 풀지 않았다는 이유는 바로 오라클은 "delayed block cleanout" 의 메커니즘으로 commit을 처리 하기 때문이다.
- 예를 들어 데이터 100,000건을 insert 후 commit을 하면 바로 끝나지만 오라클은 내부적으로 리두를 이용한 "지연된 블럭 클린아웃" 작업을 진행함.
- Delayed block cleanout이란 변경된 데이터 블록들 중 Fast commit에 의해 cleanout 되지 않은 블록들을 나중에 cleanout 처리한다는 의미이다.
- Delayed block cleanout은 다음 번에 해당 블록을 스캔하는 프로세스에 의해 수행된다.
- Delayed block cleanout이 발생하는 경우 순수한 Select 작업인 경우에도 cleanout 작업 자체에 대한 리두 데이터가 생성 될 수 있다.
- Scn/Fsc
- Scn은 System Change Number의 약자
- Fsc는 Free Space Credit의 약자.
- Fsc 0x0000.000c104e은 ‘.’을 기준으로 앞부분은 Transaction으로 인해 Data Block에 발생되는 Free공간을 의미하며 뒷부분은 마지막으로 Commit된 Transaction의 SCN번호.
- 그리고 Fsc를 통해 Transaction이 진행 중인지 완료되었는지 확인이 가능.
- 만약 Transaction이 수행 중이라면 위 지표의 000c104e부분이 SCN이 할당되지 않아 00000000으로 나타난다.
1.9 Undo 블럭 덤프[편집]
*** TRACE DUMP CONTINUED FROM FILE /u01/app/oracle/admin/orcl/udump/orcl_ora_12575_UNDODUMP.trc ***
*** 2010-03-21 17:41:26.402
Start dump data blocks tsn: 1 file#: 2 minblk 137 maxblk 137
buffer tsn: 1 rdba: 0x00800089 (2/137)
scn: 0x0000.000b650a seq: 0x02 flg: 0x00 tail: 0x650a2602
frmt: 0x02 chkval: 0x0000 type: 0x26=KTU SMU HEADER BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0CC29E00 to 0x0CC2BE00
CC29E00 0000A226 00800089 000B650A 00020000 [&........e......]
...
CC2BDF0 01000017 02C10280 4A29C203 650A2602 [..........)J.&.e]
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 3 #blocks: 23
last map 0x00000000 #maps: 0 offset: 4080
Highwater:: 0x008001e3 ext#: 2 blk#: 2 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 2
Unlocked
Map Header:: next 0x00000000 #extents: 3 obj#: 0 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0080008a length: 7
0x00800031 length: 8
0x008001e1 length: 8
Retention Table
-----------------------------------------------------------
Extent Number:0 Commit Time: 1269143889
Extent Number:1 Commit Time: 1269158414
Extent Number:2 Commit Time: 1269141402
TRN CTL:: seq: 0x0125 chd: 0x002b ctl: 0x000e inc: 0x00000000 nfb: 0x0000
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x008001e2.0125.2a scn: 0x0000.000b5aa7
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.0125.29 ext: 0x2 spc: 0xf10
uba: 0x00000000.0124.3c ext: 0x1 spc: 0x1fa
uba: 0x00000000.0124.2a ext: 0x1 spc: 0xa6e
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
uba: 0x00000000.0000.00 ext: 0x0 spc: 0x0
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x00 9 0x00 0x0161 0x000e 0x0000.000b6425 0x008001e2 0x0000.000.00000000 0x00000001 0x00000000 1269160093
0x01 9 0x00 0x0160 0x000d 0x0000.000b5d5a 0x00800038 0x0000.000.00000000 0x00000001 0x00000000 1269156493
0x02 9 0x00 0x0161 0x0018 0x0000.000b6220 0x008001e1 0x0000.000.00000000 0x00000001 0x00000000 1269158893
0x03 10 0x80 0x0161 0x0002 0x0000.000b6508 0x008001e3 0x0000.000.00000000 0x00000002 0x00000000 0
0x04 9 0x00 0x015f 0x0013 0x0000.000b5b6a 0x00800038 0x0000.000.00000000 0x00000001 0x00000000 1269155293
...
0x2f 9 0x00 0x015f 0x001c 0x0000.000b5ad3 0x00800038 0x0000.000.00000000 0x00000001 0x00000000 1269155292
End dump data blocks tsn: 1 file#: 2 minblk 137 maxblk 137
*** TRACE DUMP CONTINUES IN FILE /u01/app/oracle/admin/orcl/udump/orcl_ora_12575_BLOCKDUMP.trc ***
-- index 0x03(16진수)의 값인 XIDSLOT 3(10진수)와 같다. State의 값이 10으로 되어있는건 현재 트랜잭션 Active상태임을 나타낸다. 즉 commit을 하지않은 트랜잭션 이다.
XIDUSN XIDSLOT XIDSQN
---------- ---------- ----------
9 3 353
select * from v$transaction
where XIDUSN=9 and XIDSLOT=3 and XIDSQN=353;
- 언두 세그먼트 번호 6번이면 트랜잭션 테이블에서의 슬롯 위치는 4번임을 확인할 수 있다.
FILE_ID BLOCK_ID SEGMENT_ID
-------- ---------- --------------
2 137 9
- 언두 헤더의 덤프를 내용을 확인한 결과 세션 종료전 확인 했던 값과 일치 함을 확인 할수 있다.
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0009.003.00000161 0x008001e3.0125.31 ---- 100 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000