查看: 3321|回复: 5

[笔记] 从底向上第四篇--了解行链接

[复制链接]
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
跳转到指定楼层
1#
发表于 2010-4-2 21:37 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从底向上第一篇--了解DML操作
从底向上第二篇--了解行迁移
从底向上第三篇--了解index的compress
从底向上第四篇--了解行链接
从底向上第五篇--了解表的压缩属性
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第七篇--超255列表的存储
从底向上第八篇--伪造基于ASSM表空间的数据块

在从底向上系列的第二篇,从底向上了解行迁移时我们看到了行迁移的产生,以及oracle是如何在block里处理行迁移。

行迁移、行链接是两个概念,但是很多人可能都不太了解两者的区别与相同的地方。我们这里就加以引申,来看看行链接的情况。


SQL> create table t (a varchar2(4000),b varchar2(4000),c varchar2(4000));  --这里我们建一个3个列的表

表已创建。
SQL> insert into t values ('a',null,null);   --只放入第一列,后两列数据空

已创建 1 行。
SQL> select t.header_file,t.header_block from dba_segments t
  2   where t.segment_name='T';

HEADER_FILE HEADER_BLOCK
----------- ------------
          1        58408

SQL> alter system dump datafile 1 block 58409;


20F4BFF0 00000000 2C000000 61010101 170C0605  [.......,...a....]
Block header dump:  0x0040e429
Object id on Block? Y
seg/obj: 0xeb0e  csc: 0x00.f16f9  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.009.0000028d  0x00c0566c.0050.0d  --U-    1  fsc 0x0000.000f170c
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x0040e429
data_block_dump,data header at 0x20f4a05c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x20f4a05c
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1f9b
tl: 5 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 1]  61
end_of_block_dump

上面是很简单的DUMP文件。
现在我们更新后两列的内容:


SQL> update t set b=lpad('b',4000,'b'),c=lpad('c',4000,'c');

已更新 1 行。

提交完成。


21861050 61010000 620FA0FE 62626262 62626262  [...a...bbbbbbbbb]
21861060 62626262 62626262 62626262 62626262  [bbbbbbbbbbbbbbbb]
        Repeat 248 times
21861FF0 62626262 2C626262 61010102 172A0604  [bbbbbbb,...a..*.]
Block header dump:  0x0040e429
Object id on Block? Y
seg/obj: 0xeb0e  csc: 0x00.f1729  itc: 2  flg: -  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.009.0000028d  0x00c0566c.0050.0d  C---    0  scn 0x0000.000f170c
0x02   0x0008.01d.0000027f  0x00c00c16.0064.0a  --U-    1  fsc 0x0000.000f172a
bdba: 0x0040e429
data_block_dump,data header at 0x2186005c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x2186005c
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfed
avsp=0xfde
tosp=0xfde
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0xfed
block_row_dump:
tab 0, row 0, @0xfed
tl: 4014 fb: --H-F--- lb: 0x2  cc: 2
nrid:  0x0040e42a.0
col  0: [ 1]  61
col  1: [4000]
62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62

62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62 62
end_of_block_dump

我们看到,这个block里包含了列0及列1,行标志位是Head和First,少了我们常见的Last,表示还没有读到行的结尾,并且,还有一个nrid,有关于nrid,可以参考行迁移篇。
看看下一个block


SQL> alter system dump datafile 1 block 58410;

系统已更改。


D3E5050 0107C304 0104013E 0FA0FE01 63636363  [....>.......cccc]
D3E5060 63636363 63636363 63636363 63636363  [cccccccccccccccc]
        Repeat 248 times
D3E5FF0 63636363 63636363 63636363 172A0605  [cccccccccccc..*.]
Block header dump:  0x0040e42a
Object id on Block? Y
seg/obj: 0xeb0e  csc: 0x00.f170c  itc: 3  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.01d.0000027f  0x00c00c16.0064.09  --U-    1  fsc 0x0000.000f172a
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.00000000
bdba: 0x0040e42a
data_block_dump,data header at 0xd3e4074
===============
tsiz: 0x1f88
hsiz: 0x14
pbl: 0x0d3e4074
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfe2
avsp=0xfce
tosp=0xfce
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0xfe2
block_row_dump:
tab 0, row 0, @0xfe2
tl: 4006 fb: -----L-- lb: 0x1  cc: 1
col  0: [4000]
63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63

63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63 63
end_of_block_dump

