查看: 4175|回复: 4

[笔记] 从底向上第二篇--了解行迁移

[复制链接]
论坛徽章:
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-3-26 21:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
请先移步从底向上了解DML操作http://www.itpub.net/thread-1283537-1-1.html

从底向上第一篇--了解DML操作
从底向上第二篇--了解行迁移
从底向上第三篇--了解index的compress
从底向上第四篇--了解行链接
从底向上第五篇--了解表的压缩属性
从底向上第六篇--compress for oltp真正压缩的阈值触发条件
从底向上第七篇--超255列表的存储
从底向上第八篇--伪造基于ASSM表空间的数据块


在上一篇从底向上了解DML操作的帖子里,描述了insert、update、delete操作,在block里是如何进行的。
这篇来介绍行迁移。

上篇的最后,block里剩下3条记录,id分别为C50B(1000000000),C103(2),C104(3)
前两个的text列长度都已经是4000了,如果我们修改最后一个列的长度为4000,那么3*4000肯定大于8192的block大小,这时会发生什么呢?


SQL> update tt set text=lpad('a',4000) where id=3;

已更新 1 行。

提交完成。
SQL> alter system dump datafile 1 block 134578;

系统已更改。

7702290 00000000 00000000 00000000 0202002C  [............,...]
77022A0 A0FE0BC5 2020200F 20202020 20202020  [.....           ]
77022B0 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
7703240 20202020 00012061 B30D4200 64630000  [    a ...B....cd]
7703250 2C676665 C1020200 0FA0FE03 20202020  [efg,........    ]
7703260 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
77041F0 20202020 20202020 61202020 1F760604  [           a..v.]
Block header dump:  0x00420db2
Object id on Block? Y
seg/obj: 0xbf1e  csc: 0x00.e1f74  itc: 2  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0002.001.000001c1  0x008010ad.011f.3f  --U-    1  fsc 0x0005.000e1f76
0x02   0x0003.01b.000001c1  0x00800eeb.00a6.2d  C---    0  scn 0x0000.000e1ca0

data_block_dump,data header at 0x770225c
===============
tsiz: 0x1fa0
hsiz: 0x18
pbl: 0x0770225c
bdba: 0x00420db2
     76543210
flag=--------
ntab=1
nrow=3
frre=-1
fsbo=0x18
fseo=0x40
avsp=0x28
tosp=0x2d
0xe:pti[0]        nrow=3        offs=0
0x12:pri[0]        offs=0x40
0x14:pri[1]        offs=0xff7
0x16:pri[2]        offs=0xfe9
block_row_dump:
tab 0, row 0, @0x40
tl: 4009 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c5 0b
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
tab 0, row 1, @0xff7
tl: 4009 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
tab 0, row 2, @0xfe9
tl: 9 fb: --H----- lb: 0x1  cc: 0
nrid:  0x00420db3.0

end_of_block_dump


还记得H是什么意思么?
H        Head of row piece
呵呵,发生行迁移了,这里只是存了这行记录的头信息,那各位又要问了,真正的数据哪去了呢?答案就在nrid:0x00420db3.0,您又问了,这个乱起八糟的东西又是啥捏?那我们就要看一下当前的block bdba了,0x00420db2,0x00420db3=0x00420db2+1,也就是下一个块里。那.0又是什么意思呢?我们先放一下,先看看下一个块的内容。


SQL> conn / as sysdba
已连接。
SQL> alter system dump datafile 1 block 134579;

系统已更改。

