3.oracle的dump理解三 DUMP块

欢迎转载,转载请标明出处:http://blog.csdn.net/notbaron/article/details/51228489

上篇看了BH (Buffer Header和Block Header),都是头,没看到躯干,这下我们来一起看下躯干。

1     创建一个定制块

先创建一个用户:

SQL> create user toad identified by toad;

SQL> grant dba to toad;

创建一个表空间如下:

SQL> create tablespace tp1 datafile'F:\toaddbdatafile\toaddb\toad01.dbf' size 10M;

SQL> alter user toad default tablespace tp1;

SQL>conn toad/toad

创建表

SQL> create table t1(id int,name varchar2(100));

SQL> insert into t1 values(1,'AAAAA');

SQL> commit;

SQL> alter system checkpoint;

查看块位置:

SQL>select  id,name,dbms_rowid.rowid_relative_fno(rowid)file#,dbms_rowid.rowid_block_number(rowid) block# from t1;

       ID   NAME         FILE#    BLOCK#

        1   AAAAA         8        135

2     DUMP 块

SQL> alter system dump datafile 8 block 135;

找到TRACE 文件,打开。路径$ORACLE_BASE/diag/rdbms/$ORACLE_SID/$ORACLE_SID/trace

2.1     DUMP内容

Oracle Database 12c Enterprise EditionRelease 12.1.0.2.0 - 64bit Production

With the Partitioning, OLAP, AdvancedAnalytics and Real Application Testing options

Windows NT Version V6.1 Service Pack 1

CPU                 : 4 - type 8664, 4 PhysicalCores

Process Affinity    : 0x0x0000000000000000

Instance name: toaddb

Redo thread mounted by this instance: 1

Oracle process number: 24

Windows thread id: 52780, image: ORACLE.EXE(SHAD)

*** TRACE FILE RECREATED AFTER BEINGREMOVED ***

Start dump data blocks tsn: 6 file#:8minblk 135 maxblk 135

Block dump from cache:

Dump of buffer cache at level 4 for pdb=0tsn=6 rdba=33554567

BH (0x7ff1e7fb818) file#: 8 rdba:0x02000087 (8/135) class: 1 ba: 0x7ff1e7c2000

 set: 12 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0

 dbwrid: 0 obj: 93378 objn: 93378 tsn: [0/6] afn: 8 hint: f

 hash: [0x7ff2c5f8ff8,0x7ff2c5f8ff8] lru: [0x7ff1e7fba40,0x7ff1e7fb7c0]

 obj-flags: object_ckpt_list

 ckptq: [0x7ff2c3c80a8,0x7ff2c3c80a8] fileq:[0x7ff2c3c4f88,0x7ff2c3c4f88]

 objq: [0x7ff03743e08,0x7ff03743e08] objaq: [0x7ff1e7fba78,0x7ff03743de8]

  st:XCURRENT md: NULL fpin: 'ktspbwh2: ktspfmdb' fscn: 0x0.2561d1 tch: 2

 flags: buffer_dirty block_written_once

 LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0x0.2564a5] HSUB: [1]