ok,这里是第三列的内容,标志位为L。表示到此,行内容结束。
这里,就可以看出,行迁移是整行迁移到另外的block,而原来block中只存放nrid,指向新的block,行链接是将一行分为两部分(或更多),分别存放在不同的block中,并且,从行的开始(Head)都存放一个指向下一部分内容的nrid,直到行的结尾(Last)。


[ 本帖最后由 sundog315 于 2010-6-25 14:51 编辑 ]
论坛徽章:
0
2#
发表于 2010-4-18 17:23 | 只看该作者
alter system dump datafile para1 block para2;
对于这个的用法不太理解,para1是想看的块文件数吗?para2是从那一个块文件开始查看吗?
比如:alter system dump datafile 1 block 58409,意思就是从58409这个块开始查看,共查看一个块的内容吗[意思就是查不前块里的内容],这个只是我的理解,不知是否正确?
另外,我在机上( Oracle9i+winXP)按照楼主提供的思路跑了一下代码:
SQL> create table t (a varchar2(4000),b varchar2(4000),c varchar2(4000));

Table created

SQL>
SQL> insert into t values ('a',null,null);

1 row inserted
SQL> delete from t ;

1 row deleted

SQL>
SQL> select t.header_file,t.header_block
  2   from dba_segments t where t.segment_name = 'T'
  3  /

HEADER_FILE HEADER_BLOCK
----------- ------------
          1        51729

SQL> alter system dump datafile 1 block 51730;

System altered

为何看不到块51730里面的内容,以上两个问题请楼主帮忙指点,多谢了!

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
3#
 楼主| 发表于 2010-4-19 20:38 | 只看该作者

回复 #2 jquery 的帖子

alter system dump datafile x block y;
这个命令是只dump datafile x的y块内容,仅一个块。
可以用
alter system dump datafile x block min y1 block max y2;
dump y1至y2块的内容。

至于看不到dump的内容,不太清楚你的意思,是在dump文件中看不到么?

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2010-4-19 22:54 | 只看该作者
谢谢楼主的解答;
我的第二个问题就是不知道如何查看到某个文件下块的具体内容,就像你贴出的:

20F4BFF0 00000000 2C000000 61010101 170C0605  [.......,...a....]
Block header dump:  0x0040e429
Object id on Block? Y
seg/obj: 0xeb0e  csc: 0x00.f16f9  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0006.009.0000028d  0x00c0566c.0050.0d  --U-    1  fsc 0x0000.000f170c
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x0040e429
data_block_dump,data header at 0x20f4a05c
===============
tsiz: 0x1fa0
hsiz: 0x14
pbl: 0x20f4a05c
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0x1f9b
avsp=0x1f83
tosp=0x1f83
0xe: pti[0]        nrow=1        offs=0
0x12: pri[0]        offs=0x1f9b
block_row_dump:
tab 0, row 0, @0x1f9b
tl: 5 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [ 1]  61
end_of_block_dump

我如何才能看到上述红色标记的这些内容呢?
我运行 :
SQL> alter system dump datafile 1 block 51730;

System altered
就一个 System altered 结果,并没看到这个块就具体存储的内容,谢谢!

使用道具 举报

回复
论坛徽章:
86
2015中国数据库技术大会纪念徽章
日期:2015-04-24 16:04:24马上有车
日期:2014-02-19 11:55:14马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11优秀写手
日期:2013-12-18 09:29:11日产
日期:2013-10-17 08:44:39马自达
日期:2013-08-26 16:28:022013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-23 16:55:51马上有房
日期:2014-02-19 11:55:14
5#
 楼主| 发表于 2010-4-20 18:54 | 只看该作者
在user_dump_dest文件夹里会生成trc文件。

SQL> show parameter user_dump_dest

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
user_dump_dest                       string      d:\oracle\app\diag\rdbms\test\test\trace

使用道具 举报

回复
论坛徽章:
47
蒙奇·D·路飞
日期:2017-03-27 08:04:23马上有车
日期:2014-02-18 16:41:112014年新春福章
日期:2014-02-18 16:41:11一汽
日期:2013-09-01 20:46:27复活蛋
日期:2013-03-13 07:55:232013年新春福章
日期:2013-02-25 14:51:24ITPUB 11周年纪念徽章
日期:2012-10-09 18:03:322012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:202012新春纪念徽章
日期:2012-02-13 15:13:20
6#
发表于 2010-4-20 23:15 | 只看该作者
> col  0: [ 1]  61

You have one column for this row and its data is one character with ASCII code 61, which is character 'a'.

Yong Huang

使用道具 举报

回复

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

本版积分规则 发表回复

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