且构网

分享程序员开发的那些事...
且构网 - 分享程序员编程开发的那些事

【BBED】bbed的使用(三)

更新时间:2022-08-15 11:40:04

bbed的使用(一)  介绍了BBED的编译安装
bbed的使用(二) 介绍了bbed的语法规则和常用命令的使用。
本文继续介绍bbed常用命令的使用。

17 DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
   dump 命令可以转储数据块的内容。 使用/v 选项可以输出详细的内容。有上面的提示可以看出,dump命令可以指定DBA,FILENAME,FILE,BLOCK,OFFSET,COUNT参数。
   如果没有指定当前的文件, 可以根据dump命令中指定的block和offset值转储数据块,dump的大小有count决定,默认为512bytes 或者选择指定其他的值。
BBED> dump file 4 block 420
 File: /u01/app/ora10g/oradata/orcl/users01.dbf (4)
 Block: 420              Offsets:    0 to  511           Dba:0x010001a4
------------------------------------------------------------------------
 06a20000 a4010001 a67c1000 00000306 9aee0000 01000000 f1d00000 577c1000
 00000000 02003200 a1010001 04001000 5c010000 13008000 92011f00 01200000
 a67c1000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00010100 ffff1400 8f1f7b1f 7b1f0000 01008f1f 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
 <32 bytes per line>
我们可以利用前面介绍的block header structure的知识来解释上面的信息:
Type    Format   Unused   RDBA     SCN Base  SCN Wrap  Seq   Flag  
 06      a2       0000    a4010001 a67c1000  0000       03    06
18 PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
   print 命令可以输出数据块的结构,和dump一样可以指定DBA,FILE,FILENAME,BLOCK,OFFSET;

BBED> set dba 4,440
        DBA             0x010001b8 (16777656 4,440)
BBED> set offset 0
        OFFSET          0
查看kcbh --Block Header Structure
BBED> p
kcbh.type_kcbh
--------------
ub1 type_kcbh                               @0        0x06
BBED>
   当print打印一个数据块的结构时,输出的格式为:
   Unit Size*  |  Name   |  Offset  | Value
Unit Size* 显示为bytes并且标明value的值是带符号的或者不带符号的。
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        0x010001b8
   ub4 bas_kcbh                             @8        0x00404938
   ub2 wrp_kcbh                             @12       0x0000
   ub1 seq_kcbh                             @14       0x10
   ub1 flg_kcbh                             @15       0x06 (KCBHFDLC, KCBHFCKV)
   ub2 chkval_kcbh                          @16       0x619d
   ub2 spare3_kcbh                          @18       0x0000
BBED>
查看 kdbh  --Data Header Structure
BBED> p kdbh
   ub1 kdbhflag                             @100      0x00 (NONE)
   b1 kdbhntab                              @101      1
   b2 kdbhnrow                              @102      14   <-- 有14行数据
   sb2 kdbhfrre                             @104      -1
   sb2 kdbhfsbo                             @106      46
   sb2 kdbhfseo                             @108      7521
   b2 kdbhavsp                              @110      7475
   b2 kdbhtosp                              @112      7475
BBED>
查看这个数据块里有多少行数据:
BBED> p kdbhnrow
      b2 kdbhnrow                           @102      14
BBED>
作为显示指定数据块的信息的补充,使用* 前缀,print的命令也可以显示数据结构指定位置所包含的信息。如下例子:
显示块行信息:
从这里,我们可以观察到这个块一共有14行数据(emp表总共有14行数据)。每一行指针需要2个bytes,他们从偏移量118开始到144存储在这个数据块中
BBED> p kdbr
sb2 kdbr[0]                                 @118      8050
sb2 kdbr[1]                                 @120      8007
sb2 kdbr[2]                                 @122      7964
sb2 kdbr[3]                                 @124      7923
sb2 kdbr[4]                                 @126      7878
sb2 kdbr[5]                                 @128      7837
sb2 kdbr[6]                                 @130      7796
sb2 kdbr[7]                                 @132      7756
sb2 kdbr[8]                                 @134      7718
sb2 kdbr[9]                                 @136      7675
sb2 kdbr[10]                                @138      7637
sb2 kdbr[11]                                @140      7599
sb2 kdbr[12]                                @142      7560
sb2 kdbr[13]                                @144      7521
BBED>
BBED> p *kdbr[0]
rowdata[529]
------------
ub1 rowdata[529]                            @8150     0x2c
从上面的信息可以看到第0行开始的位置在偏移量8150,dump出这一起始处的信息:
BBED> d /v dba 4,440 offset 8150 count 16
 File: /u02/oradata/xhdb/users01.dbf (4)
 Block: 440     Offsets: 8150 to 8165  Dba:0x010001b8
