加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

oracle_各种数据块介绍

(2013-01-29 09:49:53)
标签:

oracle

it

1.块

http://s9/mw690/8317516bx7ba434c31538&690


BBED> map
 File: /u01/app/oracle/oradata/sunner/sun01.dbf (5)
 Block: 20                         Dba:0x01400014
------------------------------------------------------------
 KTB Data Block (Table/Cluster)
 struct kcbh, 20 bytes                      @0      --block header 信息
 struct ktbbh, 72 bytes                     @20     --事务信息
 struct kdbh, 14 bytes                      @100    --对应尾区部分
 struct kdbt[1], 4 bytes                    @114    --table directory *kdbt[0]指针显示值
 sb2 kdbr[3]                                @118    --row directory *kdbr[0]指针值显示状态flg
 ub1 freespace[8037]                        @124    --free space
 ub1 rowdata[27]                            @8161   --row data (采用倒序排列,第一行在最下面)
 ub4 tailchk                                @8188   --tail check






2.数据块



SQL> CREATE TABLE t_m(a number,b number);
Table created.
SQL> INSERT INTO t_m VALUES (1,1);
1 row created.
SQL> insert into T_M VALUES (2,2);
1 row created.
SQL> INSERT INTO t_m VALUES(3,3);
1 row created.
SQL> commit;
Commit complete.


查询数据库位置
SQL> SELECT rowid,dbms_rowid.rowid_block_number(rowid) FROM t_m;
ROWID              DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID)
------------------ ------------------------------------
AAAMitAAFAAAAAUAAA                                   20
AAAMitAAFAAAAAUAAB                                   20
AAAMitAAFAAAAAUAAC                                   20


SQL> alter system dump datafile 5 block 20;
System altered.


查看trace文件内容
Start dump data blocks tsn: 6 file#: 5 minblk 20 maxblk 20
头信息
buffer tsn: 6 rdba: 0x01400014 (5/20) 
tsn(表空间编码)
rdba(相关数据库块地址,对应rowid的rfile# ,block#,使用dbms_utility包进行转化)

scn: 0x0000.40051a60 seq: 0x05 flg: 0x06 tail: 0x1a600605
scn(数据块SCN
前两个字节0000 SCN Wrap,后4个字节SCN BASE bbed-offset:0x8)
seq(数据块状态bbed-offset:0x14 用来改变坏块状态)
flg(
  
  1 = virgin block
  2 = last change to the block was for a cleanout operation
  4 = checksum value is set
  8 = temporary data
  6 的时候是 2,4 的组合
bbed-offset:0x15)
trail(用来检查一致性的值
tail check的组成:SCN Base的低2个字节+type+seq。即tail: 0x1a600605 =1a60+06+05)
frmt: 0x02 chkval: 0x3295 type: 0x06=trans data
frmt(表示块格式, 01表示oracle 7,02表示oracle 8+)
chkval(快检查值,db_block_checksum=TRUE,数据块读入buffer和写回数据文件之前都要做检查计算,如果计算值与数据块中记录的计算值不匹配就会标记该块是坏块.)
type(块类型,
Header Block Types 
ID  Type 
01  Undo segment header 
02  Undo data block 
03  Save undo header 
04  Save undo data block 
05  Data segment header (temp, index, data and so on) 
06  KTB managed data block (with ITL) 
07  Temp table data block (no ITL) 
08  Sort Key 
09  Sort Run 
10  Segment free list block 
11  Data file header 

空闲区,数据区
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x0CF4A400 to 0x0CF4C400
CF4A400 0000A206 01400014 40051A60 06050000  [......@.`..@....]
CF4A410 00003295 00000001 0000C8AD 40051A52  [.2..........R..@]
CF4A420 00000000 00320002 01400011 0005001D  [......2...@.....]
CF4A430 0000000F 01C000DB 003B000F 00002003  [..........;.. ..]
CF4A440 40051A60 00000000 00000000 00000000  [`..@............]
CF4A450 00000000 00000000 00000000 00000000  [................]
CF4A460 00000000 00030100 0018FFFF 1F651F7D  [............}.e.]
CF4A470 00001F65 1F8F0003 1F7D1F86 00000000  [e.........}.....]
CF4A480 00000000 00000000 00000000 00000000  [................]
        Repeat 501 times
