暂无图片
暂无图片
5
暂无图片
暂无图片
暂无图片

BBED-Oracle数据块修改工具编译安装和使用

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

bbed工具下载方法:

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

在使用 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

  1. 检查编译文件

现在您可以通过使用 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]$

  1. 修改环境变量

export PATH=ORACLEHOME/rdbms/lib/:ORACLE_HOME/rdbms/lib/:PATH

2、 11g以及12c及19c版本:(本人测试环境为11g/12c/19c)

下面以Oracle 11G环境编译安装BBED:

  1. 从 10g copy 文件到 11g

cp$ORACLE_10g_HOME/rdbms/lib/ssbbded.o $ORACLE_11g_HOME/rdbms/lib

cp ORACLE10gHOME/rdbms/lib/sbbdpt.oORACLE_10g_HOME/rdbms/lib/sbbdpt.oORACLE_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

  1. 修改文件属主及权限

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

  1. 编译 bbed

[oracle@sourcedb lib]$ cd$ORACLE_HOME/rdbms/lib

[oracle@sourcedb lib]$ make -fins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

  1. 检查编译文件

现在您可以通过使用 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]$

  1. 修改环境变量

exportPATH=ORACLEHOME/rdbms/lib/:ORACLE_HOME/rdbms/lib/:PATH

3 、启动 bbed

 默认情况下, bbed 工具链接在 rdbms/lib 目录中。因此,它不在通常的 $ORACLE_HOME/bin 目录中。链接的可执行文件可以移动到 bin 目录,也可以在 rdbms/lib 目录中启动 .

******* 将 bbed 生成路径添加到环境变量即可, /home/oracle/.bash_profile

exportPATH=ORACLEHOME/OPatch: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 © 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 [ | 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]

:

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] =

: [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol |*symbol ]

: [ value | ]

SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]

PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]

POP [ALL]

REVERT [ DBA | FILE | FILENAME | BLOCK ]

UNDO

HELP [ | 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 © 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>

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

文章被以下合辑收录

评论