问题描述
嗨,汤姆,
我发现 '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列:
->
所以,我的问题是:
1) 为什么在 “alter table” 操作之后该块只有2列?为什么会这样?
2) 数据库如何基于2列的数据块返回3列的查询结果?
3) 是否有任何地方可以记录表版本,以满足从数据块的二进制数据到query-result的ASCII数据的正确转换?
我发现 '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)
当我们做 “alter table T add NEW_COL int” 时,如果T有10亿行,我们回去用 “嘿... 你有一个新列”,那么它将需要永远。我们不需要 * 这样做,因为块内容和表定义足以解决它。
如果我的表有三列,而我的块有2列数据... 我知道第三列为null。在更高版本中,我们甚至一些更聪明的东西,如果新列具有默认值,我们 “知道” 这一点,并且可以在运行时 “滑动” 到从块读取的数据中,而不是更新所有现有块。
对不起,我不明白你在问什么 (3)
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。
评论
相关阅读
【专家有话说第五期】在不同年龄段,DBA应该怎样规划自己的职业发展?
墨天轮编辑部
1219次阅读
2025-03-13 11:40:53
Oracle RAC ASM 磁盘组满了,无法扩容怎么在线处理?
Lucifer三思而后行
739次阅读
2025-03-17 11:33:53
Oracle+Deepseek+Dify 实现数据库数据实时分析
bicewow
651次阅读
2025-03-06 09:41:49
【ORACLE】ORACLE19C在19.13版本前的一个严重BUG-24761824
DarkAthena
542次阅读
2025-03-04 14:33:31
Oracle避坑指南|同名表导出难题:如何精准排除指定用户下的表?
szrsu
502次阅读
2025-03-05 00:42:34
2月“墨力原创作者计划”获奖名单公布
墨天轮编辑部
438次阅读
2025-03-13 14:38:19
Ogg23ai高手必看-MySQL Innodb Cluster跟oracle的亲密接触
曹海峰
437次阅读
2025-03-04 21:56:13
【ORACLE】char类型和sql优化器发生的“错误”反应
DarkAthena
398次阅读
2025-03-04 23:05:01
什么,oracle 主机用户被删了?原来是虚惊一场!
Lucifer三思而后行
394次阅读
2025-03-03 21:12:09
Oracle 如何修改 db_unique_name?强迫症福音!
Lucifer三思而后行
325次阅读
2025-03-12 21:27:56