1、11g下bbed的安装
windows环境下没有提供bbed,以下操作均为linux环境下操作。
11g下编译安装bbed缺少文件,需要从10g中拷贝相关文件
其中把sbbdpt.o和ssbbded.o拷贝到$ORACLE_HOME/rdbms/lib/目录下。
把bbedus.msb和bbedus.msg拷贝到$ORACLE_HOME/mesg/目录下。
bbedus.msb拷贝到$ORACLE_HOME/rdbms/mesg目录下。
然后手动编译
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
编译成功后即可直接使用bbed进入bbed交互界面,默认密码为blockedit。
2、bbed的使用
1、生成listfile文件
可以通过以下sql生成listfile的内容
select file#||' '||name||' '||bytes from v$datafile;
8 /u01/app/oracle/oradata/ISMDB/ts_wjf.dbf 52428800
把内容存保存到一个文件里,/home/wjf/listfile.txt。
2、生成bbed参数文件
编辑一个文件,如/home/wjf/bbed.par
写入
mode=edit
listfile=/home/wjf/listfile.txt
blocksize=8192
3、使用bbed命令进入bbed
bbed parfile=/home/wjf/bbed.par
会提示输入密码,默认为blockedit。
首先可以使用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 [
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]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
CORRUPT [ DBA | FILE | FILENAME | BLOCK ]
以上命令也可以分为几部分去理解
显示信息的
SHOW [
INFO ----查看listfile的信息
MAP[/v] [ DBA | FILENAME | FILE | BLOCK ] ------打印出块结构,这个MAP经常是设置好块信息之后首先要做的,它就行一张块地图。
PRINT[/x|d|u|o|c] [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ] -----打印出各种信息,主要打印块的各结构块信息
DUMP[/v] [ DBA | FILENAME | FILE | BLOCK | OFFSET | COUNT ] ------dump出块中存储的十六进制数据
HELP [
设置当前操作环境的
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 ]
进行块修改等操作的
COPY [ DBA | FILE | FILENAME | BLOCK ] TO [ DBA | FILE | FILENAME | BLOCK ]
FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
MODIFY[/x|d|u|o|c] numeric/character string
[ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
VERIFY [ DBA | FILE | FILENAME | BLOCK ]
/x 十六进制
/d 有符号数的十进制
/u 无符号的十进制
/o 八进制
/c 字符串
/n Oracle中的Number类型
/t Oracle中的Data类型
/i Oracle中的RowID类型
具体说说bbed的输出
进入bbed后,首先需要定位到你要查看和修改的块
确认你的当前环境
查看块信息
Unit Size中的bn表示n个字节,前缀u和s分别表示unsigned[无符号数]和signed[有符号数,用一位二进制数表示符号位]
查看具体每个结构的内容
查看块头
查看事务区
查看数据区头部
表目录、行目录其实就是记录了些有关表和行的信息,空闲区和数据区就是具体的数据存储。
查看块尾检查位
检查位
tailchk值为bas_kcbh(0x 1f09 754e) 的最后2bytes即754e
和type_kcbh(0x06)
和seq_kcbh(0x01)
拼出来的。
其他的字段含义可以参考另一个文档,oracle数据块解析。
修改块的值
1、修改前先备份
copy file 8 block 131 to file 8 block 147
2、确定修改值的偏移量
如果是块结构部分的值,则可以查看偏移量。
如果是数据部分,则可以通过find确定偏移量。
find /c 要查找的字符
/x 十六进制
/d 有符号数的十进制
/u 无符号的十进制
/o 八进制
/c 字符串
就可以定位到要查找字符的偏移量。
3、确认定位的位置
find之后当前offset就会被设置为查找到的字符的offset。
直接使用dump /v可以查看部分能翻译过来的字符。
4、修改字符
把“王”该成“李”
首先查出来李的编码
使用modify命令修改
modify /x c0ee dba 8,131 offset 4466
5、重新计算chkval值并应用。
sum apply
在执行这个命令之前,verify一下,这个块已被标记为坏块,使用sum计算一下,显示了chkval的现值和正确值。
这样就OK了。
如果要回退
undo
回退上一次modify或者assign操作
revert
回滚一个文件和一个block至bbed启动时的状态
不带参数将回滚bbed会话中的所有更改