v$transaction: 列出了没有提交的活动事务
2. XID的结构
eg
SQL> ---session1
SQL> drop table test_undo1 purge;
Table dropped.
SQL> create table test_undo1 as select * from dba_objects;
Table created.
SQL> set linesize 200
SQL> select rowid,
dbms_rowid.rowid_object(rowid) object_id,
dbms_rowid.rowid_relative_fno(rowid) file_id,
dbms_rowid.rowid_block_number(rowid) block_id,
dbms_rowid.rowid_row_number(rowid) num,
rowidtochar(rowid)
from test_undo1
where object_id = 1051; 2 3 4 5 6 7 8
ROWID OBJECT_ID FILE_ID BLOCK_ID NUM ROWIDTOCHAR(ROWID)
------------------ ---------- ---------- ---------- ---------- ------------------
AAApgPAALAAACkWAAC 169999 11 10518 2 AAApgPAALAAACkWAAC
SQL> select sid from v$mystat where rownum<2;
SID
----------
1625
SQL> delete from test_undo1 where object_id=1051;
1 row deleted.
SQL> SQL>
产生一个事务:
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(START_SCN,'999999999999') from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC TO_CHAR(START
---------- ---------- ---------- ---------- ---------- ---------- -------------
1 17 173289 303 2 29 57693468601
其中XINUSN 表示回滚段号Undo Segement number
XIDSLOT 事务槽号
XIDSQN 事务编号
UBABLK UBA 块号
-----dump 数据块
SQL> alter system dump datafile 11 block 10518;
System altered.
Block header dump: 0x02c02916
Object id on Block? Y
seg/obj: 0x2980f csc: 0x0d.6ecc779f itc: 3 flg: - typ: 1 - DATA
fsl: 0 fnx: 0x0 ver: 0x01
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0xffff.000.00000000 0x00000000.0000.00 C--- 0 scn 0x000d.6ecc779f
0x02 0x0001.011.0002a4e9 0x0080012f.4243.1d ---- 1 fsc 0x004e.00000000
0x03 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
data_block_dump,data header at 0x14055274
===============
tsiz: 0x1f88
hsiz: 0xba
pbl: 0x14055274
bdba: 0x02c02916
76543210
flag=--------
ntab=1
nrow=84
frre=-1
fsbo=0xba
fseo=0x3eb
avsp=0x331
tosp=0x381
0xe:pti[0] nrow=84 offs=0
0x12:pri[0] offs=0x1f35
0x14:pri[1] offs=0x1eea
0x16:pri[2] offs=0x1e9a
0x18:pri[3] offs=0x1e50
其中Lck 表示锁住的行
从上面我的数据块dump,我们可以发现,该事务所对应的ITL是0x02 .(因为lck是1,flag是---,表示未提交)
Itl Xid Uba Flag Lck Scn/Fsc
0x02 0x0001.011.0002a4e9 0x0080012f.4243.1d ---- 1 fsc 0x004e.00000000
下面开始分解Xid:
0x0001:回滚段编号,转换后为1,说明该事务使用的是第1号回滚段
011:事务槽编号(slot),转换后为17,说明对应undo segment header的transaction table记录中的index是17
0002a4e9:173289序号(同一个事务可能具有多个SCN,实际上每一个DML操作都有一个SCN)实际上对应undo segment header中transaction table的wrap#值
SQL> select xidusn,xidslot,xidsqn,ubablk,ubafil,ubarec,to_char(START_SCN,'9999999999999') from v$transaction;
XIDUSN XIDSLOT XIDSQN UBABLK UBAFIL UBAREC TO_CHAR(START_
---------- ---------- ---------- ---------- ---------- ---------- --------------
1 17 173289 303 2 29 5769346860
SQL> select name from v$rollname where usn=1;
NAME
------------------------------
_SYSSMU1$
-------undo segment header dump (_SYSSMU8$)
dump 回滚段:
SQL> alter system dump undo header '_SYSSMU1$';
System altered.
********************************************************************************
Undo Segment: _SYSSMU1$ (1)
********************************************************************************
Extent Control Header
-----------------------------------------------------------------
Extent Header:: spare1: 0 spare2: 0 #extents: 4 #blocks: 271
last map 0x00000000 #maps: 0 offset: 4080
Highwater:: 0x00800131 ext#: 2 blk#: 40 ext size: 128
#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
-----------------------------------------------------------------
0x0080000a length: 7
0x00801611 length: 8
0x00800109 length: 128
0x00800789 length: 128
Retention Table
-----------------------------------------------------------
Extent Number:0 Commit Time: 1408576610
Extent Number:1 Commit Time: 1408576610
Extent Number:2 Commit Time: 0
Extent Number:3 Commit Time: 1408576610
TRN CTL:: seq: 0x4243 chd: 0x002a ctl: 0x0028 inc: 0x00000000 nfb: 0x0002
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x0080012f.4243.1d scn: 0x000d.6ecc61a1
Version: 0x01
FREE BLOCK POOL::
uba: 0x00000000.4243.1c ext: 0x2 spc: 0x1166
uba: 0x00800130.4243.02 ext: 0x2 spc: 0x1f06
uba: 0x00800131.4243.16 ext: 0x2 spc: 0xfb6
uba: 0x00000000.423d.01 ext: 0x2 spc: 0x1f88
uba: 0x00000000.2919.01 ext: 0x2 spc: 0x1f88
TRN TBL::
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x0a 9 0x00 0x2a4f0 0x0008 0x000d.6ecc69cc 0x0080011f 0x0000.000.00000000 0x00000001 0x00000000 1408591580
0x0b 9 0x00 0x2a4e6 0x002f 0x000d.6ecc72a2 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1408597235
0x0c 9 0x00 0x2a4dd 0x000e 0x000d.6ecc6d05 0x0080011f 0x0000.000.00000000 0x00000001 0x00000000 1408593634
0x0d 9 0x00 0x2a4ea 0x0022 0x000d.6ecc6384 0x0080011d 0x0000.000.00000000 0x00000001 0x00000000 1408587630
0x0e 9 0x00 0x2a4ee 0x0017 0x000d.6ecc6e3b 0x0080011e 0x0000.000.00000000 0x00000001 0x00000000 1408594533
0x0f 9 0x00 0x2a4e6 0x000a 0x000d.6ecc694a 0x0080011f 0x0000.000.00000000 0x00000001 0x00000000 1408591232
0x10 9 0x00 0x2a4e1 0x0029 0x000d.6ecc728f 0x00000000 0x0000.000.00000000 0x00000000 0x00000000 1408597235
0x11 10 0x80 0x2a4e9 0x0002 0x000d.6ecc77b9 0x0080012f 0x0000.000.00000000 0x00000001 0x00000000 0
0x12 9 0x00 0x2a4f2 0x0028 0x000d.6ecc773f 0x0080012f 0x0000.000.00000000 0x00000001 0x00000000 1408600205
0x13 9 0x00 0x2a4eb 0x002c 0x000d.6ecc68e0 0x0080011f 0x0000.000.00000000 0x00000001 0x00000000 1408591232
0x14 9 0x00 0x2a4eb 0x001c 0x000d.6ecc6360 0x0080011d 0x0000.000.00000000 0x00000001 0x00000000 1408587630
0x15 9 0x00 0x2a4ea 0x000d 0x000d.6ecc6370 0x0080011d 0x0000.000.00000000 0x00000001 0x00000000 1408587630
0x16 9 0x00 0x2a4e9 0x0002 0x000d.6ecc7406 0x0080012f 0x0000.000.00000000 0x00000001 0x00000000 1408597835
0x17 9 0x00 0x2a44f 0x0019 0x000d.6ecc6e4b 0x0080011e 0x0000.000.00000000 0x00000001 0x00000000 1408594533
0x18 9 0x00 0x2a4f0 0x001d 0x000d.6ecc6548 0x0080011f 0x0000.000.00000000 0x00000001 0x00000000 1408588831
state 9标示inactive
10 标示active
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x11 10 0x80 0x2a4e9 0x0002 0x000d.6ecc77b9 0x0080012f 0x0000.000.00000000 0x00000001 0x00000000 0
这一行中的 dba地址 标示的是undo block
0x11 :17 :事务槽编号(slot),转换后为17,说明对应undo segment header中的transaction table记录中的index是17
我们可以看到transaction table中状态处于active的slot是index 0x11 . 跟我们前面的内容刚好对上.
大家注意看slot 0x11的wrap#值,是不是刚好对上前面的xid中的第3部分内容 ?
cflags 表示什么? 表示事务的状态,0x80表示未commit
uel 表示什么? 表示事务当前所处于的extent区域(0x0002 ,转换为10进制后为2)
scn 表示什么? 该事务开始的scn,等于v$transaction.start_scn。
SQL> select * from v$rollstat where usn=1;
USN LATCH EXTENTS RSSIZE WRITES XACTS GETS
---------- ---------- ---------- ---------- ---------- ---------- ----------
WAITS OPTSIZE HWMSIZE SHRINKS WRAPS EXTENDS AVESHRINK
---------- ---------- ---------- ---------- ---------- ---------- ----------
AVEACTIVE STATUS CUREXT CURBLK
---------- --------------- ---------- ----------
1 1 4 2220032 140460 1 354
0 2220032 0 0 0 0
0 ONLINE 2 40
可以可以发现,uel值正好等于v$rollstat.curext值(Current extent)= 2,0x0002表示第2个extent.
SQL> select owner,segment_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='_SYSSMU1$';
OWNER SEGMENT_NAME EXTENT_ID FILE_ID BLOCK_ID BLOCKS
---------- ------------ ---------- ---------- ---------- ----------
SYS _SYSSMU1$ 0 2 9 8
SYS _SYSSMU1$ 1 2 5649 8
SYS _SYSSMU1$ 2 2 265 128
SYS _SYSSMU1$ 3 2 1929 128
BLOCK_ID :extent的起始块
blocks extent的块数
和如下对应
0x0080000a length: 7
0x00801611 length: 8
0x00800109 length: 128
0x00800789 length: 128
查看创建UNOD的sql:
CREATE UNDO TABLESPACE "UNDOTBS1" DATAFILE
'/u03/oradata/jhoa/undotbs01.dbf' SIZE 26214400
AUTOEXTEND ON NEXT 5242880 MAXSIZE 32767M
BLOCKSIZE 8192
EXTENT MANAGEMENT LOCAL AUTOALLOCATE
ALTER DATABASE DATAFILE
'/u03/oradata/jhoa/undotbs01.dbf' RESIZE 2537553920
SQL> select dbms_utility.data_block_address_file(TO_NUMBER('800109', 'XXXXXXXX')) file_id,
dbms_utility.data_block_address_block(TO_NUMBER('800109',
'XXXXXXXX')) block_id
from dual;
2 3 4
FILE_ID BLOCK_ID
---------- ----------
2 265
SQL> select 265 + 128 from dual;
265+128
----------
393
undo block 303正好落在265 --- 393
这里的地址就是UBA:
TRN CTL:: seq: 0x4243 chd: 0x002a ctl: 0x0028 inc: 0x00000000 nfb: 0x0002
mgc: 0x8201 xts: 0x0068 flg: 0x0001 opt: 2147483646 (0x7ffffffe)
uba: 0x0080012f.4243.1d scn: 0x000d.6ecc61a1
10 标示active
index state cflags wrap# uel scn dba parent-xid nub stmt_num cmt
------------------------------------------------------------------------------------------------
0x11 10 0x80 0x2a4e9 0x0002 0x000d.6ecc77b9 0x0080012f 0x0000.000.00000000 0x00000001 0x00000000 0
SQL> select dbms_utility.data_block_address_file(TO_NUMBER('080012f', 'XXXXXXXX')) file_id,
dbms_utility.data_block_address_block(TO_NUMBER('080012f',
'XXXXXXXX')) block_id
from dual;
2 3 4
FILE_ID BLOCK_ID
---------- ----------
2 303
转换uba的地址后得到的块号是303