有人在Google新闻组上提出了一个问题:How can I get the BBED password?,继而引发了一场很有意思的讨论。
后来Pete Finnigan也在他的Blog写了一篇文章"An interesting thread on Oracle-l about BBED"描述这次有意思的探讨。
在讨论中,有一个有趣的观点提到,如果这个工具被广泛传播,那么可能有些人不是用BBED来修复数据,意外的破坏可能更为多见。最终的后果可能是Oracle彻底把这个工具移除。
BBED是Block Browser/Editor的缩写,是Oracle的一个内部工具,不对外发布文档及支持。
BBED随软件发布,但是我们需要进行简单的relink才能使用,relink请参考:How to compile Oracle
虽然BBED工具的使用存在很多风险,但是如果利用得当,可以以之解决很多棘手的问题。
本文简单介绍一下如何用BBED模拟坏块,以练习坏块修复等技术,此前我曾经介绍过另外一种方法,请参考:Oracle中模拟及修复数据块损坏
1.创建测试表
[oracle@jumper conner]$ sqlplus "/ as sysdba"
SQL*Plus: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
Connected to:
Oracle9i
With the Partitioning option
JServer Release
SQL> create table bbed tablespace users as select * from dba_tables;
Table created.
SQL> select count(*) from bbed;
COUNT(*)
----------
523
SQL> col segment_name for a10
SQL> select segment_name,file_id,block_id from dba_extents where segment_name='BBED';
SEGMENT_NA FILE_ID BLOCK_ID
---------- ---------- ----------
BBED 3 9
BBED 3 17
BBED 3 25
SQL> select count(*) from bbed;
COUNT(*)
----------
523
2.创建BBED参数文件等
[oracle@jumper conner]$ more filelist.txt
1 /opt/oracle/oradata/conner/system01.dbf 440401920
2 /opt/oracle/oradata/conner/undotbs01.dbf 104857600
3 /opt/oracle/oradata/conner/users01.dbf 27262976
[oracle@jumper conner]$ more par.bbd
blocksize=8192
listfile=filelist.txt
mode=edit
3.使用BBED
[oracle@jumper conner]$ bbed parfile=par.bbd
Password:
BBED: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> set file 3
FILE# 3
BBED> show
FILE# 3
BLOCK# 1
OFFSET 0
DBA 0x
FILENAME /opt/oracle/oradata/conner/users01.dbf
BIFILE bifile.bbd
LISTFILE filelist.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
4.回滚误操作
如果操作中发生误操作,可以使用revert命令回滚。
BBED> modify /x 0x
File: /opt/oracle/oradata/conner/users01.dbf (3)
Block: 1 Offsets: 1000 to 1511 Dba:0x
------------------------------------------------------------------------
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
<32 bytes per line>
BBED> revert
All changes made in this session will be rolled back. Proceed? (Y/N) Y
Reverted file '/opt/oracle/oradata/conner/users01.dbf', block 1
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
5.改写数据块
模拟坏块.
BBED> modify 1000 file 3 block 17
File: /opt/oracle/oradata/conner/users01.dbf (3)
Block: 17 Offsets: 1000 to 1511 Dba:0x
------------------------------------------------------------------------
03e80000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000
c3073825 ff
ffffffff
07454e41
073825ff
ffffff
454e4142
45440844 49534142
<32 bytes per line>
6.检查数据块损坏
使用verify命令,可以发现刚才修改的file 3 block 17已经被标记为损坏。
BBED> verify
DBVERIFY - Verification
FILE = /opt/oracle/oradata/conner/users01.dbf
BLOCK = 17
Block 17 is corrupt
***
Corrupt block relative dba: 0x
Bad check value found during verification
Data in bad block -
type: 6 format: 2 rdba: 0x
last change scn: 0x
consistency value in tail: 0xb5750601
check value in block header: 0x3006, computed block checksum: 0xe803
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks Marked Corrupt : 1
Total Blocks Influx : 0
BBED> quit
7.使用DBV检查
[oracle@jumper conner]$ dbv file=users01.dbf blocksize=8192
DBVERIFY: Release
Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
DBVERIFY - Verification
Page 17 is marked corrupt
***
Corrupt block relative dba: 0x
Bad check value found during dbv:
Data in bad block -
type: 6 format: 2 rdba: 0x
last change scn: 0x
consistency value in tail: 0xb5750601
check value in block header: 0x3006, computed block checksum: 0xe803
spare1: 0x0, spare2: 0x0, spare3: 0x0
***
DBVERIFY - Verification complete
Total Pages Examined : 128
Total Pages Processed (Data) : 107
Total Pages Failing (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing (Index): 0
Total Pages Processed (Other): 20
Total Pages Processed (Seg) : 0
Total Pages Failing (Seg) : 0
Total Pages Empty : 0
Total Pages Marked Corrupt : 1
Total Pages Influx : 0
8.全表扫描此时出现ORA-01578错误
重新启动数据库以后,执行全表扫描,此时错误出现:
SQL>
ORACLE instance
Total System Global Area 101782828 bytes
Fixed Size 451884 bytes
Variable Size 37748736 bytes
Database Buffers 62914560 bytes
Redo Buffers 667648 bytes
Database mounted.
Database opened.
SQL> select count(*) from bbed;
select count(*) from bbed
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 3, block # 17)
ORA-01110: data file 3: '/opt/oracle/oradata/conner/users01.dbf'
SQL>
以上方法仅供测试使用。