修改数据库数据块损坏通常使用的方法是RMAN修复和BBED修复,在没有RMAN备份的情况下,牢靠的掌握使用BBED工具是一项必备技能了。
BBED 全称是 block browser and editor,在oracle 7 到 oracle 10g版本中是存在BBED 组件的,从11g开始bbed已经不存在了,需要手动的从10g中获取并编译安装才可以使用。
需要使用的文件如下,并放着到对应目录下
一、BBED 的编译安装
二、BBED 帮助说明,我们通常是通过设置parfile的方式设置默认值登录;另外一种方式 命令模式 bbed password=blockedit blocksize=8192 listfile=
listfile=/home/oracle/bbed_10g_64/file.txt
mode=edit
验证登录,成功。 登录密码为blockedit
三、创建测试数据并查询数据块和数据文件number
四、通过BBED验证数据修改。对于还数据存在'脏块'中的数据 ,需要强制检查点归档;写入数据文件,可以查找到AAAA和BBBB记录。
五、修改数据块
在SQL/PLUS 端验证修改记录成功。对于修改完成后,仍然无法查询到修改结构的情况,说明内存中的数据并未写入数据文件 所以仍然是旧数据,对于测试库可以通过flush shared_pool或buffer cache的形式触发物理读写,或是其他方式。
BBED 全称是 block browser and editor,在oracle 7 到 oracle 10g版本中是存在BBED 组件的,从11g开始bbed已经不存在了,需要手动的从10g中获取并编译安装才可以使用。
需要使用的文件如下,并放着到对应目录下
点击(此处)折叠或打开
- bbedus.msb => $ORACLE_HOME/rdbms/mesg
- sbbdpt.o => $ORACLE_HOME/rdbms/lib
- ssbbded.o => $ORACLE_HOME/rdbms/lib
点击(此处)折叠或打开
- [oracle@Primary lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
- Linking BBED utility (bbed)
- rm -f /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/bbed
- gcc -o /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/bbed -m64 -z noexecstack -L/oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/ -L/oracle/database/product/11.2.0.4.0/db_1/lib/ -L/oracle/database/product/11.2.0.4.0/db_1/lib/stubs/ /oracle/database/product/11.2.0.4.0/db_1/lib/s0main.o /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/ssbbded.o /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/sbbdpt.o `cat /oracle/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh `cat /oracle/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/database/product/11.2.0.4.0/db_1/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/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/database/product/11.2.0.4.0/db_1/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/database/product/11.2.0.4.0/db_1/lib/sysliblist` -Wl,-rpath,/oracle/database/product/11.2.0.4.0/db_1/lib -lm `cat /oracle/database/product/11.2.0.4.0/db_1/lib/sysliblist` -ldl -lm -L/oracle/database/product/11.2.0.4.0/db_1/lib
- [oracle@Primary lib]$ make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
make: `/oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/bbed' is up to date.
[oracle@Primary lib]$ make -f $ORACLE_HOME/rdbms/lib/ins_rdbms.mk BBED=$ORACLE_HOME/bin/bbed $ORACLE_HOME/bin/bbed
Linking BBED utility (bbed)
rm -f /oracle/database/product/11.2.0.4.0/db_1/bin/bbed
gcc -o /oracle/database/product/11.2.0.4.0/db_1/bin/bbed -m64 -z noexecstack -L/oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/ -L/oracle/database/product/11.2.0.4.0/db_1/lib/ -L/oracle/database/product/11.2.0.4.0/db_1/lib/stubs/ /oracle/database/product/11.2.0.4.0/db_1/lib/s0main.o /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/ssbbded.o /oracle/database/product/11.2.0.4.0/db_1/rdbms/lib/sbbdpt.o `cat /oracle/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh `cat /oracle/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/database/product/11.2.0.4.0/db_1/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/database/product/11.2.0.4.0/db_1/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /oracle/database/product/11.2.0.4.0/db_1/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/database/product/11.2.0.4.0/db_1/lib/sysliblist` -Wl,-rpath,/oracle/database/product/11.2.0.4.0/db_1/lib -lm `cat /oracle/database/product/11.2.0.4.0/db_1/lib/sysliblist` -ldl -lm -L/oracle/database/product/11.2.0.4.0/db_1/lib
[oracle@Primary lib]$
点击(此处)折叠或打开
- [oracle@Primary ~]$ bbed help =y
- PASSWORD - Required parameter
- FILENAME - Database file name
- BLOCKSIZE - Database block size
- LISTFILE - List file name
- MODE - [browse/edit]
- SPOOL - Spool to logfile [no/yes]
- CMDFILE - BBED command file name
- LOGFILE - BBED log file name
- PARFILE - Parameter file name
- BIFILE - BBED before-image file name
- REVERT - Rollback changes from BIFILE [no/yes]
- SILENT - Hide banner [no/yes]
- HELP - Show all valid parameters [no/yes]
- [oracle@Primary bbed_10g_64]$ cat bbed.par
blocksize=8192
listfile=/home/oracle/bbed_10g_64/file.txt
mode=edit
[oracle@Primary bbed_10g_64]$ cat file.txt
1 /oracle/database/oradata/primary/system01.dbf 796917760
2 /oracle/database/oradata/primary/sysaux01.dbf 692060160
3 /oracle/database/oradata/primary/undotbs01.dbf 178257920
4 /oracle/database/oradata/primary/users01.dbf 243793920
5 /oracle/database/oradata/primary/perfstat.dbf 524288000
6 /oracle/database/oradata/primary/enmo.dbf 5242880
7 /oracle/database/oradata/primary/enmo01.dbf 5242880
8 /oracle/database/oradata/primary/enmo02.dbf 5242880
9 /oracle/database/oradata/primary/enmo003.dbf 5242880
10 /oracle/database/oradata/primary/users.dbf 31457280
11 /oracle/database/oradata/primary/tbs01.dbf 10485760
点击(此处)折叠或打开
- [oracle@Primary ~]$ bbed parfile=/home/oracle/bbed_10g_64/bbed.par
- Password:
- BBED: Release 2.0.0.0.0 - Limited Production on Thu Jul 21 18:23:33 2016
- Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
- ************* !!! For Oracle Internal Use only !!! ***************
- BBED>
点击(此处)折叠或打开
- SQL> create table tt (id number ,name varchar2(10)) tablespace tbs;
-
- Table created.
-
- SQL> insert into tt values (1,'AAAA');
-
- 1 row created.
-
- SQL> insert into tt values (2,'BBBB');
-
- 1 row created.
-
- SQL> commit;
-
- Commit complete.
-
- #查询数据行所在的数据文件和数据块号
-
- SQL> select dbms_rowid.rowid_block_number(rowid) blocknum,dbms_rowid.rowid_relative_fno(rowid) fileNo, id ,name from tt;
-
- BLOCKNUM FILENO ID NAME
- ---------- ---------- ---------- --------------------
- 131 11 1 AAAA
- 131 11 2 BBBB
-
- SQL> select file#||' '||name||' '||bytes from v$datafile;
-
- FILE#||''||NAME||''||BYTES
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
- 1 /oracle/database/oradata/primary/system01.dbf 796917760
- 2 /oracle/database/oradata/primary/sysaux01.dbf 692060160
- 3 /oracle/database/oradata/primary/undotbs01.dbf 178257920
- 4 /oracle/database/oradata/primary/users01.dbf 243793920
- 5 /oracle/database/oradata/primary/perfstat.dbf 524288000
- 6 /oracle/database/oradata/primary/enmo.dbf 5242880
- 7 /oracle/database/oradata/primary/enmo01.dbf 5242880
- 8 /oracle/database/oradata/primary/enmo02.dbf 5242880
- 9 /oracle/database/oradata/primary/enmo003.dbf 5242880
- 10 /oracle/database/oradata/primary/users.dbf 31457280
- 11 /oracle/database/oradata/primary/tbs01.dbf 10485760
-
- 11 rows selected.
-
- SQL> alter system switch logfile;
-
- System altered.
-
- SQL> commit
四、通过BBED验证数据修改。对于还数据存在'脏块'中的数据 ,需要强制检查点归档;写入数据文件,可以查找到AAAA和BBBB记录。
点击(此处)折叠或打开
- BBED> d
- File: /oracle/database/oradata/primary/tbs01.dbf (11)
- Block: 131 Offsets: 0 to 511 Dba:0x02c00083
- ------------------------------------------------------------------------
- 00a20000 83000000 00000000 00000105 83a70000 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 00000000 00000000 00000000
- <32 bytes per line>
- BBED> map
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Dba:0x02c00083
------------------------------------------------------------
BBED-00400: invalid blocktype (00) - /*
- 通过上述dump发现,只有数据文件的文件头数据,其他数据均为0,并且map命令提示BBED-00400错误;表明通过步骤二insert到表tt的数据为写入数据文件。
- */
-
- BBED> dump
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Offsets: 0 to 511 Dba:0x02c00083
------------------------------------------------------------------------
06a20000 8300c002 9d374a00 00000106 02730000 01000000 35580100 9a374a00
00000000 02003200 8000c002 02000600 931e0000 5a09c000 27031100 02200000
9d374a00 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00010200 ffff1600 821f6c1f 6c1f0000 02008d1f 821f331e d81d171b
2b1c631a 0a1ab019 5619fc18 511eb01b 1f1d5d1d 351bdb1a 281ace19 74191a19
c0180000 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> show all
FILE# 11
BLOCK# 131
OFFSET 8184
DBA 0x02c00083 (46137475 11,131)
FILENAME /oracle/database/oradata/primary/tbs01.dbf
BIFILE bifile.bbd
LISTFILE /home/oracle/bbed_10g_64/file.txt
BLOCKSIZE 8192
MODE Edit
EDIT Unrecoverable
IBASE Dec
OBASE Dec
WIDTH 80
COUNT 512
LOGFILE log.bbd
SPOOL No
BBED> set offset 0
OFFSET 0 -
- # FIND[/x|d|u|o|c] numeric/character string [ TOP | CURR ]
- #通过find 命令查找字符串BBBB
-
- BBED> find /c BBBB
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Offsets: 8173 to 8191 Dba:0x02c00083
------------------------------------------------------------------------
42424242 2c010202 c1020441 41414101 069d37
<32 bytes per line>
通过find 命令查找字符串AAAA
BBED> find /c AAAA
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Offsets: 8184 to 8191 Dba:0x02c00083
------------------------------------------------------------------------
41414141 01069d37
<32 bytes per line>
/* - 通过BBED验证了步骤三中tt表数据存储位置: 数据文件11 数据块 131 offset 8173 to 8191
- */
BBED> dump /v dba 11,131 offset 8173
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Offsets: 8173 to 8191 Dba:0x02c00083
-------------------------------------------------------
42424242 2c010202 c1020441 41414101 l BBBB,......AAAA.
069d37 l ..7
<16 bytes per line>
BBED> dump /v dba 11,131 offset 8184
File: /oracle/database/oradata/primary/tbs01.dbf (11)
Block: 131 Offsets: 8184 to 8191 Dba:0x02c00083
-------------------------------------------------------
41414141 01069d37 l AAAA...7
<16 bytes per line>
点击(此处)折叠或打开
- /*
- 数据文件11 数据块131 offset8184位置存储的内容为AAAA,现在我们修改为ABCDE,比AAAA多一个字母E
- */
-
- #MODIFY[/x|d|u|o|c] numeric/character string
-
- BBED> modify /c ABCDE file 11 block 131 offset 8184
- File: /oracle/database/oradata/primary/tbs01.dbf (11)
- Block: 131 Offsets: 8184 to 8191 Dba:0x02c00083
- ------------------------------------------------------------------------
- 41424344 45069d37
- <32 bytes per line>
-
- #SUM [ DBA | FILE | FILENAME | BLOCK ] [ APPLY ]
-
- BBED> sum apply #提交修改
- Check value for File 11, Block 131:
- current = 0x7544, required = 0x7544
-
- #VERIFY [ DBA | FILE | FILENAME | BLOCK ]
-
- BBED> verify #验证数据块 提示block 131 is corrupt 损坏 ,验证不成功
- DBVERIFY - Verification starting
- FILE = /oracle/database/oradata/primary/tbs01.dbf
- BLOCK = 131
- Block 131 is corrupt
- Corrupt block relative dba: 0x02c00083 (file 0, block 131)
- Fractured block found during verification
- Data in bad block:
- type: 6 format: 2 rdba: 0x02c00083
- last change scn: 0x0000.004a379d seq: 0x1 flg: 0x06
- spare1: 0x0 spare2: 0x0 spare3: 0x0
- consistency value in tail: 0x379d0645
- check value in block header: 0x7544
- computed block checksum: 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 : 2
- Message 531 not found; product=RDBMS; facility=BBED
-
- BBED> find /c ABCDE #当然 还是在数据文件11 数据块131位置查找到修改的ABCDE值
- File: /oracle/database/oradata/primary/tbs01.dbf (11)
- Block: 131 Offsets: 8184 to 8191 Dba:0x02c00083
- ------------------------------------------------------------------------
- 41424344 45069d37
- <32 bytes per line>
-
- #撤销命令 REVERT [ DBA | FILE | FILENAME | BLOCK ]
-
- BBED> revert dba 11,131 #撤销数据文件11 数据块131
- All changes made to this block will be rolled back. Proceed? (Y/N) y
- Reverted file '/oracle/database/oradata/primary/tbs01.dbf', block 131
- BBED> modify /c ABCD file 11 block 131 offset 8184 #把AAAA 修改为ABCD
- File: /oracle/database/oradata/primary/tbs01.dbf (11)
- Block: 131 Offsets: 8184 to 8191 Dba:0x02c00083
- ------------------------------------------------------------------------
- 41424344 01069d37
- <32 bytes per line>
- BBED> sum apply #提交应用
- Check value for File 11, Block 131:
- current = 0x7500, required = 0x7500
- BBED> verify #验证成功
- DBVERIFY - Verification starting
- FILE = /oracle/database/oradata/primary/tbs01.dbf
- BLOCK = 131
- DBVERIFY - Verification complete
- Total Blocks Examined : 1
- Total Blocks Processed (Data) : 1
- Total Blocks Failing (Data) : 0
- Total Blocks Processed (Index): 0
- Total Blocks Failing (Index): 0
- Total Blocks Empty : 0
- Total Blocks Marked Corrupt : 0
- Total Blocks Influx : 0
- Message 531 not found; product=RDBMS; facility=BBED
-
- BBED>
点击(此处)折叠或打开
- SQL> column name format a8
- SQL> column dump format a40
- SQL> select name,dump(name,16)dump from tt;
-
- NAME DUMP
- -------- ----------------------------------------
- ABCD Typ=1 Len=4: 41,42,43,44
- BBBB Typ=1 Len=4: 42,42,42,42
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/27039319/viewspace-2122359/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/27039319/viewspace-2122359/