结论
1,采用alter system dump datafile block对比分析事务提交前后的数据块各层结构的变化2,以此变化到BBED进行映射,搞清楚事务提交后到底是BBED涉及数据块各个层对应的结构体发生了变化
3,基于BBED变化的结构体为基础,最终模拟使用BBED提交事务
4,本文只是分析了事务提交前后的数据块的变化差异,将在下文分析undo header block及undo block在事务提交前后的变化差异
5,最终目的,搞通ORACLE在事务提交整个流程及原理和机制
6,
BBED> map
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 100356 Dba:0x01018804
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0 --数据块的缓存层
struct ktbbh, 72 bytes @20 ---数据块的块头及ITL条目,分为2个部分
struct kdbh, 14 bytes @100 --表目录的第1部分
struct kdbt[1], 4 bytes @114 --也是对应表目录
sb2 kdbr[1] @118 --可见kdbr对应表目录的第2部分,并且其值为反序存储,仅占2个字节,指向存储表记录的内存地址
ub1 freespace[8059] @120 --数据块的空闲空间
ub1 rowdata[9] @8179 --存储表行记录的地方
ub4 tailchk @8188 --数据块块尾
7,关于每个结构体相关含义,请见下述测试对应部分
8,examine可以显示表记录的内容,且其有多个不同控制格式显示的参数选项
其缩写为x
9,一定要用examine和rowdata对应起来,才会知道行记录的数据存储结构到底是什么
测试
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.1.0 - 64bit Production
1,对应查看事务提交前后的block dump
事务提交前
SQL> conn scott/system
Connected.
SQL> create table t_diff_commit(a int,b int);
Table created.
SQL> insert into t_diff_commit select level,level from dual connect by level=1;
1 row created.
SQL> alter system flush buffer_cache;
System altered.
SQL> select DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) file_no,DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) block_no,dbms_rowid.rowid_row_number(rowid) record_no from t_diff_commit;
FILE_NO BLOCK_NO RECORD_NO
---------- ---------- ----------
4 100356 0
SQL> alter session set tracefile_identifier='uncommit_before';
Session altered.
SQL> alter system dump datafile 4 block 100356;
System altered.
trace文件内容
scn: 0x0000.03af226d seq: 0x03 flg: 0x04 tail: 0x226d0603
frmt: 0x02 chkval: 0x933f type: 0x06=trans data
Block header dump: 0x01018804
Object id on Block? Y
seg/obj: 0x124e8 csc: 0x00.3af226d itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1018800 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x00a7.00a.00002275 0x01c00f89.0829.1a ---- 1 fsc 0x0000.00000000
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
tab 0, row 0, @0x1f8f
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 2] c1 02
事务提交后
SQL> alter system flush buffer_cache;
System altered.
trace文件内容
scn: 0x0000.03af5de0 seq: 0x01 flg: 0x06 tail: 0x5de00601 --可见scn发生了变化,seq发生了变化 flag发生了变化 tail发生了变化
frmt: 0x02 chkval: 0xef70 type: 0x06=trans data --chkval发生了变化
Block header dump: 0x01018804
Object id on Block? Y
seg/obj: 0x124e8 csc: 0x00.3af226d itc: 2 flg: E typ: 1 - DATA
brn: 0 bdba: 0x1018800 ver: 0x01 opc: 0
inc: 0 exflg: 0
Itl Xid Uba Flag Lck Scn/Fsc
0x01 0x00a7.00a.00002275 0x01c00f89.0829.1a --U- 1 fsc 0x0000.03af5de0 --可见flag发生变化,scn/fsc发生了变化
0x02 0x0000.000.00000000 0x00000000.0000.00 ---- 0 fsc 0x0000.00000000
tab 0, row 0, @0x1f8f --可见行记录没有发生变化
tl: 9 fb: --H-FL-- lb: 0x1 cc: 2
col 0: [ 2] c1 02
col 1: [ 2] c1 02
找到BBED与block dump各部分的对应关系
BBED> set file 4 block 100356
FILE# 4
BLOCK# 100356
可见kcbh对应block dump的缓冲区
BBED> p kcbh
struct kcbh, 20 bytes @0
ub1 type_kcbh @0 0x06
ub1 frmt_kcbh @1 0xa2
ub1 spare1_kcbh @2 0x00
ub1 spare2_kcbh @3 0x00
ub4 rdba_kcbh @4 0x01018804
ub4 bas_kcbh @8 0x03af5de0 --变化
ub2 wrp_kcbh @12 0x0000 --block dump的缓冲区中的scn为以.分隔的2部分,分别为scn wrap.scn base
ub1 seq_kcbh @14 0x01
ub1 flg_kcbh @15 0x06 (KCBHFDLC, KCBHFCKV)
ub2 chkval_kcbh @16 0xef70 --对应block dump buffer的chkval
ub2 spare3_kcbh @18 0x0000
可见ktbbh截至itl 结构体上半部分对应block dump的块头block header
BBED> p ktbbh
struct ktbbh, 72 bytes @20
ub1 ktbbhtyp @20 0x01 (KDDBTDATA) ---对应typ:1 -DATA
union ktbbhsid, 4 bytes @24
ub4 ktbbhsg1 @24 0x000124e8 --对应seg/obj
ub4 ktbbhod1 @24 0x000124e8 --同上
struct ktbbhcsc, 8 bytes @28
ub4 kscnbas @28 0x03af226d --对应csc的第2部分
ub2 kscnwrp @32 0x0000
sb2 ktbbhict @36 2 --对应itc
ub1 ktbbhflg @38 0x32 (NONE) --对应flag:E
ub1 ktbbhfsl @39 0x00
ub4 ktbbhfnx @40 0x01018800 --对应bdba
ktbbh后半部分对应block dump的itl条目
struct ktbbhitl[0], 24 bytes @44 --对应itl条目1
struct ktbitxid, 8 bytes @44
ub2 kxidusn @44 0x00a7 --对应xid第1部分
ub2 kxidslt @46 0x000a --xid第2部分
ub4 kxidsqn @48 0x00002275 --xid第3部分
struct ktbituba, 8 bytes @52
ub4 kubadba @52 0x01c00f89 --uba第1部分
ub2 kubaseq @56 0x0829 --uba第2部分
ub1 kubarec @58 0x1a --uba第3部分
ub2 ktbitflg @60 0x2001 (KTBFUPB) --flag
union _ktbitun, 2 bytes @62
sb2 _ktbitfsc @62 0
ub2 _ktbitwrp @62 0x0000 --scn/fsc第1部分
ub4 ktbitbas @64 0x03af5de0 --scn/fsc第2部分
struct ktbbhitl[1], 24 bytes @68 ---对应ITL条目2
struct ktbitxid, 8 bytes @68
ub2 kxidusn @68 0x0000
ub2 kxidslt @70 0x0000
ub4 kxidsqn @72 0x00000000
struct ktbituba, 8 bytes @76
ub4 kubadba @76 0x00000000
ub2 kubaseq @80 0x0000
ub1 kubarec @82 0x00
ub2 ktbitflg @84 0x0000 (NONE)
union _ktbitun, 2 bytes @86
sb2 _ktbitfsc @86 0
ub2 _ktbitwrp @86 0x0000
ub4 ktbitbas @88 0x00000000
可见kdbt对应表目录
BBED> p kdbt
struct kdbt[0], 4 bytes @114
sb2 kdbtoffs @114 0
sb2 kdbtnrow @116 1
可见kdbh对应block的表目录的第1部分
BBED> p kdbh
struct kdbh, 14 bytes @100
ub1 kdbhflag @100 0x00 (NONE)
sb1 kdbhntab @101 1
sb2 kdbhnrow @102 1 表的记录数
sb2 kdbhfrre @104 -1
sb2 kdbhfsbo @106 20
sb2 kdbhfseo @108 8079
sb2 kdbhavsp @110 8059
sb2 kdbhtosp @112 8059
可见kdbr对应表目录的第2部分,并且其值为反序存储,仅占2个字节,指向存储表记录的内存地址
BBED> set offset 118
OFFSET 118
BBED> p
kdbr[0]
-------
sb2 kdbr[0] @118 8079
BBED> dump count 2
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 100356 Offsets: 118 to 119 Dba:0x01018804
------------------------------------------------------------------------
8f1f
<32 bytes per line>
---hello
BBED> map
File: /oracle/oradata/guowang/users01.dbf (4)
Block: 100356 Dba:0x01018804
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2 kdbr[1] @118
ub1 freespace[8059] @120
ub1 rowdata[9] @8179
ub4 tailchk @8188
BBED> help examine
EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
</Nuf>:
N - a number which specifies a repeat count.
u - a letter which specifies a unit size:
b - b1, ub1 (byte)
h - b2, ub2 (half-word)
w - b4, ub4(word)
r - Oracle table/index row
f - a letter which specifies a display format:
x - hexadecimal
d - decimal
u - unsigned decimal
o - octal
c - character (native)
n - Oracle number
t - Oracle date
i - Oracle rowid
可见exmaine显示行记录的一个命令,它有很多显示格式的选项参数,/1rnn,1 表示显示几条记录
r表示显示表记录,n表示number列数据类型,连续2个n表示显示表的2个number列的值
以10进制显示表的1条记录
BBED> examine /1rnn offset 8179
rowdata[0] @8179
----------
flag@8179: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8180: 0x01
cols@8181: 2
col 0[2] @8182: 1
col 1[2] @8185: 1
或者以16进制显示表的1条记录
BBED> examine /1rxx offset 8179
rowdata[0] @8179
----------
flag@8179: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8180: 0x01
cols@8181: 2
col 0[2] @8182: 0xc1 0x02
col 1[2] @8185: 0xc1 0x02
BBED> p rowdata
ub1 rowdata[0] @8179 0x2c
ub1 rowdata[1] @8180 0x01 --对应行记录的锁定标志
ub1 rowdata[2] @8181 0x02 --对应列个数
ub1 rowdata[3] @8182 0x02 --对应列1的值
ub1 rowdata[4] @8183 0xc1 --
ub1 rowdata[5] @8184 0x02
ub1 rowdata[6] @8185 0x02 --对应列2的值
ub1 rowdata[7] @8186 0xc1
ub1 rowdata[8] @8187 0x02
个人简介:
8年oracle从业经验,具备丰富的oracle技能,目前在国内北京某专业oracle服务公司从事高级技术顾问。
服务过的客户:
中国电信
中国移动
中国联通
中国电通
国家电网
四川达州商业银行
湖南老百姓大药房
山西省公安厅
中国邮政
北京302医院
河北廊坊新奥集团公司
项目经验:
中国电信3G项目AAA系统数据库部署及优化
中国联通CRM数据库性能优化
中国移动10086电商平台数据库部署及优化
湖南老百姓大药房ERR数据库sql优化项目
四川达州商业银行TCBS核心业务系统数据库模型设计和RAC部署及优化
四川达州商业银行TCBS核心业务系统后端批处理存储过程功能模块编写及优化
北京高铁信号监控系统RAC数据库部署及优化
河南宇通客车数据库性能优化
中国电信电商平台核心采购模块表模型设计及优化
中国邮政储蓄系统数据库性能优化及sql优化
北京302医院数据库迁移实施
河北廊坊新奥data guard部署及优化
山西公安厅身份证审计数据库系统故障评估
联系方式:
手机:18201115468
qq : 305076427
qq微博: wisdomone1
新浪微博:wisdomone9
qq群:275813900
itpub博客名称:wisdomone1
http://blog.itpub.net/9240380/
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/9240380/viewspace-1820974/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/9240380/viewspace-1820974/