Oracle bbed 工具,名称是Block Browser and EDitor的首字母缩写,Oracle 10G及以前版本它随数据库软件一起提供。仅供oracle内部使用,oracle公司从未发布任何关于它的细节说明。它是一个非常强大的工具,但也非常危险,因为它可以更改或破坏任何oracle数据库的数据块。
bbed工具下载方法:
1、Oracle 10G数据库软件中copy;
在使用 bbed 工具之前,必须将其链接起来。目标代码与 unix 和 linux 上的 oracle 数据库一起提供和安装,但是安装程序并不链接它。要链接它,切换到 rdbms/install 目录并发出以下命令 ;
Oracle 10G:
- 编译 bbed
[oracle@sourcedb lib]$ cd$ORACLE_HOME/rdbms/lib
[oracle@sourcedb lib]$ make -fins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
- 检查编译文件
现在您可以通过使用 ls 命令查看是否将 bbed 工具链接起来。
[oracle@sourcedb lib]$ ls -al$ORACLE_HOME/rdbms/lib/bbed
-rwxr-xr-x 1 oracle oinstall 259094Jun 20 14:29 /u01/app/oracle/product/11.2.0/db_1/rdbms/lib/bbed
[oracle@sourcedb lib]$
- 修改环境变量
export PATH=PATH
2、 11g以及12c及19c版本:(本人测试环境为11g/12c/19c)
下面以Oracle 11G环境编译安装BBED:
- 从 10g copy 文件到 11g
cp$ORACLE_10g_HOME/rdbms/lib/ssbbded.o $ORACLE_11g_HOME/rdbms/lib
cp ORACLE_11g_HOME/rdbms/lib
cp$ORACLE_10g_HOME/rdbms/mesg/bbedus.msb $ORACLE_11g_HOME/rdbms/mesg
cp$ORACLE_10g_HOME/rdbms/mesg/bbedus.msg $ORACLE_11g_HOME/rdbms/mesg
- 修改文件属主及权限
chown oracle:oinstall ssbbded.o
chown oracle:oinstall sbbdpt.o
chown oracle:oinstall bbedus.msb
chown oracle:oinstall bbedus.msg
chmod 644 ssbbded.o
chmod 644 sbbdpt.o
chmod 644 bbedus.msb
chmod 644 bbedus.msg
- 编译 bbed
[oracle@sourcedb lib]$ cd$ORACLE_HOME/rdbms/lib
[oracle@sourcedb lib]$ make -fins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
- 检查编译文件
现在您可以通过使用 ls 命令查看是否将 bbed 工具链接起来。
[oracle@sourcedb lib]$ ls -al $ORACLE_HOME/rdbms/lib/bbed
-rwxr-xr-x 1 oracle oinstall 259094Jun 20 14:29 /u01/app/oracle/product/11.2.0/db_1/rdbms/lib/bbed
[oracle@sourcedb lib]$
- 修改环境变量
exportPATH=PATH
3 、启动 bbed
默认情况下, bbed 工具链接在 rdbms/lib 目录中。因此,它不在通常的 $ORACLE_HOME/bin 目录中。链接的可执行文件可以移动到 bin 目录,也可以在 rdbms/lib 目录中启动 .
******* 将 bbed 生成路径添加到环境变量即可, /home/oracle/.bash_profile
exportPATH=ORACLE_HOME/bin: /u01/app/oracle/product/11.2.0/db_1/rdbms/lib/ :$PATH
[oracle@sourcedb bbed]$ bbed
Password: *********** 默认密码: blockedit
BBED: Release 2.0.0.0.0 - LimitedProduction on Wed Dec 18 23:54:33 2019
Copyright © 1982, 2011, Oracleand/or its affiliates. All rights reserved.
************* !!! For Oracle InternalUse only !!! ***************
BBED>
请注意,除非提供密码,否则软件不会启动。此密码可防止未经授权的使用。密码由 Oracle 硬编码,不依赖于任何客户端设置。
可以指定几个命令行选项。允许对设置和操作进行脚本化。它还允许将 bbed 模式设置为浏览而不是编辑,这对于初次使用的用户确保不损坏数据文件。
下表显示了可用命令行:
选项
解释
BLOCKSIZE
数据库块大小
MODE
运行bbed模式(browse or edit)
SILENT
压缩输出到标准输出(Y or N)
SPOOL
输出日志到bbed.log(Y or N)
LISTFILE
文件列表
CMDFILE
要执行的命令列表的文件名
BIFILE
回滚文件名,默认bifile.bbd.
LOGFILE
用户日志文件名。默认log.bbd.
PARFILE
包含以上参数列表的参数文件
由于有些参数是必选参数,建议使用 parfile 选项将多个参数存储在一个文件中。以下为一个块大小为 8K 大小的小型数据库 parfile:
[oracle@sourcedb bbed]$ cat par.bbed
blocksize=8192
listfile=listfile.txt
mode=edit
spool=yes
[oracle@sourcedb bbed]$
在上面的示例中,我们将块大小设置为 8Kb ,并将模式设置为 edit ,以便我们更改数据块。
我们还提供了一个文件的名称,它将列出要编辑的所有文件。
列表文件应该包含要编辑的文件的名称、数据文件的文件 id 和文件的大小 ( 以字节为单位 ) 。
下面是一个来自小型示例数据库的示例:
[oracle@sourcedb bbed]$ cat listfile.txt
1 /oradata/epmsn/system01.dbf 786432000
2 /oradata/epmsn/sysaux01.dbf 555745280
3 /oradata/epmsn/undotbs01.dbf 99614720
4 /oradata/epmsn/users01.dbf 5242880
5 /oradata/epmsn/hsql01.dbf 104857600
6 /oradata/epmsn/user02.dbf 104857600
注意: listfile 文件可以使用以下命令在目标数据库生成:
SQL> select file#||’ ’ ||name||’ '||bytes from v$datafile;
4、命令介绍
启动bbed后,用户就会看到bbed提示。用户使用的第一个命令很可能是help命令。使用命令 help all ,可以获得所有可用命令的帮助列表:
[oracle@sourcedb bbed]$ ./l_bbed.sh
BBED: Release 2.0.0.0.0 - Limited Production on Thu Dec 19 01:37:38 2019
Copyright © 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> help all
SET DBA [ dba | file#, block# ]
SET FILENAME ‘filename’
SET FILE file#
SET BLOCK [+/-]block#
SET OFFSET [ [+/-]byte offset | symbol | *symbol ]
SET BLOCKSIZE bytes
SET LIST[FILE] ‘filename’
SET WIDTH character_count
SET COUNT bytes_to_display
SET IBASE [ HEX | OCT | DEC ]
SET OBASE [ HEX | OCT | DEC ]
SET MODE [ BROWSE | EDIT ]
SET SPOOL [ Y | N ]
SHOW [
INFO
MAP[/v] [ DBA | FILENAME | FILE | BLOCK ]
DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ]
PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol |*symbol ]
EXAMINE[/Nuf] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol]
:
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
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK]
MODIFY[/x|d|u|o|c] numeric/character string
[ DBA | FILE | FILENAME |BLOCK | OFFSET | symbol | *symbol ]
ASSIGN[/x|d|u|o]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
CORRUPT [ DBA | FILE | FILENAME | BLOCK ]
BBED>
下面的部分将解释可用的命令。括号中包含第一个字母的命令可以仅使用第一个字母缩写。例如, dump 命令可以简写为 d 。
4.1 、 set dba
使用标准的 Oracle DBA( 数据块地址 ) 格式设置当前数据块。以文件 id 、块号 格式输入。例如,文件 3 的第 632 块将按如下方式访问 :
BBED> set dba 3,632
如果成功,将使用访问块的 RDBA( 相对数据块地址 ) 进行响应 :
BBED> set dba 3,632
DBA 0x00c00278 (12583544 3,632)
4.2 、 set file
设置当前访问文件号,设置的文件号必须包含在启动时引用的 filelist 中,设置成功后, bbed 将返回当前访问文件的 id 号。
BBED> set file 2
FILE# 2
BBED>
4.3 、 set block
设置当前块。块是相对于已经设置的文件名或文件的。可以指定绝对块,或使用加号 (+) 或 (-) 符号指定当前块的偏移量。如果成功,将响应显示当前块。
BBED> set block 16
BLOCK# 16
BBED> set block +16
BLOCK# 32
BBED> set block -8
BLOCK# 24
BBED>
4.4 、 set offset
设置当前偏移量。偏移量相对于已经设置的块。可以指定绝对偏移量,也可以使用加号 (+) 或减号 (-) 指定当前偏移量的偏移量。如果成功。 bbed 将响应显示当前偏移量。
BBED> set offset 16
OFFSET 16
BBED> set offset -8
OFFSET 8
BBED>
4.5 、 set blocksize
设置当前文件块大小,设置的块大小必须与文件实际块大小匹配,否则将会报错,设置成功后, bbed 将会显示当前块大小:
BBED> set blocksize 8192
BLOCKSIZE 8192
BBED> set blocksize 4096
BBED-00307: incorrect blocksize (8192)or truncated file
BBED>
4.6 、 set listfile
将 listfile 设置为指定的文件。如果在命令行上没有指定 listfile ,可以使用此选项。 listfile 必须用单引号括起来。如果成功,将响应显示当前列表文件。
[oracle@sourcedb bbed]$ cplistfile.txt listfile2.txt
[oracle@sourcedb bbed]$ vilistfile2.txt
[oracle@sourcedb bbed]$./l_bbed.sh
BBED: Release 2.0.0.0.0 - LimitedProduction on Thu Dec 19 02:11:46 2019
Copyright © 1982, 2011, Oracleand/or its affiliates. All rights reserved.
************* !!! For Oracle InternalUse only !!! ***************
BBED> info
File# Name Size(blks)
1/oradata/epmsn/system01.dbf 96000
2/oradata/epmsn/sysaux01.dbf 67840
3/oradata/epmsn/undotbs01.dbf 12160
4/oradata/epmsn/users01.dbf 640
5/oradata/epmsn/hsql01.dbf 12800
6/oradata/epmsn/user02.dbf 12800
BBED> set listfile ‘listfile2.txt’
LISTFILE listfile2.txt
BBED> info
File# Name Size(blks)
1/oradata/epmsn/system01.dbf 96000
2/oradata/epmsn/sysaux01.dbf 67840
3/oradata/epmsn/undotbs01.dbf 12160
4/oradata/epmsn/users01.dbf 640
5/oradata/epmsn/hsql01.dbf 12800
BBED>
4.7 、 set width
设置输出宽度,如果未设置, bbed 默认设置 80 个字符,例如,
BBED> set width 132
WIDTH 132
BBED>
4.8 、 set count
从 dump 命令中设置要显示的数据块的字节数。默认值是 512 。因此,要查看整个 8Kb 块,需要在偏移量 0 、 512 、 1024 、 1536 、 2048 、 2560 、 3092 和 3604 处转储该块 8 次。通过设置较高的计数每次将转储更多。通过减少它,可以实现更小的转储。如
BBED> set count 256
COUNT 256
BBED>
4.9 、 set ibase
设置内部数字基数。默认值是 decimal 。但是它也可以被设置为十六进制或八进制。这允许 set 文件、 set 块和 set offset 命令使用十进制的替代基数。如果成功,将显示当前的基础 :
BBED> set ibase hex
IBASE Hex
BBED> set block +A
BLOCK# 11
4.10 、 set mode
设置密肋模式。选项是浏览或编辑。在浏览模式下不能做任何改变。这是建议首次使用此工具的用户使用的模式,或者如果您打算只使用此工具查看数据块,也可以使用此模式。
4.11 、 show
显示当前所有设置。例如,
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME/oradata/epmsn/system01.dbf
BIFILE bifile.bbd
LISTFILE listfile.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL Yes
BBED>
4.12 、 info
设置当前被 bbed 浏览或编辑的文件列表。例如,
BBED> info
File# Name Size(blks)
1/oradata/epmsn/system01.dbf 96000
2/oradata/epmsn/sysaux01.dbf 67840
3/oradata/epmsn/undotbs01.dbf 12160
4/oradata/epmsn/users01.dbf 640
5/oradata/epmsn/hsql01.dbf 12800
6/oradata/epmsn/user02.dbf 12800
BBED>
4.13 、 map
map 命令显示当前块的映射。它可以与 /v 选项结合使用,以生成更详细的输出。该映射显示整个块中的偏移量,其中可以找到某些信息,如块头、数据块头或行目录。
如果 set 命令没有用于设置当前块,或者用户只是希望检查另一个块,同时保持当前块的焦点即文件名。可以使用该命令指定文件 id 、块或 DBA 。
BBED> map /v dba 5,1539
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Dba:0x01400603
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0
ub1 type_kcbh @0
ub1 frmt_kcbh @1
ub1 spare1_kcbh @2
ub1 spare2_kcbh @3
ub4 rdba_kcbh @4
ub4 bas_kcbh @8
ub2 wrp_kcbh @12
ub1 seq_kcbh @14
ub1 flg_kcbh @15
ub2 chkval_kcbh @16
ub2 spare3_kcbh @18
struct ktbbh, 96 bytes @20
ub1 ktbbhtyp @20
union ktbbhsid, 4 bytes@24
struct ktbbhcsc, 8 bytes@28
sb2 ktbbhict @36
ub1 ktbbhflg @38
ub1 ktbbhfsl @39
ub4 ktbbhfnx @40
struct ktbbhitl[3], 72bytes @44
struct kdbh, 14 bytes @124
ub1 kdbhflag @124
sb1 kdbhntab @125
sb2 kdbhnrow @126
sb2 kdbhfrre @128
sb2 kdbhfsbo @130
sb2 kdbhfseo @132
sb2 kdbhavsp @134
sb2 kdbhtosp @136
struct kdbt[1], 4 bytes @138
sb2 kdbtoffs @138
sb2 kdbtnrow @140
sb2 kdbr[31] @142
ub1 freespace[4313] @204
ub1 rowdata[3671] @4517
ub4 tailchk @8188
BBED>
结构/元素 解释
struct kcbh, 20 bytes @0 Block Header Structure
ub1 type_kcbh @0 Block type
ub1 frmt_kcbh @1 Block format a2=oracle 112
ub1 spare1_kcbh @2 not used
ub1 spare2_kcbh @3 not used
ub4 rdba_kcbh @4 RDBA-Relative Data Block Address
ub4 bas_kcbh @8 SCN Base
ub2 wrp_kcbh @12 SCN Wrap
ub1 seq_kcbh @14 sequence number
ub1 flg_kcbh @15 Flag:
0x01 New Block
0x02 Delayed Loging Change advanced SCN/seq
0x04 Check value saved-block XOR’s to zero
0x08 Temporary block
ub2 chkval_kcbh @16 Optional block checksum(if DB_BLOCK_CHECKSUM=TRUE)
ub2 spare3_kcbh @18 not used
struct ktbbh, 96 bytes @20 Transaction Fixed Header Structure
ub1 ktbbhtyp @20 Block type(1=DATA,2=INDEX)
union ktbbhsid, 4 bytes @24 Segment/Object ID
struct ktbbhcsc, 8 bytes @28 SCN at last block cleanout
sb2 ktbbhict @36 Number of ITL slots
ub1 ktbbhflg @38 0=on the freelist
ub1 ktbbhfsl @39 ITL TX freelist slot
ub4 ktbbhfnx @40 DBA of next block on the freelist
struct ktbbhitl[3], 72 bytes @44 ITL list index
struct kdbh, 14 bytes @124 Data Header Structure
ub1 kdbhflag @124 N=pctfree hit(clusters);F=do not put on freelist;K=flushable cluster keys
sb1 kdbhntab @125 Number of tables(>1 in clusters)
sb2 kdbhnrow @126 number of rows
sb2 kdbhfrre @128 First free row entry index;-1 = you have to add one
sb2 kdbhfsbo @130 freespace begin offset
sb2 kdbhfseo @132 freespace end offset
sb2 kdbhavsp @134 available space in the block
sb2 kdbhtosp @136 total available space when all TXs commit
struct kdbt[1], 4 bytes @138 Table Directory Entry Structure
sb2 kdbtoffs @138
sb2 kdbtnrow @140
sb2 kdbr[31] @142 Row Dicrecory
ub1 freespace[4313] @204 free space
ub1 rowdata[3671] @4517 row data
ub4 tailchk @8188 (See Tailchecks below)
不同的块类型由块的第一个字节指定。下表显示了如何解码块类型。
Header Block Types
ID
Type
01
Undo segment header
02
Undo data block
03
Save undo header
04
save undo data block
05
Data segment header(temp,index,data and so on)
06
KTB managed data block (with ITL)
07
Temp table data block (no ITL)
08
Sort Key
09
Sort Run
10
Segment free list block
11
Data file header
所有 Oracle 块的最后四个字节是
tail check 。下面展示了如何对进行 tail check:
Tail checks
Oracle 8+ 块的尾部是 SCN bas 的低阶两个字节、块类型和 SCN 序列号的串联。例如,如果 SCN bas 是 0x00103cce ,那么块类型是 06,SCN 序列号是 0x02 。尾校验 1 是 0x3cce0602:
BBED> p type_kcbh
ub1 type_kcbh @0 0x06
BBED> p seq_kcbh
ub1 seq_kcbh @14 0x02
BBED> p bas_kcbh
ub4 bas_kcbh @8 0x00103cce
SCN base Type SCN seq
3cce 06 02
BBED> p tailchk
ub4 tailchk @8188 0x3cce0602
BBED>
BBED> dump /v dba 5,1539 offset8188
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 8188 to8191 Dba:0x01400603
0206ce3c l …<
<16 bytes per line>
BBED>
虽然这个尾检查值是由三个组件生成的,但是 Oracle 将最后的值作为单个无符号整数存储为一个单词 (4 字节 ) 。在 little-endian 架构机器 ( 包括 Intel) 上,值将首先存储为低阶字节
因此,如果使用标准块编辑器在块中检查 tail check ,或者使用将在下一节中解释的 dump 命令,那么字节顺序可能会有所不同。存储在 Intel 机器上的 0x3cce0602 的尾检查将作为 “0206ce3c” 写入磁盘。
4.14 、 (d)ump
dump 命令将块的内容转储到屏幕上。它可以与 /v 选项结合使用,以生成更详细的输出。可以使用该命令指定 DBA 、文件名、文件、块、转储的偏移量。如果没有指定当前文件,则使用 set 命令建立的块和偏移量将被转储。转储的大小受 set count 选项的限制,默认为 512 字节,或者使用命令指定转储的大小。下面的例子显示了文件 5 的前 128 字节,块 1539 ,偏移量 0 被转储 :
BBED> dump /v dba 5,1539 offset 0count 128
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 0 to 127Dba:0x01400603
06a20000 03064001 ce3c100000000204 l …@…<…
70f60000 01000000 1d570100cc3c1000 l p…W…<…
00000000 03003200 00064001ffff0000 l …2…@…
00000000 00000000 0000000000800000 l …
cc3c1000 00000000 00000000 00000000l .<…
00000000 00000000 0000000000000000 l …
00000000 00000000 0000000000000000 l …
00000000 00000000 0000000000011f00 l …
<16 bytes per line>
BBED>
我们可以使用前一节中描述的块头结构来解码块的前 16 个字节,如下所示 :
Type
Format
Unused
RDBA
SCN Base
SCN Wrap
Seq
Flag
06
a2
0000
03064001
ce3c1000
0000
02
04
4.15 、 §rint
print 命令允许将数据结构打印为原始输出或格式化输出。可以使用该命令指定要打印的 DBA 、文件名、文件、块、偏移量。如果未指定当前文件,则将打印用 set 命令建立的块和偏移量。
如果仅使用要打印的块和偏移量发出打印命令,那么在该偏移量处将显示数据结构。例如,如果我们打印文件 5 、块 1953 、偏移量为 0 的内容,则会返回数据结构为 kcbh 或数据块头 :
BBED> set dba 5,1539
DBA 0x01400603 (20973059 5,1539)
BBED> set offset 0
OFFSET 0
BBED> p
kcbh.type_kcbh
ub1 type_kcbh @0 0x06
BBED>
也可以使用 print 命令通过指定名称来打印各个数据结构。以打印数据块头为例,我们可以指定如下 :
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 @40x01400603
ub4 bas_kcbh @8 0x00103cce
ub2 wrp_kcbh @12 0x0000
ub1 seq_kcbh @14 0x02
ub1 flg_kcbh @15 0x04(KCBHFCKV)
ub2 chkval_kcbh @160xf670
ub2 spare3_kcbh @180x0000
BBED>
如果我们想要确定块中的行数,我们可以打印数据头结构或 kdbh:
BBED> p kdbh
struct kdbh, 14 bytes @124
ub1 kdbhflag @124 0x00(NONE)
sb1 kdbhntab @125 1
sb2 kdbhnrow @126 31
sb2 kdbhfrre @128 -1
sb2 kdbhfsbo @130 80
sb2 kdbhfseo @132 4393
sb2 kdbhavsp @134 4313
sb2 kdbhtosp @136 4313
BBED>
我们还可以指定某些数据结构元素来打印,如行数 :
BBED> p kdbhnrow
sb2 kdbhnrow @126 31
注 : 打印数据结构时,输出格式如下 :
Unit Size* | Name | Offset | Value
*Unit size: * 单位大小以字节为单位,表示值是有符号 signed(s) 的还是无符号 unsigned(u) 的。
除了打印指定数据结构的信息外, print 命令还可以使用指针 (*) 前缀打印数据结构指向的位置信息。例如,我们可以通过打印 kdbr 数据结构来显示块行信息
BBED> p kdbr
sb2 kdbr[0] @142 7981
sb2 kdbr[1] @144 7894
sb2 kdbr[2] @146 7798
sb2 kdbr[3] @148 7680
sb2 kdbr[4] @150 7558
sb2 kdbr[5] @152 7434
sb2 kdbr[6] @154 7316
sb2 kdbr[7] @156 7197
sb2 kdbr[8] @158 7078
sb2 kdbr[9] @160 6948
sb2 kdbr[10] @162 6830
sb2 kdbr[11] @164 6708
sb2 kdbr[12] @166 6584
sb2 kdbr[13] @168 6459
sb2 kdbr[14] @170 6339
sb2 kdbr[15] @172 6220
sb2 kdbr[16] @174 6106
sb2 kdbr[17] @176 5987
sb2 kdbr[18] @178 5871
sb2 kdbr[19] @180 5748
sb2 kdbr[20] @182 5629
sb2 kdbr[21] @184 5498
sb2 kdbr[22] @186 5378
sb2 kdbr[23] @188 5261
sb2 kdbr[24] @190 5139
sb2 kdbr[25] @192 5020
sb2 kdbr[26] @194 4902
sb2 kdbr[27] @196 4787
sb2 kdbr[28] @198 4659
sb2 kdbr[29] @200 4526
sb2 kdbr[30] @202 4393
BBED>
从这里我们可以确定在这个块中有 31 行。每个行指针需要两个字节,它们存储在从偏移量 142 到 202 的块中。然后我们可以使用 kdbr[0] 作为指针打印关于行 0 的信息 :
BBED> p kdbr[0]
sb2 kdbr[0] @142 7981
BBED> p *kdbr[0]
rowdata[3588]
ub1 rowdata[3588] @8105 0x2c
BBED>
由此我们可以确定第 0 行从偏移 8159 处开始。这可以通过前面描述的 dump 命令进行验证 :
BBED> d /v dba 5,1539 offset 8105count 16
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 8105 to8120 Dba:0x01400603
2c000f03 53595301 80ff044f50454eff l ,…SYS…OPEN.
<16 bytes per line>
BBED>
print 命令也可以打印绝对偏移量,尽管它不像 dump 那样提供 count 选项 :
BBED> p 8105
rowdata[3588]
ub1 rowdata[3588] @8105 0x2c
print 命令默认以十六进制显示输出。但是,也可以将其设置为以多种其他格式显示输出。下表显示了可用的格式 :
格式
说明
/x
Hex
/d
signed decimal
/u
unsigned decimal
/o
Octal
/c
Character
/n
Oracle Number
/t
Oracle Date
/i
Oracle ROWID
BBED> p offset 8105
rowdata[3588]
ub1 rowdata[3588] @8105 0x2c
BBED> p /c offset 8105
rowdata[3588]
ub1 rowdata[3588] @8105 ,
4.16 、 e(x)amine
examine 命令用于在原始输出或格式化输出中显示数据块中的数据。可以使用该命令指定要检查的 DBA 、文件名、文件、块和 / 或偏移量。如果没有指定当前文件,那么将检查用 set 命令建立的块和偏移量。如果只发出了要检查的块和偏移量的检查命令,那么在该偏移量处将显示数据结构。
与 print 命令不同,它不能解释数据结构,但可以用来显示行信息。结合行数据类型的知识,可以用来从块中检索完整的行 :
检查命令将根据以下格式来解释块中的数据 :
格式
说明
/b
b1,ub1(byte)
/h
b2,ub2(half-word)
/w
b4,ub4(word)
/l
b8,ub8(long)(was b4/ub4 in Oracle7).
/r
Oracle table/index row
检查命令允许来自 print 命令的开关与这些特定的开关相结合来解释数据。例如,如果我们希望将数据解释为具有第一列字符和第二、第三列数字的 Oracle 表行,我们将执行以下命令 :
SQL> desc hsql.test3;
Name Null? Type
USERNAME NOT NULL VARCHAR2(30)
USER_ID NOT NULL NUMBER
PASSWORD VARCHAR2(30)
ACCOUNT_STATUS NOT NULLVARCHAR2(32)
LOCK_DATE DATE
EXPIRY_DATE DATE
DEFAULT_TABLESPACE NOT NULLVARCHAR2(30)
TEMPORARY_TABLESPACE NOT NULLVARCHAR2(30)
CREATED NOT NULL DATE
PROFILE NOT NULL VARCHAR2(30)
INITIAL_RSRC_CONSUMER_GROUPVARCHAR2(30)
EXTERNAL_NAME VARCHAR2(4000)
PASSWORD_VERSIONS VARCHAR2(8)
EDITIONS_ENABLED VARCHAR2(1)
AUTHENTICATION_TYPE VARCHAR2(8)
SQL>
BBED> x /rcnccttcctcccccc
rowdata[3041] @7558
flag@7558: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@7559: 0x00
cols@7560: 15
col 0[11] @7561: FLOWS_FILES
col 1[2] @7573: 74
col 2[0] @7576: NULL
col 3[16] @7577: EXPIRED & LOCKED
col 4[7] @7594: 24-AUG-13
col 5[7] @7602: 24-AUG-13
col 6[6] @7610: SYSAUX
col 7[4] @7617: TEMP
col 8[7] @7622: 24-AUG-13
col 9[7] @7630: DEFAULT
col 10[22] @7638:DEFAULT_CONSUMER_GROUP
col 11[0] @7661: NULL
col 12[8] @7662: 10G 11G
col 13[1] @7671: N
col 14[8] @7673: PASSWORD
BBED>
下面的示例显示了用于单步遍历块的第一和第二行的 print 和 examine 命令, :
BBED> p *kdbr[0]
rowdata[3588]
ub1 rowdata[3588] @8105 0x2c
BBED> x /rcnccttcctcccccc
rowdata[3588] @8105
flag@8105: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@8106: 0x00
cols@8107: 15
col 0[3] @8108: SYS
col 1[1] @8112: 0
col 2[0] @8114: NULL
col 3[4] @8115: OPEN
col 4[0] @8120: NULL
col 5[7] @8121: 15-JUN-20
col 6[6] @8129: SYSTEM
col 7[4] @8136: TEMP
col 8[7] @8141: 24-AUG-13
col 9[7] @8149: DEFAULT
col 10[9] @8157: SYS_GROUP
col 11[0] @8167: NULL
col 12[8] @8168: 10G 11G
col 13[1] @8177: N
col 14[8] @8179: PASSWORD
BBED> p *kdbr[1]
rowdata[3501]
ub1 rowdata[3501] @8018 0x2c
BBED> x /rcnccttcctcccccc
rowdata[3501] @8018
flag@8018: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@8019: 0x00
cols@8020: 15
col 0[6] @8021: SYSTEM
col 1[2] @8028: 5
col 2[0] @8031: NULL
col 3[4] @8032: OPEN
col 4[0] @8037: NULL
col 5[7] @8038: 15-JUN-20
col 6[6] @8046: SYSTEM
col 7[4] @8053: TEMP
col 8[7] @8058: 24-AUG-13
col 9[7] @8066: DEFAULT
col 10[9] @8074: SYS_GROUP
col 11[0] @8084: NULL
col 12[8] @8085: 10G 11G
col 13[1] @8094: N
col 14[8] @8096: PASSWORD
BBED>
还可以指定重复计数来对后续行重复执行检查命令。下面显示了用于定位最后一行偏移量的 print 命令,然后检查接下来的三行 :
BBED> p *kdbr[30]
rowdata[0]
ub1 rowdata[0] @4517 0x2c
BBED> x /3rcnccttcctcccccc
rowdata[0] @4517
flag@4517: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@4518: 0x00
cols@4519: 15
col 0[21] @4520: SPATIAL_WFS_ADMIN_USR
col 1[2] @4542: 66
col 2[0] @4545: NULL
col 3[16] @4546: EXPIRED & LOCKED
col 4[7] @4563: 24-AUG-13
col 5[7] @4571: 24-AUG-13
col 6[5] @4579: USERS
col 7[4] @4585: TEMP
col 8[7] @4590: 24-AUG-13
col 9[7] @4598: DEFAULT
col 10[22] @4606:DEFAULT_CONSUMER_GROUP
col 11[0] @4629: NULL
col 12[8] @4630: 10G 11G
col 13[1] @4639: N
col 14[8] @4641: PASSWORD
rowdata[133] @4650
flag@4650: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@4651: 0x00
cols@4652: 15
col 0[21] @4653: SPATIAL_CSW_ADMIN_USR
col 1[2] @4675: 69
col 2[0] @4678: NULL
col 3[16] @4679: EXPIRED & LOCKED
col 4[7] @4696: 24-AUG-13
col 5[7] @4704: 24-AUG-13
col 6[5] @4712: USERS
col 7[4] @4718: TEMP
col 8[7] @4723: 24-AUG-13
col 9[7] @4731: DEFAULT
col 10[22] @4739:DEFAULT_CONSUMER_GROUP
col 11[0] @4762: NULL
col 12[8] @4763: 10G 11G
col 13[1] @4772: N
col 14[8] @4774: PASSWORD
rowdata[266] @4783
flag@4783: 0x2c (KDRHFL, KDRHFF,KDRHFH)
lock@4784: 0x00
cols@4785: 15
col 0[16] @4786: APEX_PUBLIC_USER
col 1[2] @4803: 75
col 2[0] @4806: NULL
col 3[16] @4807: EXPIRED & LOCKED
col 4[7] @4824: 24-AUG-13
col 5[7] @4832: 24-AUG-13
col 6[5] @4840: USERS
col 7[4] @4846: TEMP
col 8[7] @4851: 24-AUG-13
col 9[7] @4859: DEFAULT
col 10[22] @4867:DEFAULT_CONSUMER_GROUP
col 11[0] @4890: NULL
col 12[8] @4891: 10G 11G
col 13[1] @4900: N
col 14[8] @4902: PASSWORD
BBED>
注意, Oracle 自底向上填充数据块,因此设置第一行的偏移量将禁止使用 repeat 选项。例如,如果当前行是第 3 行,并且指定了重复 2 ,则显示第 3 行和第 2 行。如果当前行是 7 ,并且指定重复 4 ,则显示第 7 、 6 、 5 和 4 行。由于没有低于第 1 行的行,重复将导致错误。
4.17 、 (f)ind
find 命令用于定位块内的数据。该命令允许搜索十六进制、字符串或数字数据。可以使用 top 指令从块的顶部 ( 偏移量 O) 搜索模式,也可以使用 CURR 指令从当前位置搜索模式。
以下参数用于确定要搜索的模式的数据类型。如下图所示 :
参数
数据格式
/x
Hexadecimal
/d
Decimal
/u
unsigned decimal
/o
Octal
/c
character(native)
注意 :find 命令不支持数字和日期。
例如,我们想要搜索字符串 ar 。我们可以使用 set 命令来定位所需的块,然后搜索字符串 :
BBED> find /c SYSTEM top
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to8191 Dba:0x01400603
53595354 454d0454 454d500778710818 0c3a3607 44454641 554c5416 44454641
554c545f 434f4e53 554d45525f47524f 5550ff08 31304720 31314720 014e0850
41535357 4f52442c 000f054f55544c4e 02c10aff 10455850 49524544 2026204c
4f434b45 44077871 08180c262c077871 08180c26 2c065359 5354454d 0454454d
50077871 08180c26 2c0744454641554c 54164445 4641554c 545f434f 4e53554d
45525f47 524f5550 ff08313047203131 4720014e 08504153 53574f52 442c000f
04485351 4c02c155 ff044f50454eff07 7878060f 11160404 4853514c 0454454d
50077877 0c121116 040744454641554c 54164445 4641554c 545f434f 4e53554d
45525f47 524f5550 ff08313047203131 4720014e 08504153 53574f52 442c000f
06535953 54454d02 c106ff044f50454e ff077878 060f1617 33065359 5354454d
0454454d 50077871 08180c2629074445 4641554c 54095359 535f4752 4f5550ff
08313047 20313147 20014e0850415353 574f5244 2c000f03 53595301 80ff044f
50454eff 07787806 0f110c1606535953 54454d04 54454d50 07787108 180c2629
07444546 41554c54 095359535f47524f 5550ff08 31304720 31314720 014e0850
41535357 4f524402 06ce3c
<32 bytes per line>
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
53595354 454d0454 454d500778710818 l SYSTEM.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED>BBED> find /c SYSTEM top
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to8191 Dba:0x01400603
53595354 454d0454 454d500778710818 0c3a3607 44454641 554c5416 44454641
554c545f 434f4e53 554d45525f47524f 5550ff08 31304720 31314720 014e0850
41535357 4f52442c 000f054f55544c4e 02c10aff 10455850 49524544 2026204c
4f434b45 44077871 08180c262c077871 08180c26 2c065359 5354454d 0454454d
50077871 08180c26 2c0744454641554c 54164445 4641554c 545f434f 4e53554d
45525f47 524f5550 ff08313047203131 4720014e 08504153 53574f52 442c000f
04485351 4c02c155 ff044f50454eff07 7878060f 11160404 4853514c 0454454d
50077877 0c121116 040744454641554c 54164445 4641554c 545f434f 4e53554d
45525f47 524f5550 ff08313047203131 4720014e 08504153 53574f52 442c000f
06535953 54454d02 c106ff044f50454e ff077878 060f1617 33065359 5354454d
0454454d 50077871 08180c2629074445 4641554c 54095359 535f4752 4f5550ff
08313047 20313147 20014e0850415353 574f5244 2c000f03 53595301 80ff044f
50454eff 07787806 0f110c1606535953 54454d04 54454d50 07787108 180c2629
07444546 41554c54 095359535f47524f 5550ff08 31304720 31314720 014e0850
41535357 4f524402 06ce3c
<32 bytes per line>
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
53595354 454d0454 454d500778710818 l SYSTEM.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED>
我们可以看到,前六个字符确实是 “SYSTEM” 。如果我们想要搜索相同模式的下一次出现,只需输入 find 命令,不带任何参数。
BBED> f
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7851 to7882 Dba:0x01400603
53595354 454d0454 454d500778710818 0c262c07 44454641 554c5416 44454641
<32 bytes per line>
BBED> d /v dba 5,1539 offset 7851count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7851 to7882 Dba:0x01400603
53595354 454d0454 454d500778710818 l SYSTEM.TEMP.xq…
0c262c07 44454641 554c541644454641 l .&,.DEFAULT.DEFA
<16 bytes per line>
BBED>
4.17 、 copy
copy 命令用于将块从一个位置复制到另一个位置。与其他命令一样,可以指定文件或文件名和偏移量,也可以指定 DBA 。下面的示例显示了块 16 从文件 2 复制到文件 1 。
。注意 : 使用此命令时将清除 before-image 文件。
BBED> copy dba 4,16 to dba 1,16
4.17 、 (m)odify
modify 命令用于更改块内的数据。 DBA 、文件名 , 文件。可以使用该命令指定要修改的块或偏移量。如果未指定当前文件,则将修改用 set 命令建立的块和偏移量。也可以指定符号或符号指针进行修改。
使用与 find 命令相同的开关,可以在十六进制、十进制、无符号十进制、八进制或字符数据中指定用于覆盖原始数据的字节模式 。
下面的示例显示文件 5 的第 1539 块中偏移量 7733 处的数据正在被修改。需要修改的数据为字符数据 :
BED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
53595354 454d0454 454d500778710818 l SYSTEM.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED> modify /c HSQLCC dba 5,1539offset 7733
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
4853514c 43430454 454d500778710818 0c3a3607 44454641 554c5416 44454641
<32 bytes per line>
我们可以使用 dump 命令来验证修改 :
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
4853514c 43430454 454d500778710818 l HSQLCC.TEMP.xq…
0c3a3607 44454641 554c5416 44454641l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED>
4.18 、 assign
assign 命令执行符号赋值,并进行类型和范围检查。对于当前偏移量,可以忽略目标或源。例如,下面的命令将当前偏移量的结构分配给文件 4 。 block 2 的第一个 ITL entry
BBED> assign dba 4, 2 ktbbhitl[0]
4.19 、 sum
sum 命令用于检查和设置块校验和。可以使用该命令指定要检查的 DBA 、文件名、文件、块和偏移量。如果没有指定当前文件,那么将检查用 set 命令建立的块和偏移量。
apply 指令可用于更新校验和。
下面的例子显示了文件 7 、块 16 的块校验和,然后更新 :
BBED> sum dba 6,16
Check value for File 6, Block 16:
current = 0x8162, required = 0x8162
BBED> sum dba 6,16 apply
Check value for File 6, Block 16:
current = 0x8162, required = 0x8162
BBED>
4.20 、 push / pop
push 和 pop 命令用于将文件、块和偏移位置推送到内存支持的堆栈上,然后再将它们弹出。这允许在检查或修改另一个位置时临时保存正在编辑的当前位置。
注意,堆栈只存储位置 — 它不保存内容。
下面的示例显示了正在检查的文件 7 、块 16 、偏移量 8163 。位置是用 push 命令保存的。然后,我们移动到文件 6 块 1 ,然后使用 pop 命令返回到 DBA 7 、 16 。
BBED>push dba 7,16
BBED>set dba 6,1
BBED>pop
命令 pop all 可用于从堆栈中删除所有推入的条目。 show all 命令可用于显示所有保存的位置。
4.20 、 revert
revert 命令用于将文件、文件名、块或 DBA 恢复到初始状态。如 :
BBED> revert dba 5,1539
All changes made to this block will berolled back. Proceed? (Y/N) y
Reverted file’/oradata/epmsn/hsql01.dbf’, block 1539
BBED>
4.21 、 undo
撤消命令回滚最后的修改或分配命令。如果再次发出撤消命令,则重新进行修改。下面的示例显示了一个正在撤消的修改命令 :
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
53595354 454d0454 454d500778710818 l SYSTEM.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED> modify /c HSQLCC dba 5,1539offset 7733
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
4853514c 43430454 454d500778710818 0c3a3607 44454641 554c5416 44454641
<32 bytes per line>
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
4853514c 43430454 454d500778710818 l HSQLCC.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED> undo
BBED> modify /x 53595354454Dfilename ‘/oradata/epmsn/hsql01.dbf’ block 1539. offset 7733.
BBED-00209: invalid number(53595354454D)
BBED> d /v dba 5,1539 offset 7733count 32
File: /oradata/epmsn/hsql01.dbf(5)
Block: 1539 Offsets: 7733 to7764 Dba:0x01400603
4853514c 43430454 454d500778710818 l HSQLCC.TEMP.xq…
0c3a3607 44454641 554c541644454641 l .:6.DEFAULT.DEFA
<16 bytes per line>
BBED>
4.22 、 verify
verify 命令用于验证块的完整性。它执行与 dbverify 工具类似的功能。下面的例子显示了在一个块上使用的 verify 命令,该块已用 corrupt 标记为坏块 :
BBED> verify dba 5,1539
DBVERIFY - Verification starting
FILE = /oradata/epmsn/hsql01.dbf
BLOCK = 1539
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS;facility=BBED
4.23 、 corrupt
corrupt 命令用于将块标记为坏块。例如 :
BBED> corrupt dba 5,1539
Block marked media corrupt.
注意 :undo 命令不能撤消损坏。但是, revert 命令可以。
BBED> verify dba 5,1539
DBVERIFY - Verification starting
FILE = /oradata/epmsn/hsql01.dbf
BLOCK = 1539
Block Checking: DBA = 20973059, BlockType = KTB-managed data block
Found block already marked corrupted
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS;facility=BBED
BBED> revert dba 5,1539
All changes made to this block will berolled back. Proceed? (Y/N) Y
Reverted file’/oradata/epmsn/hsql01.dbf’, block 1539
BBED> verify dba 5,1539
DBVERIFY - Verification starting
FILE = /oradata/epmsn/hsql01.dbf
BLOCK = 1539
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS;facility=BBED
BBED>




