1. 工具介绍
Oracle bbed 工具,名称是Block Browser and EDitor的首字母缩写,Oracle 10G及以前版本它随数据库软件一起提供。仅供oracle内部使用,oracle公司从未发布任何关于它的细节说明。它是一个非常强大的工具,但也非常危险,因为它可以更改或破坏任何oracle数据库的数据块。
如果您使用此工具,则您需要自行承担风险。使用此工具进行的任何修改都会导致数据库不受oracle的支持。
bbed工具下载方法:
1、Oracle 10G数据库软件中copy;
2、关注公众号,回复“bbed”。
2、工具安装
在使用bbed工具之前,必须将其链接起来。目标代码与unix和linux上的oracle数据库一起提供和安装,但是安装程序并不链接它。要链接它,切换到rdbms/install目录并发出以下命令;
Oracle 10G:
1) 编译bbed
[oracle@sourcedb lib]$ cd$ORACLE_HOME/rdbms/lib
[oracle@sourcedb lib]$ make -fins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
2) 检查编译文件
现在您可以通过使用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]$
3) 修改环境变量
export PATH=$ORACLE_HOME/rdbms/lib/:$PATH
Oracle 11G:
1) 从10g copy文件到11g
cp$ORACLE_10g_HOME/rdbms/lib/ssbbded.o $ORACLE_11g_HOME/rdbms/lib
cp $ORACLE_10g_HOME/rdbms/lib/sbbdpt.o$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
2) 修改文件属主及权限
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
3) 编译bbed
[oracle@sourcedb lib]$ cd$ORACLE_HOME/rdbms/lib
[oracle@sourcedb lib]$ make -fins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
4) 检查编译文件
现在您可以通过使用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]$
5) 修改环境变量
exportPATH=$ORACLE_HOME/rdbms/lib/:$PATH
3、启动bbed
默认情况下,bbed工具链接在rdbms/lib目录中。因此,它不在通常的$ORACLE_HOME/bin目录中。链接的可执行文件可以移动到bin目录,也可以在rdbms/lib目录中启动.
*******将bbed生成路径添加到环境变量即可,/home/oracle/.bash_profile
exportPATH=$ORACLE_HOME/OPatch:$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 (c) 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 (c) 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 [ <SET parameter> | ALL ]
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]
</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
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] <target spec>=<source spec>
<target spec> : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol |*symbol ]
<source spec> : [ value | <target spec options> ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [ <bbed command> | ALL ]
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 (c) 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块,需要在偏移量、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 *
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,偏移量被转储:
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、(p)rint
print命令允许将数据结构打印为原始输出或格式化输出。可以使用该命令指定要打印的DBA、文件名、文件、块、偏移量。如果未指定当前文件,则将打印用set命令建立的块和偏移量。
如果仅使用要打印的块和偏移量发出打印命令,那么在该偏移量处将显示数据结构。例如,如果我们打印文件5、块1953、偏移量为的内容,则会返回数据结构为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]作为指针打印关于行的信息:
BBED> p kdbr[0]
sb2 kdbr[0] @142 7981
BBED> p *kdbr[0]
rowdata[3588]
-------------
ub1 rowdata[3588] @8105 0x2c
BBED>
由此我们可以确定第行从偏移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>
五、说明
1、以上内容为个人多次测试结果,由于个人原因,如有分析不足之处还请见谅及指正。
2、文章涉及内容,请勿在生产环境模拟。
纸上得来终觉浅,绝知此事要躬行。--陆游
感谢您的阅读,如果您觉得有所收获,也欢迎把文章分享给您的朋友。