bbed 给自己的参考

这几天一直在看 bbed ,看的进度实在是有点慢,哎,这里记录下一些内容,便于以后参考(来源《 dissassembling_the_data_block.pdf 》)

bbed 千万要慎重,因为没有 oracle 的官方支持,而且,在没有把握的时候,千万不要做,要不然,可能引起不可预知的后果,就算做了,也要知道,做完以后,如果要回退,怎么个回退。

首先,需要安装 bbed ,在 linux 中,步骤是:

[oracle@localhost ~]$ cd $ORACLE_HOME/rdbms/lib

[oracle@localhost lib]$make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

这时,会在 lib 底下生成 bbed 的可执行文件

[oracle@localhost lib]$ls –al bbed

-rwxr-xr-x 1 oracle dba 301257 2010-12-17 10:10 bbed*

那么,但是我们运行 bbed 还是会报错,因为在 环境变量 PATH 中,还没有 bin 底下还没有 bbed 的命令,我是直接将这个 bbed copy oracle bin 目录底下就可以了

       接着,配置 bbed

Bbed 需要两种配置文件,在这里,我的分别是:

[oracle@localhost bbed]$ cat bbed.par

blocksize=8192

listfile=/home/oracle/txt/bbed/filelinux1.log

mode=edit

 

[oracle@localhost bbed]$ cat filelinux1.log

1       /txtdata/system01.dbf       340787200

2       /txtdata/undotbs01.dbf       209715200

3       /txtdata/users01.dbf       104857600

4       /txtdata/indx01.dbf       104857600

5       /txtdata/test01.dbf       524288000

filelinux1.log 的文件的内容可以通过如下 语句 取得:

SELECT file#||CHR(9)||NAME||CHR(9)||bytes FROM v$datafile;

关于 bbed 的配置文件的一些选项

另外,在 filelinux1.log 中,文件的序号和 数据库里面的 file# 其实并没有关联,我们只是为了统一才把 filelinux1.log 中的文件号 数据库的 file# 设成一样,如果我们设成:

5       /txtdata/system01.dbf       340787200

4       /txtdata/undotbs01.dbf       209715200

3       /txtdata/users01.dbf       104857600

2       /txtdata/indx01.dbf       104857600

1       /txtdata/test01.dbf       524288000

也是可以的,那我们在 使用 bbed 的时候,就要以 filelinux1.log 为准。

       另外,bbed 的默认 密码   blockedit,切记切记

      

然后,bbed 的一些有用的命令:

BBED>help all –可以查看 所有可用的命令 ,这个还是非常有用的

BBED> show all  -- 这个跟 rman show all 一样,查看当前 bbed 的配置

set 设定当前的环境。

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

dump 列出指定block的内容

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

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

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

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

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

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

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

重点关注 bbed dump(d) print(p) mapmodify 命令

Dump map 经常 /v 一起使用,表名 显示详细信息

另外,map 的时候,以下几个是 block 的结构参考内容:

Modify 的时候,有几个 参数需要考虑

修改相应的 数值类型,就需要用到相应的参数,比如 修改 字符类型,就需要这样:

BBED> modify /c aa dba 5,10 offset 8188

修改 数字类型,就需要这样

BBED> modify /d 1 dba 5,10 offset 8188

 

下面是一个例子,也就是我们在 查询 数据的时候,会报出著名的 1578 的错误

Sql>select * from test_a;

Ora-01578  …..

然后,alert 文件中,可以看到如下内容:

replication_dependency_tracking turned off (no async multimaster replication found)

Completed: ALTER DATABASE OPEN

***

Corrupt block relative dba: 0x0140000a (file 5, block 10)

Fractured block found during buffer read

Data in bad block -

 type: 6 format: 2 rdba: 0x0140000a

 last change scn: 0x0000.00019c5e seq: 0x1 flg: 0x06

 consistency value in tail: 0x9c5ef06c

 check value in block header: 0x9a9a, computed block checksum: 0x0

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

***

Reread of rdba: 0x0140000a (file 5, block 10) found same corrupted data

 

原因是 我修改了 这个 block 结尾,也就是 8188 8191    2 bytes

通过 bbed p tailchk 可以看出问题

BBED> modify /d 1 dba 5,10 offset 8188   -->1 改成 6 ,就会出现上面的错误

 

BBED> p tailchk

ub4 tailchk                                 @8188     0x01065e9c

 

这个 tailchk 合成是根据

BBED> p kcbh

struct kcbh, 20 bytes                       @0      

ub1 type_kcbh                            @0        0x06       -- 这个

ub1 frmt_kcbh                            @1        0x02

ub1 spare1_kcbh                          @2        0x00

ub1 spare2_kcbh                          @3        0x00

ub4 rdba_kcbh                            @4        0x0140000a

ub4 bas_kcbh                             @8        0x00019c5e --这个的后四位

ub1 seq_kcbh                             @14       0x01       -- 这个

ub1 flg_kcbh                           @15     0x06 (KCBHFDLC, KCBHFCKV)

ub2 chkval_kcbh                          @16       0xa932

ub2 spare3_kcbh                          @18       0x0000

 

上面有标注的一起合成的,合成的规则是  bas_kcbh的后四位+type_kcbh+seq_kcbh

 

但是,当我们修改时,需要颠倒过来 拼,也就是要改成 01065e9c

所以,在 bbed  modify 中,要这么改

 

BBED> modify /x 01065e9c dba 5,10 offset 8188

 File: /txtdata/test01.dbf (5)

 Block: 10               Offsets: 8188 to 8191           Dba:0x0140000a

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

 01065e9c

 

 <32 bytes per line>

 

BBED> sum dba 5,10 apply

Check value for File 5, Block 10:

current = 0x6cf7, required = 0x6cf7

 

这样,对于这个坏块的修改就算是 完成了

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

转载于:http://blog.itpub.net/14730395/viewspace-682274/

你可能感兴趣的:(bbed 给自己的参考)