-------------------------------------------------------
 2c010803 c24a4605 42656376 7805434c l ,....JF.Becvx.CL
 <16 bytes per line>
BBED> 
2.print行数据信息
尽管print不能像dump命令那样提供count选项,但是它也能够打印出 offset,如 下所示:
Switch    Display Format
/x        Hex
/d        signed decimal
/u        unsigned decimal
/o        Octal
/c        Character
/n        Oracle Number
/t        Oracle Date
/i        Oracle ROWID
根据相关的计算得知,数字7369实际存储于数据库16进制的值如下所示:
7369  c2 4a 46
BBED> d /v dba 4,440 offset 8150 count 16
 File: /u02/oradata/xhdb/users01.dbf (4)
 Block: 440     Offsets: 8150 to 8165  Dba:0x010001b8
-------------------------------------------------------
 2c010803 c24a4605 42656376 7805434c l ,....JF.Becvx.CL
 <16 bytes per line>
print命令打印绝对偏移量的信息
BBED> p offset 8150
rowdata[529]
------------
ub1 rowdata[529]                            @8150     0x2c
BBED>
以字符显示偏移量 为8150的值:
BBED> p /c offset 8150
rowdata[529]
------------
ub1 rowdata[529]                            @8150    ,
BBED>
以数字显示偏移量处的值:
BBED> p /n offset 8154
rowdata[533]
------------
ub1 rowdata[533]                            @8154     194
BBED> p /n offset 8155
rowdata[534]
------------
ub1 rowdata[534]                            @8155     74
BBED> p /n offset 8156
rowdata[535]
------------
ub1 rowdata[535]                            @8156     70
BBED>
SQL> select dump(7369) from dual;
DUMP(7369)
----------------------
Typ=2 Len=3: 194,74,70
SQL>
19 E(X)AMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]:
e(x)amine的命令选项:examine 命令可以根据一下转换格式翻译数据块中的数据
   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
与print不同之处在与examine命令不能将数据块中的存储的内容翻译成我们能够看懂的信息。但是它可以显示行信息。结合row的数据类型信息,examine可以被用来从数据块中重新得到行信息。
examine命令允许以下这些指定的转换符进行数据的转义,比如如果我们想要翻译一个oracle表中的数据行,第一个字段是字符,第二,三个字段是数值,我们可以这样执行命令:
 x /rcnn
