BBED 安装与使用
Oracle8i 的BBED在windows 平台下的$ORACLE_HOME/bin下可以找到,9i中似乎未随软件发布,故在windows没有这个工具,
在linux上面有,需要编译。
在9i/10g中连接生成bbed:
cd $ORACLE_HOME/rdbms/lib
[oracle@yzf lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
Linking BBED utility (bbed)
rm -f /oracle/db/11.2.0.3/rdbms/lib/bbed
gcc -o /oracle/db/11.2.0.3/rdbms/lib/bbed -m64 -L/oracle/db/11.2.0.3/rdbms/lib/ -L/oracle/db/11.2.0.3/lib/ -L/oracle/db/11.2.0.3/lib/stubs/ /oracle/db/11.2.0.3/lib/s0main.o /oracle/db/11.2.0.3/rdbms/lib/ssbbded.o /oracle/db/11.2.0.3/rdbms/lib/sbbdpt.o `cat /oracle/db/11.2.0.3/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh `cat /oracle/db/11.2.0.3/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/db/11.2.0.3/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnnz11 -lzt11 -lztkg11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lmm -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/db/11.2.0.3/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/db/11.2.0.3/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 -lclient11 -lnnetd11 -lvsn11 -lcommon11 -lgeneric11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lcore11 -lsnls11 -lnls11 -lxml11 -lcore11 -lunls11 -lsnls11 -lnls11 -lcore11 -lnls11 `cat /oracle/db/11.2.0.3/lib/sysliblist` -Wl,-rpath,/oracle/db/11.2.0.3/lib -lm `cat /oracle/db/11.2.0.3/lib/sysliblist` -ldl -lm -L/oracle/db/11.2.0.3/lib
gcc: /oracle/db/11.2.0.3/rdbms/lib/ssbbded.o:没有那个文件或目录
gcc: /oracle/db/11.2.0.3/rdbms/lib/sbbdpt.o:没有那个文件或目录
make: *** [/oracle/db/11.2.0.3/rdbms/lib/bbed] 错误 1
缺少/oracle/db/11.2.0.3/rdbms/lib/ssbbded.o、 /oracle/db/11.2.0.3/rdbms/lib/sbbdpt.o 两个文件导致不能编译,故需从10G 环境寻找这两个文件,或网上下载
http://download.csdn.net/download/jycjyc/4578006
[oracle@yzf vm_share]$ cp sbbdpt.o $ORACLE_HOME/rdbms/lib
[oracle@yzf vm_share]$ cp ssbbded.o $ORACLE_HOME/rdbms/lib
[oracle@yzf vm_share]$ cp bbedus.msb $ORACLE_HOME/rdbms/mesg
BBED是Oracle 内部使用的命令,所以Oracle 不提供技术支持。 为了安全,BBED设置了口令保护,默认密码为blockedit
[oracle@yzf lib]$ bbed
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Wed Oct 28 10:35:49 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED>
BBED 安装OK
------------------------------------------------------------------------------------------------------------
BBED 损坏块:
create tablespace CORRUPT_TAB datafile '/oracle/db/oradata/co_tab.dbf' size 10M;
create table sdfd tablespace CORRUPT_TAB as select * from dba_tables;
create index sdsfd on sdfd(table_name)tablespace CORRUPT_TAB;
SQL> select file#||' '||name||' '||bytes from v$datafile ;
FILE#||''||NAME||''||BYTES
OWNER OBJECT_NAME OBJECT_ID DATA_OBJECT_ID SUBOBJECT_ OBJECT_TYP
---------- -------------------- --------- -------------- ---------- ----------
DSG SDFD 83112 83112 TABLE
查询对象SDFD 所在的dba:
select max(rowid),min(rowid) from SDFD
AAAUSoAAKAAAAHhAAG AAAUSoAAKAAAAFzAAA
SQL> select dbms_rowid.rowid_object('&&rowid') data_object_id#,
2 dbms_rowid.rowid_relative_fno('&&rowid') rfile#,
3 dbms_rowid.rowid_block_number('&&rowid') block#,
4 dbms_rowid.rowid_row_number('&&rowid') row#
5 from dual;
Enter value for rowid: AAAUSoAAKAAAAHhAAG
DATA_OBJECT_ID# RFILE# BLOCK# ROW#
--------------- ---------- ---------- ----------
83112 10 481 6
Enter value for rowid: AAAUSoAAKAAAAFzAAA
DATA_OBJECT_ID# RFILE# BLOCK# ROW#
--------------- ---------- ---------- ----------
83112 10 371 0
1 将上面查询出来的datafile信息保存到文本里
[oracle@yzf ~]$ cat filelist.txt
1 /oracle/db/oradata/yzf/system01.dbf 2013265920
2 /oracle/db/oradata/yzf/sysaux01.dbf 692060160
3 /oracle/db/oradata/yzf/undotbs01.dbf 833617920
4 /oracle/db/oradata/yzf/users01.dbf 2233466880
5 /oracle/db/oradata/yzf/goldengate.dbf 209715200
6 /oracle/db/oradata/yzf/CR_PAY_DATA.DBF 10485760
7 /oracle/db/oradata/yzf/CR_PAY_IDX.DBF 10485760
8 /oracle/db/oradata/yzf/crpay_data.dbf 10485760
9 /oracle/db/oradata/yzf/crpay_idx.dbf 10485760
10 /oracle/db/oradata/co_tab.dbf 10485760
2 创建parameter file:
[oracle@db2 ~]$ cat bbed.par
blocksize=8192
listfile=/u01/filelist.txt
mode=edit
3 使用parameter file 连接bbed:
[oracle@yzf ~]$ bbed parfile=bbed.par
Password:
BBED: Release 2.0.0.0.0 - Limited Production on Wed Oct 28 11:39:20 2015
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> show
FILE# 1
BLOCK# 1
OFFSET 0
DBA 0x00400001 (4194305 1,1)
FILENAME /oracle/db/oradata/yzf/system01.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> set dba 10,371
DBA 0x02800173 (41943411 10,371)
如果设置成功,会返回该block的RDBA (Relative Data Block Address),rdba就是rowid中的rfile#+block#。括号里面的是DBA值和block 和 file id。 我们验证一下:
SQL> variable dba varchar2(30);
SQL> exec :dba :=dbms_utility.make_data_block_address(10,371);
PL/SQL procedure successfully completed.
SQL> print dba
DBA
--------------------------------
41943411
BBED> show
FILE# 10
BLOCK# 371
OFFSET 0
DBA 0x02800173 (41943411 10,371)
FILENAME /oracle/db/oradata/co_tab.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> map
File: /oracle/db/oradata/co_tab.dbf (10)
Block: 371 Dba:0x02800173
------------------------------------------------------------
KTB Data Block (Table/Cluster)
struct kcbh, 20 bytes @0 -- Block Header Structure
struct ktbbh, 96 bytes @20 --Transaction Fixed Header Structure
struct kdbh, 14 bytes @124 --Data Header Structure
struct kdbt[1], 4 bytes @138 --Table Directory Entry Structure
sb2 kdbr[28] @142 --Row Directory
ub1 freespace[1013] @198
ub1 rowdata[6977] @1211
ub4 tailchk @8188 --(See Tailchecks below)
Differentblock types are designated by the first byte of the block. The following tableshows how to decode the block type:
不同的block 可以第一个byte的值是不一样的。 具体值对应block 类型如下:
Header Block Types
ID Type
01 Undo segment header
02 Undo data block
03 Save undo header
04 Save undo data block
05 Data segment header (temp, index, data and so on)
06 KTB managed data block (with ITL)
07 Temp table data block (no ITL)
08 Sort Key
09 Sort Run
10 Segment free list block
11 Data file header
Ifwe wanted to determine the number of rows in the block, we could print the dataheader structure or kdbh:
如果我们想确定block 中row的数量,可以print data header structure 或者kdbh。
BBED> p
kcbh.type_kcbh
--------------
ub1 type_kcbh @0 0x06
BBED> p ktbbh
struct ktbbh, 96 bytes @20
ub1 ktbbhtyp @20 0x01 (KDDBTDATA)
union ktbbhsid, 4 bytes @24
ub4 ktbbhsg1 @24 0x000144a8
ub4 ktbbhod1 @24 0x000144a8
BBED> p kdbhnrow
sb2 kdbhnrow @126 49
--这个block上总共有49 个rows。
find命令可以用来搜索关键字
BBED> find /c SYSTEM
COPY 复制块到指定的位置
BBED> copy dba 1,115362 to dba 1,115363
copy 是个危险的命令,慎用。
modify (m)修改
BBED> modify /c
使这些修改生效,就要使用sum命令。
SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
--push命令将对象放到内存的stack,pop 将对象从内存写回磁盘
BBED> verify file 10 验证
DBVERIFY - Verification starting
FILE = /oracle/db/oradata/co_tab.dbf
Block Checking: DBA = 41943411, Block Type = KTB-managed data block
data header at 0x2adc8debd27c
kdbchk: fsbo(74) wrong, (hsz 308)
Block 371 failed with check code 6129
DBVERIFY - Verification complete
Total Blocks Examined : 1280
Total Blocks Processed (Data) : 312
Total Blocks Failing (Data) : 1
Total Blocks Processed (Index): 14
Total Blocks Failing (Index): 0
Total Blocks Empty : 793
Total Blocks Marked Corrupt : 0
Total Blocks Influx : 0
Message 531 not found; product=RDBMS; facility=BBED
==============================================================================
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 ]
gt
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-1820553/
,如需转载,请注明出处,否则将追究法律责任。