Block dump from disk:(数据块头

buffer tsn: 6 rdba: 0x02000087 (8/135)

scn: 0x0.2561d1 seq: 0x03 flg: 0x04 tail:0x61d10603

0x01 (新建块)0x2(数据块延迟清洗推进scnseq) 0X04(设置校验和)0x08(临时块)

frmt: 0x02 chkval: 0x15b0 type: 0x06=transdata

Hex dump of block: st=0, typ_found=1

Dump of memory from 0x000000000B997C00 to0x000000000B999C00

数据块具体内容

00B997C00 0000A206 02000087 002561D104030000  [.........a%.....]

00B997C10 000015B0 00000001 00016CC2002561D1  [.........l...a%.]

00B997C20 00000000 00320002 02000080001D000A  [......2.........]

00B997C30 0000061E 0140011B 000400C400000001  [......@.........]

00B997C40 00000000 00000000 0000000000000000  [................]

        Repeat 1 times

00B997C60 00000000 00010100 0014FFFF1F781F8C  [..............x.]

00B997C70 00001F78 1F8C0001 0000000000000000  [x...............]

00B997C80 00000000 00000000 0000000000000000  [................]

       Repeat 502 times

00B999BF0 0202012C 410502C1 4141414161D10603  [,......AAAAA...a]

Block header dump:  0x02000087

 Object id on Block? Y

 seg/obj: 0x16cc2  csc: 0x00.2561d1(块清除时的SCN)  itc: 2 (ITL槽数) flg: E  typ: 1 - DATA

    brn: 0  bdba: 0x2000080 ver: 0x01opc: 0

    inc: 0  exflg: 0

 (ITL描述)Lck:锁住了几行数据,对应有几个行锁

Scn=SCN of commited TX;Fsc=Free space credit(bytes)

 Itl          Xid                  Uba         Flag Lck        Scn/Fsc

0x01  0x000a.01d.0000061e 0x0140011b.00c4.04  ----    1 fsc 0x0000.00000000

0x02  0x0000.000.00000000 0x00000000.0000.00  ----    0 fsc 0x0000.00000000

用户数据

bdba: 0x02000087

data_block_dump,data header at 0xb997c64

===============

tsiz: 0x1f98

hsiz: 0x14

pbl: 0x0b997c64

    76543210

flag=--------

ntab=1

nrow=1

frre=-1

fsbo=0x14

fseo=0x1f8c

avsp=0x1f78

tosp=0x1f78

0xe:pti[0]       nrow=1   offs=0

0x12:pri[0]     offs=0x1f8c

block_row_dump:

tab 0, row 0, @0x1f8c  第一个表,第一行,定义了标在行索中的起始插槽号

tl: 12 fb: --H-FL-- lb: 0x1  cc: 2 lb表示lockbytelck对应,cc表示列数,

col 0: [ 2]  c1 02 第一行第一个字段长度和值

col 1: [ 5]  41 41 41 41 41 第一行第二个字段长度和值

end_of_block_dump

End dump data blocks tsn: 6 file#: 8 minblk135 maxblk 135

2.2     DUMP块实验2

创建表的时侯有个延迟段参数的控制,默认不分配EXTNETS空间,如下参数所示:

SQL> show parameters deferred_segment_creation

NAME                                 TYPE        VALUE

----------------------------------------------- ------

deferred_segment_creation            boolean     TRUE

创建表同时分配EXTENTS

SQL> conn toad/toad;

SQL> create table t20(id int,name varchar2(10))segment creation immediate;

查看分区的区号,文件号,块号

SQL> select extent_id,file_id,block_id fromdba_extents where segment_name='T20';

 EXTENT_ID   FILE_ID   BLOCK_ID

---------- ---------- ----------

        0          8        136

DUMP该块

SQL> alter system dump datafile 8 block 136;

打开TRACE文件如下:

发现如下:

scn: 0x0.0 seq: 0x01 flg: 0x05 tail: 0x00000001

frmt: 0x02 chkval: 0xa790 type:0x00=unknown

0X05是0X01和0X04的集合,0X01表示新建的块,0X04表示设置校验。chkval: 0xa790就是校验和。

2.3     DUMP块实验3

往t1中插入一行如下:

SQL> insert into t1 values(2,'BBBBB');

SQL> commit;

SQL> alter system flush buffer_cache;

SQL> selectid,name,dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_

number(rowid) from t1 where id=2;

       ID----------NAME--------

DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID)DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)

------------------------------------ ------------------------------------

        2

BBBBB

                                   8                                  135

然后DUMP块

SQL> alter system dump datafile 8 block 135;

打开TRACE文件后,查看:

块头

buffer tsn: 6 rdba: 0x02000087 (8/135)

scn: 0x0.258ae2 seq: 0x02 flg: 0x02 tail: 0x8ae20602

frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

查看ITL如下:

seg/obj: 0x16cc2 csc: 0x00.2561d1  itc: 2  flg: E typ: 1 - DATA

     brn:0  bdba: 0x2000080 ver: 0x01 opc: 0

     inc:0  exflg: 0

 

 Itl           Xid                  Uba         Flag Lck        Scn/Fsc

0x01  0x000a.01d.0000061e 0x0140011b.00c4.04  --U-    1 fsc 0x0000.002564a5

0x02  0x0005.014.000008d1 0x01408a4a.0124.28  --U-    1 fsc 0x0000.00258ae2

数据部分如下:

bdba: 0x02000087

data_block_dump,data header at 0xb922e64

===============

tsiz: 0x1f98

hsiz: 0x16

pbl: 0x0b922e64

    76543210

flag=--------

ntab=1

nrow=2

frre=-1

fsbo=0x16

fseo=0x1f80

avsp=0x1f6a

tosp=0x1f6a

0xe:pti[0]       nrow=2   offs=0

0x12:pri[0]     offs=0x1f8c

0x14:pri[1]     offs=0x1f80

block_row_dump:

tab 0, row 0, @0x1f8c

