在linux上面有,需要编译:
cd $ORACLE_HOME/rdbms/lib
make -f ins_rdbms.mk BBED=$ORACLE_HOME/rdbms/lib/bbed $ORACLE_HOME/bin/bbed
或者
make –f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
然后把$ORACLE_HOME/rdbms/lib加到环境变量的PATH里面,就可以直接在命令中bbed了。
口令是blockedit
filename 是bbed需要处理的oracle文件名,如果处理单个文件,可以使用这个参数,如果使用多个文件,建议使用listfile来代替这个参数
listfile 对应一个文件名,文件里记录
1
2
文件id 加上文件名
mode 有两个取值,一个是browse,也就是仅仅浏览数据,不做修改。
blocksize
spool =yes|no
cmdfile=文件名
logfile=文件名
parfile =文件名
bifile
revert=yes|no
slient=yes|no
bbed
这里有2个 a.txt par.bbd
[oracle@vm1 oracle]$ ls
a.txt bifile.bbd Desktop log.bbd par.bbd
[oracle@vm1 oracle]$ more listfile.txt
6 /u01/oracle/oradata/test/users01.dbf 26222592
2 /u01/oracle/oradata/test/users01.dbf.bak 26222592
[oracle@vm1 oracle]$ more parfile.txt
blocksize=8192
listfile=a.txt
mode=edit
spool=yes
BBED>
先看看帮助,有那些命令:
BBED> help
HELP [ <bbed command> | 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 [ <SET parameter> | 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 ]
</Nuf>:
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] <target spec>=<source spec>
<target spec> : [ DBA | FILE | FILENAME | BLOCK | OFFSET | symbol | *symbol ]
<source spec> : [ value | <target spec options> ]
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
PUSH [ DBA | FILE | FILENAME | BLOCK | OFFSET ]
POP [ALL]
REVERT [ DBA | FILE | FILENAME | BLOCK ]
UNDO
HELP [ <bbed command> | 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
set file 4
set offset 70
set count 8192
dump datatfile 4 block 60
set block 60
find
find 98 curr
可显示字符 二进制 十进制 十六进制 字符
0110
modify 97 file 4 blcok 79 offset 8187
modify /x 0x5d offset 1072
verify
数据库关闭后,可以拷贝一个文件到外面,修改错误后,可以把原来的块拷贝过来覆盖
拷贝的文件 的文件号 自己命名一个就可以了
copy file 2 block 36 to file 6 block 36
undo
revert
help sum
sum file 4 block 79
sum file 4 block 79 apply
verify
set mode edit
map 查看数据块的结构,当前的
p kcbh
p ktbbh.ktbbhitl[1]
p ktbbh.ktbbhitl[1].ktbitflag
map /v
modify /x 0x0080 ktbbh.ktbbhit[1].ktbitflag
sum apply
print 530
flag
-----也是0x0004,---U-,也是0x2001
如何计算数据块中某个字段的位置
offs=0x232
对于字典类表空间
对于本地类表空间
对于自动管理本地表空间 56 itl*24
对于手动管理本地表空间 48 itl*24
比如手动管理本地表空间 48 itl*24
tab 0, row 12, @0x4c2
tl: 26 fb: --H-FL-- lb: 0x1
col
col
col
select to_number('4c2','xxxxxx') 1*24 48=1290
而如果要看col 2 的位置,那儿要加上 19,也就是1309 才是c2的位置
19=1 16 1 1
索引的计算方法
base itl*24 44
row#13[969] flag: ------, lock: 0, len=12, data:(6):
col 0; len 3; (3):
select 969 24*2 44 from dual;