4E53180 A0FE04C1 2020200F 20202020 20202020  [.....           ]
4E53190 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
4E54120 20202020 02013C61 1A02C102 64636261  [    a<......abcd]
4E54130 68676665 6C6B6A69 706F6E6D 74737271  [efghijklmnopqrst]
4E54140 78777675 013C7A79 02C10202 6362611A  [uvwxyz<......abc]
4E54150 67666564 6B6A6968 6F6E6D6C 73727170  [defghijklmnopqrs]
4E54160 77767574 3C7A7978 C1020201 62611A02  [tuvwxyz<......ab]
4E54170 66656463 6A696867 6E6D6C6B 7271706F  [cdefghijklmnopqr]
4E54180 76757473 7A797877 0202013C 611A02C1  [stuvwxyz<......a]
4E54190 65646362 69686766 6D6C6B6A 71706F6E  [bcdefghijklmnopq]
4E541A0 75747372 79787776 02013C7A 1A02C102  [rstuvwxyz<......]
4E541B0 64636261 68676665 6C6B6A69 706F6E6D  [abcdefghijklmnop]
4E541C0 74737271 78777675 002C7A79 02C10202  [qrstuvwxyz,.....]
4E541D0 63626103 0202002C 610302C1 002C6362  [.abc,......abc,.]
4E541E0 02C10202 63626103 0202002C 610302C1  [.....abc,......a]
4E541F0 002C6362 02C10202 63626103 1F760602  [bc,......abc..v.]
Block header dump:  0x00420db3
Object id on Block? Y
seg/obj: 0xbf1e  csc: 0x00.e1f74  itc: 3  flg: O  typ: 1 - DATA
     fsl: 0  fnx: 0x0 ver: 0x01

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x000a.002.0000014e  0x00801017.008c.2f  C---    0  scn 0x0000.000e1c59
0x02   0x0002.001.000001c1  0x008010ad.011f.3e  --U-    1  fsc 0x0000.000e1f76
0x03   0x0000.000.00000000  0x00000000.0000.00  C---    0  scn 0x0000.00000000

data_block_dump,data header at 0x4e52274
===============
tsiz: 0x1f88
hsiz: 0x1c
pbl: 0x04e52274
bdba: 0x00420db3
     76543210
flag=--------
ntab=1
nrow=5
frre=1
fsbo=0x1c
fseo=0xf02
avsp=0xfbd
tosp=0xfbd
0xe:pti[0]        nrow=5        offs=0
0x12:pri[0]        offs=0xf02
0x14:pri[1]        sfll=2
0x16:pri[2]        sfll=3
0x18:pri[3]        sfll=4
0x1a:pri[4]        sfll=-1
block_row_dump:
tab 0, row 0, @0xf02
tl: 4015 fb: ----FL-- lb: 0x2  cc: 2
hrid: 0x00420db2.2
col  0: [ 2]  c1 04
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61

end_of_block_dump


先看看,这个块的bdba: 0x00420db3,OK,看来是找对地方了。对照看一下这条记录的标志----FL--,没有H标志。再看看,还有一个hrid: 0x00420db2.2,OK,这下搞清楚.代表什么意思了,其实,就是bdba.row#,根据这个,就可以向下或向上链接了。

SQL> alter system dump datafile 1 block 134579;

系统已更改。

SQL> analyze table tt compute statistics;

表已分析。

SQL> select t.chain_cnt
  2    from user_tables t
  3   where t.table_name='TT';

CHAIN_CNT
----------
         1


统计信息也显示这个表有一个行产生了链接。
尝试解决一下:


SQL> alter table tt move tablespace users;

表已更改。

SQL> select t.header_file,t.header_block from dba_segments t
  2   where t.segment_name='TT';

HEADER_FILE HEADER_BLOCK
----------- ------------
4        11

SQL> conn / as sysdba
已连接。
SQL> alter system dump datafile 4 block 12;

系统已更改。

SQL> alter system dump datafile 4 block 13;

系统已更改。

SQL> alter system dump datafile 4 block 14;

系统已更改。


