ITPub博客

首页 > Linux操作系统 > Linux操作系统 > oracle bbed 工具的使用方法

oracle bbed 工具的使用方法

原创 Linux操作系统 作者:gengzhizhen 时间:2009-04-20 00:12:42 0 删除 编辑

oracle bbed 工具的使用方法  oracle bbed 工具的使用方法 - 冰雨 - 冰雨 Post By:2007-4-3 10:08:57

bbed就是英文block browse block edit的缩写,用来直接查看和修改数据文件数据的一个工具。

在windows上没有提供这个工具,在linux上面有,需要编译:

make -f ins_rdbms.mk BBED=$ORACLE_HOME/rdbms/lib/bbed $ORACLE_HOME/bin/bbed

然后把$ORACLE_HOME/rdbms/lib加到环境变量的PATH里面,就可以直接在命令中bbed了。

编译好了就可以使用了,不过有个默认的口令blockedit。

运行bbed之前先要自己写几个配置文件:

这里有2个 a.txt par.bbd

[oracle@vm1 oracle]$ ls

a.txt bifile.bbd Desktop log.bbd par.bbd

[oracle@vm1 oracle]$ more a.txt

6 /u01/oracle/oradata/test/users01.dbf 26222592

2 /u01/oracle/oradata/test/users01.dbf.bak 26222592

[oracle@vm1 oracle]$ more par.bbd

blocksize=8192

listfile=a.txt

mode=edit

编好了就可以运行bbed了

[oracle@vm1 oracle]$ bbed parfile=par.bbd

Password: --这里的密码 blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Wed Sep 14 16:18:31 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED>

先看看帮助,有那些命令:

BBED> help

HELP [ | ALL ]

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>

还真不少,下面是几个常用的:

set 设定当前的环境。

show 查看当前的环境参数,跟sqlplus的同名命令类似。

dump 列出指定block的内容

find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量--offset,偏移量就是在block中的字节数

modify 修改指定block的指定偏移量的值,可以在线修改。

copy 把一个block的内容copy到另一个block中

verify 检查当前环境是否有坏块

sum 计算block的checksum,modify之后block就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。

undo 回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。

revert 回滚所有之前的修改操作,意思就是 undo all

下面做些实验:

先建个表,插入1条数据。

[oracle@vm1 oracle]$ sqlplus

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Sep 14 16:46:15 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Enter user-name: / as sysdba

Connected to:

Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

SQL> create table haocp ( a varchar2(10)) tablespace users;

Table created.

SQL> insert into haocp values('a');

1 row created.

SQL> commit;

Commit complete.

SQL> select segment_name,file_id,block_id,blocks from dba_extents where segment_name = 'HAOCP';

SEGMENT_NAME

--------------------------------------------------------------------------------

FILE_ID BLOCK_ID BLOCKS

---------- ---------- ----------

HAOCP

6 33 8

表存放在file 6 block 33 - 33+8 上面,这时先关闭数据库,对users数据文件作个cp。

SQL> shutdown immediate

Database closed.

Database dismounted.

ORACLE instance shut down.

SQL> SQL> exit

Disconnected from Oracle9i Enterprise Edition Release 9.2.0.4.0 - Production

With the Partitioning option

JServer Release 9.2.0.4.0 - Production

[oracle@vm1 oracle]$

[oracle@vm1 test]$ pwd

/u01/oracle/oradata/test

[oracle@vm1 test]$ cp users01.dbf users01.dbf.bak

[oracle@vm1 test]$ sqlplus

SQL*Plus: Release 9.2.0.4.0 - Production on Wed Sep 14 16:56:30 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

Enter user-name: / as sysdba

Connected to an idle instance.

SQL> startup

ORACLE instance started.

Total System Global Area 185668648 bytes

Fixed Size 451624 bytes

Variable Size 117440512 bytes

Database Buffers 67108864 bytes

Redo Buffers 667648 bytes

Database mounted.

Database opened.

SQL>

重新启动完数据库,进入bbed

[oracle@vm1 oracle]$ ls

a.txt bifile.bbd Desktop log.bbd par.bbd

[oracle@vm1 oracle]$ pwd

/home/oracle

[oracle@vm1 oracle]$ bbed parfile=par.bbd

Password:

