暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

Oracle 数据块中的数据列不等于 “alter table” 操作后的表列

askTom 2017-03-23
265

问题描述

嗨,汤姆,

我发现 'alter系统转储数据文件x块x' 中的数据列不等于表的列。
1) 首先,我创建一个表 'test6',其中包含2列 'c1' 和 'c2',并在其中插入2行:
创建表test6 (c1 varchar(10),c2 varchar(10));
插入到test6值 ('zzz','xxxxxx') 中;
插入到test6值 ('zzz','xxxxxx') 中;

2) 然后,我更改表以添加新列:
alter table test6 add(c3 varchar(10));
现在,该表有3列。

3) 第三,我转储存储这些行的块:
ALTER系统转储数据文件5块172;
但是,在跟踪文件中,数据块只有2列:
->
Start dump data blocks tsn: 5 file#:5 minblk 172 maxblk 172
Block dump from cache:
Dump of buffer cache at level 4 for tsn=5 rdba=20971692
BH (0x783e2cd8) file#: 5 rdba: 0x014000ac (5/172) class: 1 ba: 0x78152000
  set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 1 pwc: 0,19
  dbwrid: 0 obj: 66395 objn: 66395 tsn: 5 afn: 5 hint: f
  hash: [0x8d51b310,0x8d51b310] lru: [0x783e2f00,0x783e2c90]
  ckptq: [NULL] fileq: [NULL] objq: [0x783e2f28,0x783e2cb8] objaq: [0x783e2f38,0x783e2cc8]
  st: XCURRENT md: NULL fpin: 'kdswh01: kdstgr' tch: 2
  flags: only_sequential_access
  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [65535]
Block dump from disk:
buffer tsn: 5 rdba: 0x014000ac (5/172)
scn: 0x0000.000dce43 seq: 0x01 flg: 0x06 tail: 0xce430601
frmt: 0x02 chkval: 0x603d type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007FBD4BA1CA00 to 0x00007FBD4BA1EA00
7FBD4BA1CA00 0000A206 014000AC 000DCE43 06010000  [......@.C.......]
7FBD4BA1CA10 0000603D 00000001 0001035B 000DCE40  [=`......[...@...]
7FBD4BA1CA20 00000000 00320002 014000A8 00110002  [......2...@.....]
7FBD4BA1CA30 00000231 00C002B4 00250048 00002002  [1.......H.%.. ..]
7FBD4BA1CA40 000DCE43 00000000 00000000 00000000  [C...............]
7FBD4BA1CA50 00000000 00000000 00000000 00000000  [................]
7FBD4BA1CA60 00000000 00020100 0016FFFF 1F661F7C  [............|.f.]
7FBD4BA1CA70 00001F66 1F8A0002 00001F7C 00000000  [f.......|.......]
7FBD4BA1CA80 00000000 00000000 00000000 00000000  [................]
        Repeat 501 times
7FBD4BA1E9E0 0302012C 067A7A7A 78787878 012C7878  [,...zzz.xxxxxx,.]
7FBD4BA1E9F0 7A7A0302 7878067A 78787878 CE430601  [..zzz.xxxxxx..C.]
Block header dump:  0x014000ac
 Object id on Block? Y
 seg/obj: 0x1035b  csc: 0x00.dce40  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x14000a8 ver: 0x01 opc: 0
     inc: 0  exflg: 0

 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0002.011.00000231  0x00c002b4.0048.25  --U-    2  fsc 0x0000.000dce43
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x014000ac
data_block_dump,data header at 0x7fbd4ba1ca64
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x7fbd4ba1ca64
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f7c
avsp=0x1f66
tosp=0x1f66
0xe:pti[0]      nrow=2  offs=0
0x12:pri[0]     offs=0x1f8a
0x14:pri[1]     offs=0x1f7c
block_row_dump:
tab 0, row 0, @0x1f8a
tl: 14 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 3]  7a 7a 7a
col  1: [ 6]  78 78 78 78 78 78
tab 0, row 1, @0x1f7c
tl: 14 fb: --H-FL-- lb: 0x1  cc: 2
col  0: [ 3]  7a 7a 7a
col  1: [ 6]  78 78 78 78 78 78
end_of_block_dump
End dump data blocks tsn: 5 file#: 5 minblk 172 maxblk 172
复制


所以,我的问题是:
1) 为什么在 “alter table” 操作之后该块只有2列?为什么会这样?
2) 数据库如何基于2列的数据块返回3列的查询结果?
3) 是否有任何地方可以记录表版本,以满足从数据块的二进制数据到query-result的ASCII数据的正确转换?

专家解答

答案-因为如果不需要,为什么要工作?

当我们做 “alter table T add NEW_COL int” 时,如果T有10亿行,我们回去用 “嘿... 你有一个新列”,那么它将需要永远。我们不需要 * 这样做,因为块内容和表定义足以解决它。

如果我的表有三列,而我的块有2列数据... 我知道第三列为null。在更高版本中,我们甚至一些更聪明的东西,如果新列具有默认值,我们 “知道” 这一点,并且可以在运行时 “滑动” 到从块读取的数据中,而不是更新所有现有块。

对不起,我不明白你在问什么 (3)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论