用bbed提示事务transaction系列九

结论

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/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值