BBED: Release 2.0.0.0.0 - Limited Production on Wed Sep 14 17:06:24 2005

Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED> set file 6

FILE# 6

BBED> show

FILE# 6

BLOCK# 1

OFFSET 0

DBA 0x01800001 (25165825 6,1)

FILENAME /u01/oracle/oradata/test/users01.dbf

BIFILE bifile.bbd

LISTFILE a.txt

BLOCKSIZE 8192

MODE Edit

EDIT Unrecoverable

IBASE Dec

OBASE Dec

WIDTH 80

COUNT 512

LOGFILE log.bbd

SPOOL No

BBED>

刚才创建的haocp表在file 6 blcok 33 - 33+8上面,用bbed看看36的内容

BBED> dump file 6 block 36

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 0 to 511 Dba:0x01800024

------------------------------------------------------------------------

06020000 24008001 9dcc0300 00000106 d3aa0000 01000000 4f190000 9bcc0300

00000000 02003200 21008001 07000a00 54000000 84238000 17000b00 01200000

9dcc0300 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00010100 ffff1400 931f7b1f 7b1f0000 0100931f 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

<32 bytes per line>

BBED>

offset 偏移量 从 0 到 511 单位是字节,数据块是8k的,想看完全就要扩大offset的范围

BBED> dump file 6 block 36 count 8200

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 0 to 8191 Dba:0x01800024

------------------------------------------------------------------------

06020000 24008001 9dcc0300 00000106 d3aa0000 01000000 4f190000 9bcc0300

00000000 02003200 21008001 07000a00 54000000 84238000 17000b00 01200000

9dcc0300 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00010100 ffff1400 931f7b1f 7b1f0000 0100931f 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

之间略

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 0000002c 01010161 01069dcc

<32 bytes per line>

BBED>

Offsets: 0 to 8191 1024 * 8 = 8192个字节,正好8K。注意最后的几个字节中,有个61,这个就是表中的那条数据,验证一下。

SQL> select * from haocp;

A

----------

a

SQL> select dump(a,1016) from haocp;

DUMP(A,1016)

--------------------------------------------------------------------------------

Typ=1 Len=1 CharacterSet=ZHS16GBK: 61

字符a对应的16进制编码是61。如果数据量大的话,可以用find命令查找

BBED> help find

FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]

BBED> set file 6

FILE# 6

BBED> set block 36

BLOCK# 36

BBED> find 97 curr

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

BBED> find /x 61 curr

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

在find之前先设置想要查找的 file 和 block,默认是十进制的ascii编码,/x 表示16进制,find的结果显示出offset,即字符出现的位置。

下面试试修改他,把a改成b。

BBED> help modify

MODIFY[/x|d|u|o|c] numeric/character string

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

BBED> modify 98 file 6 block 36 offset 8187

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6201069d cc

<32 bytes per line>

修改完了以后,由61变成62了,不过这时数据块是损坏状态,试一下。

BBED> verify

DBVERIFY - Verification starting

FILE = /u01/oracle/oradata/test/users01.dbf

BLOCK = 36

Block 36 is corrupt

***

Corrupt block relative dba: 0x01800024 (file 0, block 36)

Bad check value found during verification

Data in bad block -

type: 6 format: 2 rdba: 0x01800024

last change scn: 0x0000.0003cc9d seq: 0x1 flg: 0x06

consistency value in tail: 0xcc9d0601

check value in block header: 0xaad3, computed block checksum: 0x300

spare1: 0x0, spare2: 0x0, spare3: 0x0

***

DBVERIFY - Verification complete

Total Blocks Examined : 1

Total Blocks Processed (Data) : 0

