楼主: grassbell

[精华] 偷窥Data block 的物理结构

[复制链接]
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
21#
发表于 2004-7-28 16:43 | 只看该作者
ITL count(itc): 占用1byte,ITL 的slot数量。
那意思是不是指一个数据块最多只能够保存255个tranctions.

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
22#
 楼主| 发表于 2004-7-28 16:50 | 只看该作者
最初由 超级野人 发布
[B]ITL count(itc): 占用1byte,ITL 的slot数量。
那意思是不是指一个数据块最多只能够保存255个tranctions. [/B]


不确定,但是如果

select max_trans from user_tables

你会发现默认的max_trans 都是255。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
23#
发表于 2004-7-29 08:04 | 只看该作者
很奇怪,我看到的文档(http://download-west.oracle.com/doc...lock.htm#2601)






中竟然没有介绍到transaction slots,是不是有问题。

使用道具 举报

回复
论坛徽章:
1
会员2006贡献徽章
日期:2006-04-17 13:46:34
24#
发表于 2004-7-29 15:22 | 只看该作者
再问一下,transaction slots的作用是什么,我觉得,如果一个transaction对该数据块中的row进行了更改或增加,删除,应该直接在该row中置上该transaction的sid,因为其它的transaction都是直接寻找到每一个row的数据的,他们要知道该row是被哪一个transaction所控制,而transaction slots是针对整个数据块的,怎么能够反映每一row的具体锁定信息。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
25#
 楼主| 发表于 2004-7-29 15:40 | 只看该作者
最初由 超级野人 发布
[B]再问一下,transaction slots的作用是什么,我觉得,如果一个transaction对该数据块中的row进行了更改或增加,删除,应该直接在该row中置上该transaction的sid,因为其它的transaction都是直接寻找到每一个row的数据的,他们要知道该row是被哪一个transaction所控制,而transaction slots是针对整个数据块的,怎么能够反映每一row的具体锁定信息。 [/B]


是在每个row上标记了transaction 的Itl。如果你通过3个不同的session 对同一个block操作,并且都未提交时:

---------------session 1----------------
SQL> insert into t values(1);

1 row created.

---------------session 2----------------
SQL> insert into t values(1);

1 row created.

---------------session 3----------------
SQL> insert into t values(3);

1 row created.

Start dump data blocks tsn: 8 file#: 3 minblk 842 maxblk 842
buffer tsn: 8 rdba: 0x00c0034a (3/842)
scn: 0x0000.006d3763 seq: 0x01 flg: 0x00 tail: 0x37630601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump:  0x00c0034a
Object id on Block? Y
seg/obj: 0x80a9  csc: 0x00.6d36e9  itc: 3  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.00b.00001001  0x00800026.011b.02  ----    1  fsc 0x0000.00000000
0x02   0x0006.01d.00001047  0x008028c2.00c8.3b  ----    1  fsc 0x0000.00000000
0x03   0x000a.028.0000104c  0x008001bc.00d5.02  ----    1  fsc 0x0000.00000000

Flags为 ---- = transaction is active, or committed pending cleanout

data_block_dump,data header at 0x4791074
===============
tsiz: 0x1f88
hsiz: 0x18
pbl: 0x04791074
bdba: 0x00c0034a
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f70
avsp=0x1f55
tosp=0x1f55
0xeti[0]        nrow=3        offs=0
0x12ri[0]        offs=0x1f7c
0x14ri[1]        offs=0x1f76
0x16ri[2]        offs=0x1f70
block_row_dump:
tab 0, row 0, @0x1f7c
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1--->lb: 0x1  就是 Itl  
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f76
tl: 6 fb: --H-FL-- lb: 0x2  cc: 1--->lb: 0x2  就是 Itl  
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f70
tl: 6 fb: --H-FL-- lb: 0x3  cc: 1--->lb: 0x3  就是 Itl  
col  0: [ 2]  c1 04
end_of_block_dump
End dump data blocks tsn: 8 file#: 3 minblk 842 maxblk 842

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
26#
 楼主| 发表于 2004-7-29 15:46 | 只看该作者
3个session都提交后:

Start dump data blocks tsn: 8 file#: 3 minblk 842 maxblk 842
buffer tsn: 8 rdba: 0x00c0034a (3/842)
scn: 0x0000.006d3817 seq: 0x01 flg: 0x02 tail: 0x38170601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data
Block header dump:  0x00c0034a
Object id on Block? Y
seg/obj: 0x80a9  csc: 0x00.6d36e9  itc: 3  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0001.00b.00001001  0x00800026.011b.02  --U-    1  fsc 0x0000.006d3817
0x02   0x0006.01d.00001047  0x008028c2.00c8.3b  --U-    1  fsc 0x0000.006d3802
0x03   0x000a.028.0000104c  0x008001bc.00d5.02  --U-    1  fsc 0x0000.006d3800

flag --U- 表示事务已经提交

data_block_dump,data header at 0x4791074
===============
tsiz: 0x1f88
hsiz: 0x18
pbl: 0x04791074
bdba: 0x00c0034a
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x1f70
avsp=0x1f55
tosp=0x1f55
0xeti[0]        nrow=3        offs=0
0x12ri[0]        offs=0x1f7c
0x14ri[1]        offs=0x1f76
0x16ri[2]        offs=0x1f70
block_row_dump:
tab 0, row 0, @0x1f7c
tl: 6 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 2]  c1 02
tab 0, row 1, @0x1f76
tl: 6 fb: --H-FL-- lb: 0x2  cc: 1
col  0: [ 2]  c1 03
tab 0, row 2, @0x1f70
tl: 6 fb: --H-FL-- lb: 0x3  cc: 1
col  0: [ 2]  c1 04
end_of_block_dump
End dump data blocks tsn: 8 file#: 3 minblk 842 maxblk 842

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
27#
 楼主| 发表于 2004-7-30 13:44 | 只看该作者
