Oacle 스크롤 백 메커니즘 에 대한 심도 있 는 탐구
12052 단어 Oacle
아래 에서 우 리 는 내부 에서 그것 을 구체 적 으로 이해한다.
세 션 1: scott 사용자, 트 랜 잭 션 시작
hr@ORCL> conn scott/oracle
Connected.
scott@ORCL> UPDATE emp SET sal=4000 WHERE empno=7788;
1 row updated.
scott@ORCL> SELECT empno,ename,job,mgr,sal FROM emp WHERE empno=7788;
EMPNO ENAME JOB MGR SAL
---------- ---------- --------- ---------- ----------
7788 SCOTT ANALYST 7566 4000
이 트 랜 잭 션 을 제출 하지 않 습 니 다. 세 션 2: SYS 사용자 가 트 랜 잭 션 정 보 를 가 져 옵 니 다.
v $transaction 에서 얻 을 수 있 습 니 다: 이 사 무 는 9 번 스크롤 백 단계 에 있 고 26 번 트 랜 잭 션 슬롯 에 있 습 니 다.
sys@ORCL> SELECT xidusn,xidslot FROM v$transaction;
XIDUSN XIDSLOT
---------- ----------
9 26
v $rollstat 에서 도 이 트 랜 잭 션 이 9 번 스크롤 백 단계 임 을 알 수 있 습 니 다.
sys@ORCL> SELECT usn,xacts FROM v$rollstat;
USN XACTS
---------- ----------
0 0
1 0
2 0
3 0
4 0
5 0
6 0
7 0
8 0
9 1
10 0
dump 스크롤 백 세그먼트 헤더 정보
sys@ORCL> SELECT * FROM v$rollname a WHERE a.usn=9;
USN NAME
---------- ------------------------------
9 _SYSSMU9$
sys@ORCL> alter system dump undo header '_SYSSMU9$';
System altered.
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid
2 from v$mystat where rownum=1));
SPID
------------
10086
부분 내용 은 다음 과 같 습 니 다.
********************************************************************************
Undo Segment: _SYSSMU9$ (9)
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 4 #blocks: 31
last map 0x00000000 #maps: 0 offset: 4080
Highwater:: 0x00800615 ext#: 2 blk#: 4 ext size: 8
#blocks in seg. hdr's freelists: 0
#blocks below: 0
mapblk 0x00000000 offset: 2
Unlocked
Map Header:: next 0x00000000 #extents: 4 obj#: 0 flag: 0x40000000
Extent Map
-----------------------------------------------------------------
0x0080008a length: 7
0x008000d9 length: 8
0x00800611 length: 8
0x00800669 length: 8
Retention Table
-----------------------------------------------------------
Extent Number:0 Commit Time: 1344269736
Extent Number:1 Commit Time: 1344276385
Extent Number:2 Commit Time: 1344264118
Extent Number:3 Commit Time: 1344264252
TRN CTL:: seq: 0x0105 chd: 0x0019 ctl: 0x0014 inc: 0x00000000 nfb: 0x0000
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x00800615.0105.11 scn: 0x0000.000d2615
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.0105.10 ext: 0x2 spc: 0x16f6
uba: 0x00000000.0105.03 ext: 0x2 spc: 0x1eac
uba: 0x00000000.0101.0b ext: 0xb spc: 0x198c
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 0x0162 0x0029 0x0000.000d2ab9 0x00800613 0x0000.000.00000000 0x00000001 0x00000000 1344280244
............................................
0x1a 10 0x80 0x0162 0x0002 0x0000.00000000 0x00800615 0x0000.000.00000000 0x00000001 0x00000000 0
............................................
이것 이 바로 사무 표 정 보 를 포함 한 신비 한 스크롤 백 헤드 의 정보 이다.그 중에서 0x1a 는 16 진수 이 고 10 진법 으로 전환 합 니 다.
scott@ORCL> select to_number('1a','xx') from dual;
TO_NUMBER('1A','XX')
--------------------
26
이 를 통 해 알 수 있 듯 이 0x1a 는 26 이다. 앞의 사무 정 보 를 돌 이 켜 보면 이 사 무 는 26 번 사무 슬롯 을 차지 하고 상태 (state) 는 10 으로 활동 사 무 를 대표 한다.
dump 옛 값 정보 세그먼트 헤더 정보의 일곱 번 째 열: dba (data block address) 는 스크롤 백 블록 의 주소 0x 00800615 를 말 합 니 다. dba 를 번역 하 겠 습 니 다.
sys@ORCL> select to_number('00800615','xxxxxxxx') from dual;
TO_NUMBER('00800615','XXXXXXXX')
--------------------------------
8390165
sys@ORCL> select dbms_utility.data_block_address_file(8390165) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(8390165)
---------------------------------------------
2
sys@ORCL> select dbms_utility.data_block_address_block(8390165) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(8390165)
----------------------------------------------
1557
이 를 통 해 알 수 있 듯 이 오래된 값 은 2 번 파일 의 1557 번 째 스크롤 백 블록 에 있 습 니 다. 이것 은 v $transaction 에서 조회 한 데이터 와 완전히 일치 합 니 다.
sys@ORCL> select ubafil,ubablk from v$transaction;
UBAFIL UBABLK
---------- ----------
2 1557
세 션 1 로 돌아 가 DML 사 무 를 계속 합 니 다: scott 사용자
scott@ORCL> update emp set sal=4000 where empno=7788;
1 row updated.
scott@ORCL> update emp set sal=4000 where empno=7782;
1 row updated.
scott@ORCL> update emp set sal=40000 where empno=7698;
1 row updated.
세 션 2: sys 사용자 가 스크롤 백 1557 dump 를 꺼 냅 니 다.
sys@ORCL> select spid from v$process where addr in (select paddr from v$session where sid in (select sid from v$mystat where rownum=1));
SPID
------------
11146
sys@ORCL> alter system dump datafile 2 block 1557;
System altered.
스크롤 백 1557 에서 시작 하 는 정보 부분 은 다음 과 같 습 니 다.
*** 2012-08-07 16:31:42.449
*** SERVICE NAME:(SYS$USERS) 2012-08-07 16:31:42.355
*** SESSION ID:(135.102) 2012-08-07 16:31:42.355
Start dump data blocks tsn: 1 file#: 2 minblk 1557 maxblk 1557
buffer tsn: 1 rdba: 0x00800615 (2/1557)
scn: 0x0000.000d36d2 seq: 0x01 flg: 0x04 tail: 0x36d20201
frmt: 0x02 chkval: 0xbeca type: 0x02=KTU UNDO BLOCK
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0E7E4400 to 0x0E7E6400
......................
********************************************************************************
UNDO BLK:
xid: 0x0009.01a.00000162 seq: 0x105 cnt: 0x14 irb: 0x14 icl: 0x0 flg: 0x0000
Rec Offset Rec Offset Rec Offset Rec Offset Rec Offset
---------------------------------------------------------------------------
0x01 0x1f08 0x02 0x1e58 0x03 0x1df4 0x04 0x1da0 0x05 0x1d1c
0x06 0x1ca0 0x07 0x1c54 0x08 0x1b80 0x09 0x1afc 0x0a 0x1a70
0x0b 0x198c 0x0c 0x1924 0x0d 0x18cc 0x0e 0x17e8 0x0f 0x1780
0x10 0x1728 0x11 0x16a8 0x12 0x1650 0x13 0x15f4 0x14 0x1598
*-----------------------------
이 부분 정 보 는 인자 irb: 0x 14 가 있 습 니 다.irb 는 스크롤 백 에 기 록 된 최근 제출 되 지 않 은 모든 업무 의 시작 점, 즉 최근 에 수 정 된 곳 을 말 합 니 다. 스크롤 백 을 하려 면 스크롤 백 의 시작 점 입 니 다.위 에서 알 수 있 듯 이 (irb: 0x 14) 의 오프셋 주 소 는 0x 1598 로 irb: 0x 14 정 보 를 찾 았 습 니 다. 다음 과 같 습 니 다.
*-----------------------------
* Rec #0x14 slt: 0x1a objn: 51148(0x0000c7cc) objd: 51148 tblspc: 4(0x00000004)
* Layer: 11 (Row) opc: 1 rci 0x13
Undo type: Regular undo Last buffer split: No
Temp Object: No
Tablespace Undo: No
rdba: 0x00000000
*-----------------------------
KDO undo record:
KTB Redo
op: 0x02 ver: 0x01
op: C uba: 0x00800615.0105.13
KDO Op code: URP row dependencies Disabled
xtype: XA flags: 0x00000000 bdba: 0x01000020 hdba: 0x0100001b
itli: 2 ispac: 0 maxfr: 4858
tabn: 0 slot: 5(0x5) flag: 0x2c lock: 0 ckix: 191
ncol: 8 nnew: 1 size: 1
col 5: [ 3] c2 1d 33
c2 1d 33 을 10 진법 으로 바 꾸 면 2850 입 니 다. 이것 은 마지막 으로 업 데 이 트 된 기록 의 오래된 값 입 니 다.바로 update emp set sal = 4000 where empno = 7698 이다.
주의해 야 할 몇 가지 인자 가 있 습 니 다.
1) 매개 변수 rci 0x 13, 이 매개 변 수 는 undo chain (같은 업무 에서 여러 번 수정 되 었 습 니 다. chain 링크 에 따라) 을 대표 합 니 다. 이 곳 의 rci 0x 13 은 두 번 째 수정 update emp set sal = 4000 where empno = 7782 를 가리 키 고 있 습 니 다. 이 때 다른 프로 세 스 가 scott. emp 표를 조회 하면 Oacle 은 일치 하 게 읽 어서 데 이 터 를 사용자 에 게 보 여 줘 야 합 니 다.2) 매개 변수 bdba: 0x 01000020, 이 매개 변 수 는 이전 값 에 대응 하 는 데이터 블록 의 주 소 를 대표 합 니 다. 다음은 이 매개 변 수 를 번역 합 니 다.
scott@ORCL> select to_number('01000020','xxxxxxxx') from dual;
TO_NUMBER('01000020','XXXXXXXX')
--------------------------------
16777248
scott@ORCL> select dbms_utility.data_block_address_file(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_FILE(16777248)
----------------------------------------------
4
scott@ORCL> select dbms_utility.data_block_address_block(16777248) from dual;
DBMS_UTILITY.DATA_BLOCK_ADDRESS_BLOCK(16777248)
-----------------------------------------------
32
4 번 파일 의 32 번 째 덤 프 를 나 옵 니 다:
sys@ORCL> select spid from v$process where addr in (select paddr from v$session
2 where sid in (select sid from v$mystat where rownum=1));
SPID
------------
13929
sys@ORCL> alter system dump datafile 4 block 32;
System altered.
부분 내용 은 다음 과 같 습 니 다.
Start dump data blocks tsn: 4 file#: 4 minblk 32 maxblk 32
buffer tsn: 4 rdba: 0x01000020 (4/32)
scn: 0x0000.000d36d2 seq: 0x01 flg: 0x04 tail: 0x36d20601
frmt: 0x02 chkval: 0xa9ea type: 0x06=trans data
Block header dump: 0x01000020
Object id on Block? Y
seg/obj: 0xc7cc csc: 0x00.b9cf3 itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1000019 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x0003.011.000000f2 0x00805794.00c8.49 C--- 0 scn 0x0000.0006bfdb
0x02 0x0009.01a.00000162 0x00800615.0105.14 ---- 3 fsc 0x0002.00000000
ITL 트 랜 잭 션 슬롯 정보 가 존재 합 니 다. 트 랜 잭 션 은 ITL 트 랜 잭 션 슬롯 을 받 아야 데이터 수정 이 가능 합 니 다.ITL 내용 은 xid (스크롤 백 헤드 를 가리 키 는 ITL), uba (스크롤 백 블록 을 가리 키 는), Lck (줄 잠 금 의 개수, 여기 서 세 번 수정 하기 때문에 3 개의 잠 금 이 있 음) 을 포함 합 니 다. 상기 출력 에서 알 수 있 듯 이 itl 2 (0x 02) 에 이벤트 가 있 습 니 다.
xid (0x0009.01a. 0000162) 를 분해 합 니 다. 0009 는 이 사무 가 9 번 스크롤 백 을 가리 키 고 01a 는 이 사무 가 26 번 트 랜 잭 션 슬롯 을 가리 키 고 00000162 는 이 업무 가 354 번 째 로 덮어 졌 음 을 나타 냅 니 다 (스크롤 백 은 순환 적 으로 사용 되 기 때 문 입 니 다). uba (0x00800615.0105.14) 를 분해 합 니 다. 00800615 는 1557 번 째 스크롤 백 블록 을 나타 내 고 14 는 irb 정보 (스크롤 백 의 출발점) 입 니 다.
이로써 undo 세그먼트 와 데이터 블록 안의 사무 정 보 는 완전히 해석 되 었 고 이들 은 완전히 일치 합 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
activemq 5.5 의 입문 은 설치, 시작, 데이터베이스 지속 화 를 포함한다Apache ActiveMQ 5.5.0 은 주로 유지보수 버 전 으로 130 개가 넘 는 문 제 를 복 구 했 으 며 대부분 bug 와 개선 이 었 다. Improved performance for offline d...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.