做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 计算block的checksum,modify之后block就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。
undo 回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。
revert 回滚所有之前的修改操作,意思就是 undo all
重点关注 bbed 的dump(d) 、print(p) 、map、modify 命令
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/