tl: 12 fb: --H-FL-- lb: 0x1  cc: 2 lb 0x1对应ITL1号槽

col 0: [ 2]  c1 02

col 1: [ 5]  41 41 41 41 41

tab 0, row 1, @0x1f80

tl: 12 fb: --H-FL-- lb: 0x2  cc: 2 lb 0x2对应ITL1号槽

col 0: [ 2]  c1 03

col 1: [ 5]  42 42 42 42 42

end_of_block_dump

事务槽都是U,表示快速提交了,但是没有清除行锁。

再插入一行,后DUMP块查看

SQL> insert into t1 values (3,'DDDDD');

SQL> commit;

SQL> alter system flush buffer_cache;

SQL> alter system dump datafile 8 block 135;

查看ITL如下:

seg/obj: 0x16cc2  csc: 0x00.258ff3  itc: 2 flg: E  typ: 1 - DATA

    brn: 0  bdba: 0x2000080 ver: 0x01opc: 0

    inc: 0  exflg: 0

 Itl          Xid                  Uba         Flag Lck        Scn/Fsc

0x01  0x0006.011.00000953 0x0140d643.00f0.19  --U-    1 fsc 0x0000.00258ff8

0x02  0x0005.014.000008d1  0x01408a4a.0124.28  C---   0  scn 0x0000.00258ae2

一个清除了行锁。当事务槽上的提交标志都是快速提交(U),再有事务进来,其他ITL插槽的快速提交U变成正常提交C,并且清除行锁。同时CSC csc: 0x00.258ff3也推进了。Csc是数据本块中最小的COMMIT SCN。

2.4     DUMP 块实验4

更新一行,并不提交,让事务获得,然后去观察ITL槽

SQL> update t1 set name='EEEEE' where id=3;

SQL> alter system flush buffer_cache;

SQL> alter system dump datafile 8 block 135;

查看TRACE文件如下:

seg/obj: 0x16cc2  csc: 0x00.2591eb  itc: 2 flg: E  typ: 1 - DATA

    brn: 0  bdba: 0x2000080 ver: 0x01opc: 0

    inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag Lck        Scn/Fsc

0x01  0x0006.011.00000953 0x0140d643.00f0.19  C---    0 scn 0x0000.00258ff8

0x02  0x000a.017.00000623 0x01406e59.00c5.10  ----   1  fsc 0x0000.00000000

对象号是:seg/obj:0x16cc2,十进制就是93378

SQL> select object_id,data_object_id fromdba_objects where object_name='T1' and  owner='TOAD';

 OBJECT_ID DATA_OBJECT_ID

---------- --------------

    93378          93378

和查找得到的一致。

来看下XID,Xid是由XIDUSN(Undo segmentnumber)、XIDSLOT(Slot number)+XIDSQN(Sequence number)三部分组成的。

先查看事务如下:

SQL> selectxid,xidusn,xidslot,xidsqn,ubafil,ubablk,ubasqn,ubarec,status fromv$transaction;

XID                  XIDUSN    XIDSLOT    XIDSQN     UBAFIL     UBABLK

---------------- ---------- -------------------- ---------- ----------

   UBASQN     UBAREC STATUS

---------- ---------- ----------------

0A00170023060000         10         23       1571          5     28249

      197         16 ACTIVE

其中:

   XIDUSN=10    (10号回滚段)

   XIDSLOT=23  (在10号回滚段的事务表的第23行)

   XIDSQN=4420 (事务表第23行被覆盖了1571次)

和0x000a.017.00000623转换成10进制一致。

此外0x01406e59.00c5.10由四个字节组成的32位,

前面10位是 0x05=5

剩下的22位是:0x06e59=28249

然后是C5,10分别是197和16.

UBAFIL     UBABLK    UBASQN    UBAREC STATUS无缝对接。

查看当前会话SID:

SQL> select sid from v$mystat where rownum=1;

查看锁:发现有个TM锁的ID1是93378就是我们的那个块。

SQL> select * from v$lock where sid=6;

ADDR             KADDR                   SID TY        ID1        ID2     LMODE

---------------- -------------------------- -- ---------- ---------- ----------

  REQUEST      CTIME      BLOCK    CON_ID

---------- ---------- ---------- ----------

000007FF2AB1CF78 000007FF2AB1CFF8          6 TX     655383       1571          6

        0        905          0          0

000007FF2D51F628 000007FF2D51F6A0          6 AE        133          0          4

        0       3467          0          0

000000000B99D570 000000000B99D5D8          6 TM     93378          0          3

        0        905          0          0