返回小栈
Oracle bbed工具介绍
orastar2020-03-23 14:25:19

1.    工具介绍



    Oracle bbed 工具,名称是Block Browser and EDitor的首字母缩写,Oracle 10G及以前版本它随数据库软件一起提供。仅供oracle内部使用,oracle公司从未发布任何关于它的细节说明。它是一个非常强大的工具,但也非常危险,因为它可以更改破坏任何oracle数据库的数据块

    如果您使用此工具,则您需要自行承担风险。使用此工具进行的任何修改都会导致数据库不受oracle的支持。

  bbed工具下载方法:

 1、Oracle 10G数据库软件中copy;

 2、关注公众号,回复“bbed”。

2、工具安装



    在使用bbed工具之前,必须将其链接起来。目标代码与unixlinux上的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.1set dba

使用标准的Oracle DBA(数据块地址)格式设置当前数据块。以文件id、块号  格式输入。例如,文件3的第632块将按如下方式访问:

BBED> set dba 3,632

如果成功,将使用访问块的RDBA(相对数据块地址)进行响应:

BBED> set dba 3,632

 DBA 0x00c00278 (12583544 3,632)

4.2set file

设置当前访问文件号,设置的文件号必须包含在启动时引用的filelist中,设置成功后,bbed将返回当前访问文件的id号。

BBED> set file 2

 FILE# 2

BBED> 

4.3set block

设置当前块。块是相对于已经设置的文件名或文件的。可以指定绝对块,或使用加号(+)(-)符号指定当前块的偏移量。如果成功,将响应显示当前块。

BBED> set block 16

 BLOCK# 16

BBED> set block +16

 BLOCK# 32

BBED> set block -8

 BLOCK# 24

BBED>

4.4set offset

设置当前偏移量。偏移量相对于已经设置的块。可以指定绝对偏移量,也可以使用加号(+)或减号(-)指定当前偏移量的偏移量。如果成功。bbed将响应显示当前偏移量。

BBED> set offset 16

 OFFSET 16

BBED> set offset -8

 OFFSET 8

BBED>

4.5set blocksize

设置当前文件块大小,设置的块大小必须与文件实际块大小匹配,否则将会报错,设置成功后,bbed将会显示当前块大小:

BBED> set blocksize 8192

 BLOCKSIZE 8192

BBED> set blocksize 4096

BBED-00307: incorrect blocksize (8192)or truncated file

BBED>

4.6set 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.7set width

设置输出宽度,如果未设置,bbed默认设置80个字符,例如,

BBED> set width 132

 WIDTH 132

BBED> 


4.8set count

dump命令中设置要显示的数据块的字节数。默认值是512。因此,要查看整个8Kb块,需要在偏移量512102415362048256030923604处转储该块8次。通过设置较高的计数每次将转储更多。通过减少它,可以实现更小的转储。如

BBED> set count 256

 COUNT 256

BBED>

4.9set ibase

设置内部数字基数。默认值是decimal。但是它也可以被设置为十六进制或八进制。这允许set文件、set块和set offset命令使用十进制的替代基数。如果成功,将显示当前的基础:

BBED> set ibase hex

 IBASE Hex


BBED> set block +A

 BLOCK# 11

4.10set mode

设置密肋模式。选项是浏览或编辑。在浏览模式下不能做任何改变。这是建议首次使用此工具的用户使用的模式,或者如果您打算只使用此工具查看数据块,也可以使用此模式。

4.11show

显示当前所有设置。例如,

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.12info

设置当前被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.13map

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 bas0x00103cce,那么块类型是06,SCN序列号是0x02。尾校验10x3cce0602:

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行。每个行指针需要两个字节,它们存储在从偏移量142202的块中。然后我们可以使用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.16e(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>


下面的示例显示了用于单步遍历块的第一和第二行的printexamine命令,:

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,则显示第7654行。由于没有低于第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.17copy

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.18assign

assign命令执行符号赋值,并进行类型和范围检查。对于当前偏移量,可以忽略目标或源。例如,下面的命令将当前偏移量的结构分配给文件4block 2的第一个ITL entry

BBED> assign dba 4, 2 ktbbhitl[0]

4.19sum

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.20push / pop

pushpop命令用于将文件、块和偏移位置推送到内存支持的堆栈上,然后再将它们弹出。这允许在检查或修改另一个位置时临时保存正在编辑的当前位置。

注意,堆栈只存储位置它不保存内容。

下面的示例显示了正在检查的文件7、块16、偏移量8163。位置是用push命令保存的。然后,我们移动到文件61,然后使用pop命令返回到DBA 716

BBED>push dba 7,16

BBED>set dba 6,1

BBED>pop

命令pop all可用于从堆栈中删除所有推入的条目。show all命令可用于显示所有保存的位置。

4.20revert

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.21undo

撤消命令回滚最后的修改或分配命令。如果再次发出撤消命令,则重新进行修改。下面的示例显示了一个正在撤消的修改命令:

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.22verify

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.23corrupt

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、文章涉及内容,请勿在生产环境模拟。

 


纸上得来终觉浅,绝知此事要躬行。--陆游



感谢您的阅读,如果您觉得有所收获,也欢迎把文章分享给您的朋友。






 


0
0