*** wrote:

1. 在4.结合trace文件中的信息,详细介绍:
1) The Cache Header and Tail:
buffer tsn: 8 rdba: 0x00c0007a (3/122)
scn: 0x0000.0068d716 seq: 0x01 flg: 0x02 tail: 0xd7160601
frmt: 0x02 chkval: 0x0000 type: 0x06=trans data

Database block address: 占用4 bytes,Tablespace relative database

--这句话在说明什么?是指 rdba: 0x00c0007a 吗?
--若是 如何从 rdba: 0x00c0007a中,找到这3?

这段话的末尾(请看原文),还有一句:Unused: 占用4bytes,用来前后兼容。
但我看不到哪段是Unused 的?

答(此处有误,请看下面ZALBB的纠正):
Database block address编辑的时候手误了,分成两行写了,作了修改。
00c0007a 转化成2进制是
0000 1100 0111 1010
file#=3 , block_id=122,转化成2进制是
0000 0011 0101 0111
颠倒一下顺序就是了。

Unused的4bytes是没有体现出来。


2、Object number(seg/obj): 占用4bytes,指在OBJ$中记录的segment 的 object number(0x806d=32877)

这里看到的是2个字节,是你错,还是我错?

答:是4个字节,它可能只显示有效的位。记得有的例子只显示了1个字节。

3、若真是2个字节,则
SQL> select power(2,16) from dual;

POWER(2,16)
-----------
      65536
也就数据库只能存储这么多对象,
那若超过该值,怎么记录?

答:同3

4、Cleanout SCN(csc): 占用6bytes,最后一次 full cleanout 的scn
怎么理解“full cleanout 的”?

答:关于cleanout 的概念,我还不确定。正在看。。。

5、ITL 是干什么用的?
答:ITL 是Interested transaction list ,是一个array,包括了很多Interested transaction entry (ITE)。每个entry是一个transaction,贴字后面有关于transaction的例子。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
28#
 楼主| 发表于 2004-7-30 14:03 | 只看该作者
*** wrote:

6、
Flag: 占用2bytes。O表示这个block在freelist 上。否则flag为"-"
我这个版本(9205)的为 E