Total Blocks Failing (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing (Index): 0

Total Blocks Empty : 0

Total Blocks Marked Corrupt : 1

Total Blocks Influx : 0

Total Blocks Marked Corrupt : 1

有1个块被标识为损坏,从刚才备份的那个文件覆盖它。

BBED> copy file 2 block 36 to file 6 block 36

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 0 to 511 Dba:0x01800024

------------------------------------------------------------------------

06020000 24008001 9dcc0300 00000106 d3aa0000 01000000 4f190000 9bcc0300

00000000 02003200 21008001 07000a00 54000000 84238000 17000b00 01200000

9dcc0300 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00010100 ffff1400 931f7b1f 7b1f0000 0100931f 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000

<32 bytes per line>

从刚才关闭数据库时cp的文件中复制第36个块来覆盖当前的块,覆盖完了再检查一下。

BBED> verify

DBVERIFY - Verification starting

FILE = /u01/oracle/oradata/test/users01.dbf

BLOCK = 36

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

好了,看看8187的情况

BBED> dump file 6 block 36 offset 8187

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

是原来的61,也就是字符 a 。再次改过来,试试回滚的命令。

BBED> modify /x 62 file 6 block 36 offset 8187

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6201069d cc

<32 bytes per line>

BBED> undo

BBED> modify /x 61 filename '/u01/oracle/oradata/test/users01.dbf' block 36. offset 8187.

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

undo就相当于sqlplus里面的 rollback 不过是回滚上一步,而不是所有操作。

下面试试revert,不过要重新登陆,因为revert是回滚这次登陆以来所有的操作。

BBED> dump file 6 block 36 offset 8187

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

BBED> modify /x 62 file 6 block 36 offset 8187

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6201069d cc

<32 bytes per line>

BBED> revert

All changes made in this session will be rolled back. Proceed? (Y/N) y

Reverted file '/u01/oracle/oradata/test/users01.dbf', block 36

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

BBED> dump file 6 block 36 offset 8187

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

个人感觉bbed主要用在数据库恢复的时候,比如由于误操作把数据库的字典表的信息改错了,导致数据库不能启动了,此时用bbed在脱机的情况下把字典表的值再改回来。使数据库open。

用modify改完数据之后,block处于corrupt状态,所以要通过sum命令计算并应用checksum值,使block状态恢复正常。

SQL> select * from haocp;

A

----------

a

BBED> dump file 6 block 36 offset 8187

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6101069d cc

<32 bytes per line>

BBED> modify /x 62 file 6 block 36 offset 8187

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

File: /u01/oracle/oradata/test/users01.dbf (6)

Block: 36 Offsets: 8187 to 8191 Dba:0x01800024

------------------------------------------------------------------------

6201069d cc

<32 bytes per line>

BBED> verify

DBVERIFY - Verification starting

FILE = /u01/oracle/oradata/test/users01.dbf

BLOCK = 36

Block 36 is corrupt

***

Corrupt block relative dba: 0x01800024 (file 0, block 36)

Bad check value found during verification

Data in bad block -

type: 6 format: 2 rdba: 0x01800024

last change scn: 0x0000.0003cc9d seq: 0x1 flg: 0x06

consistency value in tail: 0xcc9d0601

check value in block header: 0xaad3, computed block checksum: 0x300

spare1: 0x0, spare2: 0x0, spare3: 0x0

***

DBVERIFY - Verification complete

Total Blocks Examined : 1

Total Blocks Processed (Data) : 0

Total Blocks Failing (Data) : 0

Total Blocks Processed (Index): 0

Total Blocks Failing (Index): 0

Total Blocks Empty : 0

Total Blocks Marked Corrupt : 1

Total Blocks Influx : 0

修改完之后block的状态是corrupt的。用sum命令使之有效。

BBED> help sum

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

BBED> sum file 6 block 36

Check value for File 6, Block 36:

current = 0xaad3, required = 0xa9d3

此时 current checksum 是0xaad3,required checksum 是 0xa9d3

BBED> sum file 6 block 36 apply

Check value for File 6, Block 36:

current = 0xa9d3, required = 0xa9d3

加上apply参数,使checksum一致。此时block状态恢复正常。

BBED> verify

DBVERIFY - Verification starting

FILE = /u01/oracle/oradata/test/users01.dbf

BLOCK = 36

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

看看数据库的数据

SQL> select * from haocp;

A

----------

a

还是 a ,重启一下。

SQL> startup force

ORACLE instance started.

Total System Global Area 185668648 bytes

Fixed Size 451624 bytes

Variable Size 117440512 bytes

Database Buffers 67108864 bytes

Redo Buffers 667648 bytes

Database mounted.

Database opened.

SQL> select * from haocp;

A

----------

b

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/15142212/viewspace-590966/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2009-02-09

  • 博文量
    119
  • 访问量
    204097