下面的例子显示了print和examine命令,显示第1行的数据信息:
select * from emp ; 输出的第一行数据如下所示:
EMPNO   ENAME      JOB              MGR HIREDATE            SAL       COMM     DEPTNO
------ ----------- --------- ---------- ------------ ---------- ---------- ----------
7369    Becvx      CLERK           7902 02-JUN-10           900                    20
7499    ALLEN      SALESMAN        7698 20-FEB-81          1600        300         30
7521    WARD       SALESMAN        7698 22-FEB-81          1250        500         30
字段的依次类型为:nccntnnn
BBED> p *kdbr[0] --显示第一行的信息
rowdata[529]
------------
ub1 rowdata[529]                            @8150     0x2c
BBED> x /r --显示原始存储数据格式
rowdata[529]                                @8150   
------------
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0x01
cols@8152:    8
col    0[3] @8153:  0xc2  0x4a  0x46
col    1[5] @8157:  0x42  0x65  0x63  0x76  0x78
col    2[5] @8163:  0x43  0x4c  0x45  0x52  0x4b
col    3[3] @8169:  0xc2  0x50  0x03
col    4[7] @8173:  0x78  0x6e  0x06  0x02  0x14  0x0c  0x1f
col    5[2] @8181:  0xc2  0x0a
col    6[0] @8184: *NULL*
col    7[2] @8185:  0xc1  0x15
BBED> x /rnccntnnn --指定转换格式,出现我们能够看懂的值。
rowdata[529]                                @8150   
------------
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0x01
cols@8152:    8
col    0[3] @8153: 7369
col    1[5] @8157: Becvx
col    2[5] @8163: CLERK
col    3[3] @8169: 7902
col    4[7] @8173: 02-JUN-10
col    5[2] @8181: 900
col    6[0] @8184: *NULL*
col    7[2] @8185: 20
BBED>
直接显示第10行数据:
BBED> x /rnccntnnn  *kdbr[9]
rowdata[154]                                @7775   
------------
flag@7775: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@7776: 0x01
cols@7777:    8
col    0[3] @7778: 7844
col    1[6] @7782: TURNER
col    2[8] @7789: SALESMAN
col    3[3] @7798: 7698
col    4[7] @7802: 08-SEP-81
col    5[2] @7810: 1500
col    6[1] @7813: 0
col    7[2] @7815: 30
BBED>
连续显示3个数据行的值:
注意:可以看到后两个没有数据的输出,所以要先print 行的值
BBED> x /3rnccntnnn
rowdata[529]                                @8150   
------------
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0x01
cols@8152:    8
col    0[3] @8153: 7369
col    1[5] @8157: Becvx
col    2[5] @8163: CLERK
col    3[3] @8169: 7902
col    4[7] @8173: 02-JUN-10
col    5[2] @8181: 900
col    6[0] @8184: *NULL*
col    7[2] @8185: 20
tailchk                                     @8188   
-------
flag@8188: 0x10 (KDRHFD)
lock@8189: 0x06
cols@8190:    0
tailchk                                     @8188   
-------
flag@8190: 0x38 (KDRHFF, KDRHFD, KDRHFH)
lock@8191: 0x49
cols@8192:    0
BBED>
解决办法:
BBED> p *kdbr[0] *kdbr[1] *kdbr[2]
rowdata[443]
------------
ub1 rowdata[443]                            @8064     0x2c
BBED> x /3rnccntnnn
rowdata[443]                                @8064   
------------
flag@8064: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8065: 0x01
cols@8066:    8
col    0[3] @8067: 7521
col    1[4] @8071: WARD
col    2[8] @8076: SALESMAN
col    3[3] @8085: 7698
col    4[7] @8089: 22-FEB-81
col    5[3] @8097: 1250
col    6[2] @8101: 500
col    7[2] @8104: 30
rowdata[486]                                @8107   
------------
flag@8107: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8108: 0x01
cols@8109:    8
col    0[3] @8110: 7499
col    1[5] @8114: ALLEN
col    2[8] @8120: SALESMAN
col    3[3] @8129: 7698
col    4[7] @8133: 20-FEB-81
col    5[2] @8141: 1600
col    6[2] @8144: 300
col    7[2] @8147: 30
rowdata[529]                                @8150   
------------
flag@8150: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8151: 0x01
cols@8152:    8
col    0[3] @8153: 7369
col    1[5] @8157: Becvx
col    2[5] @8163: CLERK
col    3[3] @8169: 7902
col    4[7] @8173: 02-JUN-10
col    5[2] @8181: 900
col    6[0] @8184: *NULL*
col    7[2] @8185: 20
BBED>
注意:oracle向数据块填充数据的时候是有底向上的,因此设置第一行的偏移量会阻止重复操作。比如:当前是第三行,并且hang 2 被指定了,因此,行3和行2 都会被显示。如果
当前行是7,并且指定了 行4 ,那么 行 7,6,5,4都会被显示。
20 FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
转换符:
   x - hexadecimal
   d - decimal
   u - unsigned decimal
   o - octal
   c - character (native)
定位数据在数据块中的位置。命令允许寻找十六进制,字符串,数字的数。使用TOP 关键字可以直接从数据块的顶部查找,或者使用CURR关键字从当前的位置查找。
21 COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
   copy 命令可以将数据块从一个位置拷贝到另外一个位置。配合其他命令如filename,file和offset的指定,或者直接指定DBA。
22 MODIFY[/x|d|u|o|c] numeric/character string
      [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
      modify 命令可以对数据块内的数据进行修改的。可以指定DBA,FILE,FILENAME,BLOCK,OFFSET等参数。如果没有指定当前的file,block,和offset,
      执行该命令的时候会修改。可选地,一个符号或者指针可以在执行此命令的时候指定。
23 ASSIGN [/x|d|u|o]=: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]: [ value |]
24 SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
   SUM 命令用来检查和设置数据块的校验和,执行sum命令是可以指定DBA,FILENAME,FILE,BLOCK 和OFFSET参数。 
25 PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]/POP
   PUSH/POP 命令用来将一个file,block和地址偏移量迁移到一个备份过的内存栈中,然后取用的时候POP命令可以从内存栈中取出之前push进去的对象。
   这样可以使当前正在被修改的对象临时被存储,与此同时其他的对象可以被修改或者检查。
26 REVERT [ DBA | FILE | FILENAME | BLOCK ]
   相当于undo all 操作,可以修复file,filename,block 或者dba 到使用bbed编辑的初始状态。
27 UNDO
    回滚之前的操作。
28 HELP [| ALL ]
  帮助命令。。
29 VERIFY [ DBA | FILE | FILENAME | BLOCK ]
   检查数据块的一致性。它执行和dbferify 类似的功能。
31 CORRUPT [ DBA | FILE | FILENAME | BLOCK ]
    corrupt 命令指定blocks 为坏块。
BBED>corrupt dba 4,13
Block marked  media corrupt
注意:undo命令不能回退corrupt操作,然而revert命令可以。
---------------------------------EOF-----------------------------
以后的篇章中将以事件案例为载体来详细的介绍bbed各个命令在实践中的使用。