CF4C3E0 02012C00 0204C102 012C04C1 03C10202  [.,........,.....]
CF4C3F0 2C03C102 C1020201 02C10202 1A600605  [...,..........`.]
Block header dump:  0x01400014
 Object id on Block? Y   是否属于该对象
 seg/obj: 0xc8ad  csc: 0x00.40051a52  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1400011 ver: 0x01 opc: 0
     inc: 0  exflg: 0
这一部分应该写的是关于块所属对象的信息
its interested transaction  slot
seg/obj(段对象object_id)
csc(即cleanout scn,最后一次对该数据块进行clean out的SCN)
itc(itl count,itl的数量,下面列表中有两条这里就是2)
flg(E ASSM管理, 0 表示freelist管理)
typ( 1 表示数据块,2表示索引块)
bdba(段头块,也就是对象的第一个块地址)
ver(对象version)
opc,inc(对象operation/insert count)
事务列表区
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x001d.005.0000000f  0x01c000db.000f.3b  --U-    fsc 0x0000.40051a60
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    fsc 0x0000.00000000
data_block_dump,data header at 0xcf4a464
Itl interest transactoin list
Xid 
事务id,在回滚段事务表中有一条记录和这个事务对应。Xid组成:Undo Segment Number +Transaction
Table Slot Number+ Wrap

Uba 回滚段地址,该事务对应的回滚段地址。Uba组成:回滚块地址(undo文件号和数据块号)+回滚序列号+
回滚记录号

Flag
---- = transaction is active, or committed pending cleanout
C--- = transaction has been committed and locks cleaned out
-B-- = this undo record contains the undo for this ITL entry
--U- = transaction committed (maybe long ago); SCN is an upper bound
---T = transaction was still active at block cleanout SCN

lck 表示这个事务影响的行数。
Scn/Fsc :Commit SCN 或者快速提交(Fast Commit Fsc)的SCN
(
对于Oracle来说,对于一个事务,可以是快速提交、也可以是延迟提交,目的都是为了提高提交的速度。提交以后,oracle需要对ITL事务槽、每一 行的锁定标记进行清除。如果是快速提交,那么在提交的时候,会将事务表和每一个数据块的ITL槽进行清除。但是锁定标记可能没有清除,等下次用到的时候再 进行清除。如果是延迟提交,那么在提交的时候,只是将事务表进行清除,并没有对ITL事务槽进行清除,每一行的锁定标记也没有清除。因此C和U的情况特别 多。块清除的过程并不包括每个行的锁定标记的清除,主要指的是ITL的清除。
注意:
1、事务槽中首先记录的是Xid和Uba,只有在提交以后,当对这个数据块进行cleanout的时候,才会更新Flag和Scn。因此Oracle总是以事务表中对这个数据块的Scn以及Flag为准。
2、一个事务开始以后,在一个数据块上得到一个事务槽,那么在这个事务提交以前,这个事务槽会一直占用,直到这个事务提交释放这个事务槽。
3、只有在已经提交以后,这个itl事务槽中的scn才会有数值。
4、事务是否已经提交、事务对应的SCN,这些信息都是以回滚段事务表中的为主,事务槽中的不准确
5、事务槽中的事务id和uba地址是准确的
6、事务槽1中的事务id和回滚段中的事务id肯定不是一样的,不同回滚段中的事务id也一定不一样。
)
尾区
===============
tsiz: 0x1f98
hsiz: 0x18
pbl: 0x0cf4a464
bdba: 0x01400014
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f7d
avsp=0x1f65
tosp=0x1f65
0xe:pti[0]      nrow=3  offs=0
0x12:pri[0]     offs=0x1f8f
0x14:pri[1]     offs=0x1f86
0x16:pri[2]     offs=0x1f7d
tsiz (Total data area size (数据区的大小))
hsiz (data header size(数据块头大小))
pbl (ptr to buffer holding the block(指向这个数据块在内存中映像的指针)
bdba (rdba)
ntab (number of tables (>1 is a cluster))
nrow (number of rows)
frre (first free row index entry,-1=you have to add onw(没有创建索引))
fsbo (free space begin offset(空闲空间起始位置))
fseo (free space end offset(空闲空间结束位置))
avsp (available space in the block(可用空间))
tosp (total available space when all txs commit)
nrow=3  offs=0 (该块有3条记录)
offs=0x1f8f (第一条记录的偏移位置)
block_row_dump:
tab 0, row 0, @0x1f8f
tl: 9 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 02
col  1: [ 2]  c1 02
tab 0, row 1, @0x1f86
tl: 9 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 03
col  1: [ 2]  c1 03
tab 0, row 2, @0x1f7d
tl: 9 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 2]  c1 04
col  1: [ 2]  c1 04
tl: 9 lb: 0x1  (0x1说明事务在该数据行上的锁没有清除,并执行01号事务槽,此前进行了INSERT,说明提交方式是快速提交或延迟提交)
fb: --H-FL-- (
K = Cluster Key (Flags may change meaning if this is set to show HASH cluster)
C = Cluster table member
H = Head piece of row
D = Deleted row
F = First data piece
L = Last data piece
P = First column continues from previous piece
N = Last column continues in next piece
)
当删除数据时显示HDFL,并不是真正的删除而是标志为删除。

如果一个row 没有被删除,那么它就具有上面的3个属性,即Flag 表示为:--H-FL--. 这里的字母分别代表属性的首字母。其对应的值:32 + 8 + 4 =44 or 0x2c.

如果一个row 被delete了,那么row flag 就会更新,bitmask 里的deleted 被设置为16. 此时row flag 为: 32 + 16 + 8 + 4 = 60 or 0x3c.

BBED实验

cc: 2(number of columns in this row piece)

end_of_block_dump
End dump data blocks tsn: 6 file#: 5 minblk 20 maxblk 20



回滚段块
SQL> SELECT * FROM t_m;
        ID NAME
---------- --------------------
         1 sun
         2 DBA
SQL> alter system flush buffer_cache;
System altered.
SQL> update t_m set name='DBAS' WHERE id=2;
1 row updated.



SQL> select xidusn,xidslot,xidsqn,UBAFIL, UBABLK, UBASQN, UBAREC from v$transaction;

    XIDUSN    XIDSLOT     XIDSQN     UBAFIL     UBABLK     UBASQN     UBAREC
---------- ---------- ---------- ---------- ---------- ---------- ----------
        28                 21                434         23         17
这里XID*对应数据块中的XID,UBA*对应数据块中的UBA(回滚段文件号,数据块号,回滚序列号,回滚记录号)

DUMP数据块
SQL> alter system dump datafile 5 block 28;
System altered.
SQL> oradebug setmypid
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/admin/sunner/udump/sunner_ora_3060.trc
SQL> oradebug close_trace
Statement processed.

事务槽部分
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x001c.007.00000015  0x01c001b2.0017.11  ----    fsc 0x0000.00000000
0x02   0x0020.02c.00000011  0x01c00128.0013.03  --U-    fsc 0x0008.400535fa

Lck(表示锁定的行数)

这里显示的是十六进制:
SELECT to_number('1c','xxxxxxxx') FROM dual;
SELECT to_number('007','xxxxxxxx') FROM dual;
SELECT to_number('00000015','xxxxxxxx') FROM dual;

查看回滚段块
SQL> SELECT usn,XACTS FROM v$rollstat ;

       USN      XACTS
---------- ----------
                 0
        23          0
        24          0
        25          0
        26          0
        27          0
        28          1
        29          0
        30          0
        31          0
        32          0
在回滚段28号的XACTS显示1,说明有活动事务。

alter system dump undo header '_SYSSMU28$';

   index state cflags       scn            dba        stmt_num    cmt
  -------------------------------------------------------------------------
   0x00      0x00  0x0000.4005e36a  0x01c001b1    0x00000000  1359468061
   0x01      0x00  0x0000.4005e3d0  0x01c001b2    0x00000000  1359468062
   0x02      0x00  0x0000.4005e39c  0x01c001b1    0x00000000  1359468061
   0x03      0x00  0x0000.4005e3fe  0x01c001b2    0x00000000  1359468064
   0x04      0x00  0x0000.4005e3ba  0x01c001b2    0x00000000  1359468062
   0x05      0x00  0x0000.4005e3e7  0x01c001b2    0x00000000  1359468063
   0x06      0x00  0x0000.4005e382  0x01c001b1    0x00000000  1359468061
   0x07   10    0x80  0x0000.4005e42a  0x01c001b2    0x00000000  0
   0x08      0x00  0x0000.4005df7c  0x01c0019b    0x00000000  1359468047


index代表前面的回滚段序列号
state为10代表存在活动事务
dba对应UBA中的文件号与块地址(
dbms_utility.data_block_address_file(to_number('dba','xxxxxxxxxx'))/data_block_address_block)


alter system dump datafile 7 block 434;

UNDO BLK:
xid: 0x001c.007.00000015  seq: 0x17  cnt: 0x11  irb: 0x11  icl: 0x0   flg: 0x0000
 Rec Offset      Rec Offset      Rec Offset      Rec Offset      Rec Offset
---------------------------------------------------------------------------
0x01 0x1e5c     0x02 0x1e08     0x03 0x1d20     0x04 0x1c7c     0x05 0x1c0c
0x06 0x1bac     0x07 0x1b28     0x08 0x1abc     0x09 0x1a50     0x0a 0x18c4
0x0b 0x1794     0x0c 0x1740     0x0d 0x1654     0x0e 0x15b0     0x0f 0x1540
0x10 0x14e0     0x11 0x1444
*-----------------------------
* Rec #0x1  slt: 0x04  objn: 4(0x00000004)  objd: 2  tblspc: 0(0x00000000)
    Layer:  11 (Row)   opc: 1   rci 0x00
Undo type:  Regular undo   Last buffer split:  No
Temp Object:  No
Tablespace Undo:  No
rdba: 0x01c001b1
*-----------------------------

uba: 0x01c001b2.0017.0e ctl max scn: 0x0000.4005df46 prv tx scn: 0x0000.4005df65
txn start scn: scn: 0x0000.4005dc8f logon user: 55
 prev brb: 29360538 prev bcl: 0
KDO undo record:
KTB Redo
op: 0x04  ver: 0x01
op: L  itl: xid:  0x001a.004.00000012 uba: 0x01c00201.0015.04
                      flg: C---    lkc:     scn: 0x0000.4005355d
KDO Op code: URP row dependencies Disabled
  xtype: XA flags: 0x00000000  bdba: 0x0140001c  hdba: 0x0140001b
itli: 1  ispac: 0  maxfr: 4858
tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 10
ncol: 2 nnew: 1 size: -1
col  1: [ 3]  44 42 41
End dump data blocks tsn: 7 file#: 7 minblk 434 maxblk 434

seq (0x17,与UBA中相吻合)
Rec (0x1 记录数)
slt(
0x04 第四事务槽)
Layer ( 11(Row)即层次,这是一次对记录的更新)
rci (如果是0x13表示是undo chain(同一个事务的多次修改,根据chain连接关联))
Temp Object(No 不是临时对象)











0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有