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各个命令在实践中的使用。