Block 12:
4E53250 2C000000 C5020200 0FA0FE0B 20202020  [...,........    ]
4E53260 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602  [           a..."]
Block header dump:  0x0100000c
Object id on Block? Y
seg/obj: 0xbf1f  csc: 0x00.e22ca  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000009 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.007.000001c5  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000c
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c5 0b                                                        -- 1000000000
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump

Block 13:
4E53250 2C000000 C1020200 0FA0FE03 20202020  [...,........    ]
4E53260 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602  [           a..."]
Block header dump:  0x0100000d
Object id on Block? Y
seg/obj: 0xbf1f  csc: 0x00.e22ca  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000009 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.007.000001c5  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000d
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 03                                                        -- 2
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump

Block 14:
4E53250 2C000000 C1020200 0FA0FE04 20202020  [...,........    ]
4E53260 20202020 20202020 20202020 20202020  [                ]
        Repeat 248 times
4E541F0 20202020 20202020 61202020 22CB0602  [           a..."]
Block header dump:  0x0100000e
Object id on Block? Y
seg/obj: 0xbf1f  csc: 0x00.e22ca  itc: 3  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000009 ver: 0x01 opc: 0
     inc: 0  exflg: 0

Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0008.007.000001c5  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
0x03   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000

data_block_dump,data header at 0x4e5227c
===============
tsiz: 0x1f80
hsiz: 0x14
pbl: 0x04e5227c
bdba: 0x0100000e
     76543210
flag=--------
ntab=1
nrow=1
frre=-1
fsbo=0x14
fseo=0xfd7
avsp=0xfc3
tosp=0xfc3
0xe:pti[0]        nrow=1        offs=0
0x12:pri[0]        offs=0xfd7
block_row_dump:
tab 0, row 0, @0xfd7
tl: 4009 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 2]  c1 04                                                -- 3
col  1: [4000]
20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20

20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 20 61
end_of_block_dump

move tablespace 后,数据空间重新进行了分配。没有了行迁移的情况。

SQL> analyze table tt compute statistics;

表已分析。

SQL> select t.chain_cnt
  2    from user_tables t
  3   where t.table_name='TT';

CHAIN_CNT
----------
         0


[ 本帖最后由 sundog315 于 2010-6-25 14:50 编辑 ]
招聘 : 数据库管理员
论坛徽章:
20
祖国60周年纪念徽章
日期:2009-10-09 08:28:00数据库板块每日发贴之星
日期:2011-02-20 01:01:01ITPUB季度 技术新星
日期:2011-04-02 10:31:09ITPUB十周年纪念徽章
日期:2011-11-01 16:24:042012新春纪念徽章
日期:2012-01-04 11:54:26玉石琵琶
日期:2012-02-21 15:04:38最佳人气徽章
日期:2012-03-13 17:39:18ITPUB 11周年纪念徽章
日期:2012-10-09 18:09:192013年新春福章
日期:2013-02-25 14:51:242011新春纪念徽章
日期:2011-02-18 11:43:33
2#
发表于 2010-3-28 21:17 | 只看该作者
顶下。。。。。  行迁移 行链接 讨论的比较多了 以前

使用道具 举报

回复
论坛徽章:
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-3-28 21:56 | 只看该作者
呵呵,从底层一步一步的看到怎么迁移,和看文档的感觉是不一样的。

使用道具 举报

回复
论坛徽章:
0
4#
发表于 2010-4-13 11:28 | 只看该作者
分析的很好,但是有些地方对我们这样的新手来说还是有点晦涩难懂。

使用道具 举报

回复
论坛徽章:
10
生肖徽章2007版:蛇
日期:2008-10-16 15:37:262011新春纪念徽章
日期:2011-02-18 11:43:35祖国60周年纪念徽章
日期:2009-10-09 08:28:00生肖徽章2007版:蛇
日期:2009-04-23 10:20:26生肖徽章2007版:鸡
日期:2009-03-10 21:16:44数据库板块每日发贴之星
日期:2009-01-08 01:01:022009新春纪念徽章
日期:2009-01-04 14:52:28生肖徽章2007版:蛇
日期:2008-10-27 16:26:10奥运会纪念徽章:举重
日期:2008-10-24 13:16:31一汽
日期:2013-10-28 20:43:00
5#
发表于 2010-4-15 22:07 | 只看该作者
其实关注这些太细节的东西没多大用处,
除非你想写一个像楼总那样的AUL

在直接读数据文件的时候 除了行迁移 还有行连接 还有删除行 这些都会在DUMP的逻辑BLOCK中体现
但是真正体现到二进制的时候就麻烦多了

使用道具 举报

回复

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

本版积分规则 发表回复

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