Block header dump: 0x01800027
Object id on Block? Y
seg/obj: 0x8293 csc: 0x00.fa24aa7 itc: 2 flg: E typ: 1 - DATA

此外,你举例的是 fsl: 0 fnx: 0x0 ver: 0x01
而我的为
brn: 0 bdba: 0x1800009 ver: 0x01
inc: 0 exflg: 0
有些不一样,可能是ORACLE一致在改进吧。

建议,对各段的解释(如:block address(RDBA)),最好先直接
引用原文的名字,之后再加解释,这样,我们好找是指什么东西。
象这个 Database block address ,还有 UNUSED,我就不知道
你想解释什么?

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


谢谢你的建议!

我会根据大家的反馈,随时补充和完善这个帖子。

但是大家也不能完全依赖这个帖子,他最多是个参考说明。像biti 说的:

如果要份说明,几乎没有意义,DSI 说的很清楚,可看了有意义吗?我几乎没看,只有经过自己思考琢磨再去寻找,反复如此,得来才是自己的。

使用道具 举报

回复
论坛徽章:
314
行业板块每日发贴之星
日期:2012-07-12 18:47:29双黄蛋
日期:2011-08-12 17:31:04咸鸭蛋
日期:2011-08-18 15:13:51迷宫蛋
日期:2011-08-18 16:58:25紫蛋头
日期:2011-08-31 10:57:28ITPUB十周年纪念徽章
日期:2011-09-27 16:30:47蜘蛛蛋
日期:2011-10-20 15:51:25迷宫蛋
日期:2011-10-29 11:12:59ITPUB十周年纪念徽章
日期:2011-11-01 16:19:41鲜花蛋
日期:2011-11-09 20:33:30
29#
发表于 2004-7-30 14:12 | 只看该作者

我还是看不明白这一段

<font color="blue">答:<br />
Database block address编辑的时候手误了,分成两行写了,作了修改。<br />
00c0007a 转化成2进制是<br />
0000 1100 0111 1010<br />
file#=3 , block_id=122,转化成2进制是<br />
0000 0011 0101 0111<br />
颠倒一下顺序就是了。<br />
<br />

原文是 00c0007a,按照一个字节两位来表示,可转换为
0000 0000 1100 0000 0000 0000 0111 1010
然后怎么转换?

这个值 0101 0111 算起来,只有 64+16+4+2+1 = 87对,
反到是 0111 1010 算起来,= 64+32+16+8+2 = 122 。
也就是说,未颠倒之前才是正确的值,颠倒之后就不对了。

使用道具 举报

回复
招聘 : 数据库管理员
论坛徽章:
21
授权会员
日期:2005-10-30 17:05:332012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:362012新春纪念徽章
日期:2012-02-13 15:11:36马上有车
日期:2014-02-19 11:55:14马上有房
日期:2014-02-19 11:55:14马上有钱
日期:2014-02-19 11:55:14马上有对象
日期:2014-02-19 11:55:142012新春纪念徽章
日期:2012-02-13 15:11:36
30#
 楼主| 发表于 2004-7-30 14:23 | 只看该作者
恩,是我错了,粗心。。。昨晚没睡好呀

我一开始转换成2进制就做错了。这样block_id=122是好理解的。
难道file#=3需要颠倒顺序?就不得而知了。

使用道具 举报

回复

您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

TOP技术积分榜 社区积分榜 徽章 团队 统计 知识索引树 积分竞拍 文本模式 帮助
  ITPUB首页 | ITPUB论坛 | 数据库技术 | 企业信息化 | 开发技术 | 微软技术 | 软件工程与项目管理 | IBM技术园地 | 行业纵向讨论 | IT招聘 | IT文档
  ChinaUnix | ChinaUnix博客 | ChinaUnix论坛
CopyRight 1999-2011 itpub.net All Right Reserved. 北京盛拓优讯信息技术有限公司版权所有 联系我们 未成年人举报专区 
京ICP备16024965号-8  北京市公安局海淀分局网监中心备案编号:11010802021510 广播电视节目制作经营许可证:编号(京)字第1149号
  
快速回复 返回顶部 返回列表