BBED修复数据块损坏引起的数据库崩溃(ORA-01092,ORA-00704,ORA-01578)(2021年苏州某国企的案例更新至公众号)
问题现象:
1.Symptom
用户一个边缘系统出现数据文件损坏,且没有备份,数据库无法启动
报错如下,发现是oracle bootstrap损坏
SQL> alter database open;alter database open*ERROR at line 1:ORA-01092: ORACLE instance terminated. Disconnection forcedORA-00704: bootstrap process failureORA-01578: ORACLE data block corrupted (file # 1, block # 520)ORA-01110: data file 1: '+DATA/dbocs/datafile/system01'Process ID: 83985Session ID: 191 Serial number: 3
问题分析:
bootstrap保存数据库中object_id最小的部分DDL (10g为<57 11g-19C<60)
select max(obj#) from bootstrap$ ;
11g

19C

解决方案:
2.Solution
因为没有备份,所以正常的恢复这条路是给堵死了;
但是数据库的数据文件是完整的,那么首先能想到的就是DUL抽数或者BBED做block级别的修复;
而数据库损坏的部分为系统的bootstrap部分,这部分数据块具有通用性,那么是不是可以从其他同构的数据库平台(OS,ORACLE版本一致)来copy数据块修复呢?如果不行再考虑使用DUL从数据文件抽数恢复。
何为BBED
BBED(Block Browser and Editor)是Oracle数据库中的一个强大的工具,它允许用户直接浏览和编辑数据文件的内容,包括数据块(block)和数据页(page)。BBED主要用于以下几个方面:
数据恢复和修复:当数据库发生损坏或者数据文件受损时,BBED可以用于检查和修复受影响的数据块。通过BBED,用户可以直接浏览损坏的数据块,并进行相应的修复操作。
深入了解数据库内部结构:BBED允许用户直接查看数据库内部的数据结构和存储方式,包括数据块的布局、数据页的组织方式等。这对于理解Oracle数据库的内部工作原理和优化性能非常有帮助。
数据分析和调试:BBED可以用于分析和调试数据库中的数据,包括查看表的数据、索引的结构等。这对于诊断数据库性能问题和分析数据访问模式非常有用
看到BBED如此强大就要知道,不是万不得已不要使用 谨慎!谨慎!
2.1. 配置oracle11g的BBED
bbed作为oracle 内部工具,11g之后就不再提供,所以如果要想使用bbed需要重新编译配置具体方法如下
从oracle10g主机下载如下四个文件 将如下四个文件copy到如下目录
cp /tmp/sbbdpt.o $ORACLE_HOME/rdbms/lib/sbbdpt.ocp /tmp/ssbbded.o $ORACLE_HOME/rdbms/lib/ssbbded.ocp /tmp/ bbedus.msb $ORACLE_HOME/rdbms/mesg/bbedus.msbcp tmp/bbedus.msg $ORACLE_HOME/rdbms/mesg/bbedus.msg修改权限和属性chmod 777 sbbdpt.ochmod 777 ssbbded.ochmod 777 bbedus.msbchmod 777 bbedus.msgchown oracle:oinstall bbedus.msbchown oracle:oinstall sbbdpt.ochown oracle:oinstall ssbbded.ochown oracle:oinstall bbedus.msg编译bbedmake -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed[oracle@DBSVR1 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbedLinking BBED utility (bbed)rm -f /u01/oracle/oracle/rdbms/lib/bbedgcc -o /u01/oracle/oracle/rdbms/lib/bbed -m64 -z noexecstack -L/u01/oracle/oracle/rdbms/lib/ -L/u01/oracle/oracle/lib/ -L/u01/oracle/oracle/lib/stubs/ /u01/oracle/oracle/lib/s0main.o /u01/oracle/oracle/rdbms/lib/ssbbded.o /u01/oracle/oracle/rdbms/lib/sbbdpt.o `cat /u01/oracle/oracle/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -ldbtools11 -lclntsh `cat /u01/oracle/oracle/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /u01/oracle/oracle/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 /u01/oracle/oracle/lib/ldflags` -lncrypt11 -lnsgr11 -lnzjs11 -ln11 -lnl11 -lnro11 `cat /u01/oracle/oracle/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 /u01/oracle/oracle/lib/sysliblist` -Wl,-rpath,/u01/oracle/oracle/lib -lm `cat /u01/oracle/oracle/lib/sysliblist` -ldl -lm -L/u01/oracle/oracle/lib[oracle@DBSVR1 lib]$ ./bbedPassword: blockedit ----默认密码
PS:12C-19C bbed的配置使用和11g一致,也是要使用到10g的文件来编译

现在10g的环境可能比较难找了,所以我把 bbed所需的包放在了公众号上,有需要的直接点下载(注意:是《潇湘秦》公众号)


2.2 check bootstrap block
配置好了BBED 下一步就是去确认数据库损坏的block
查询bootstrap所在的文件和block
set line 300col segmnet_name for a20col tablespace_name for a20select segment_name,tablespace_name,extent_id,file_id,block_id,blocks from dba_extents where segment_name='BOOTSTRAP$'

确认涉及到的数据块号
select distinct dbms_rowid.rowid_relative_fno(rowid),dbms_rowid.rowid_block_number(rowid) from BOOTSTRAP$;
2.3从同构环境数据库中拷贝数据块(操作系统和数据库版本都一致等)
在正常的机器上dd if=/oracledb1/oracle/oradata/orcl/system01.dbf of=/tmp/bbed_system.dbf bs=10M count=1将文件传到故障端scp tmp/bbed_system.dbf root@xxx.32:/tmp/bbed_system.dbf
2.4.利用BBED恢复数据块
修改远程copy过来的数据文件属性[root@DBSVR1 tmp]# chown oracle:oinstall /u01/oracle/oradata/tmp/bbed_system.dbf[root@DBSVR1 tmp]# su - oracle[oracle@DBSVR1 ~]$[oracle@DBSVR1 ~]$ cd u01/oracle/oradata/tmp/配置bbed参数文件[oracle@DBSVR1 oracle]$ vi bbed_1.txt[oracle@DBSVR1 oracle]$ cat bbed_1.txt1 /u01/oracle/oradata/orcl/system01.dbf ##源损坏文件20 u01/oracle/oradata/tmp/bbed_system.dbf ##同构正常文件[oracle@DBSVR1 oracle]$ cd $ORACLE_HOME/rdbms/lib[oracle@DBSVR1 lib]$[oracle@DBSVR1 lib]$[oracle@DBSVR1 lib]$./bbed PASSWORD=blockedit mode=edit blocksize=8192 listfile=/u01/oracle/bbed_1.txtBBED: Release 2.0.0.0.0 - Limited Production on Sun Mar 7 10:08:35 2021Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.************* !!! For Oracle Internal Use only !!! ***************BBED>BBED> infoFile# Name Size(blks)----- ---- ----------1 /u01/oracle/oradata/orcl/system01.dbf 020 u01/oracle/oradata/tmp/bbed_system.dbf 0BBED> set count 128COUNT 128BBED> copy file 20 block 520 to file 1 block 520 ---做文件block的对拷 来修复数据文件File: /u01/oracle/oradata/orcl/system01.dbf (1)Block: 520 Offsets: 0 to 127 Dba:0x00400208------------------------------------------------------------------------10a20000 08024000 d0010000 00000204 43e40000 00000000 00000000 0000000000000000 01000000 07000000 20100000 00000000 03000000 07000000 0c02400000000000 00000000 01000000 03000000 00000000 00000000 00000000 0100000000000000 3b000000 00000040 09024000 07000000 00000000 00000000 00000000<32 bytes per line>BBED> copy file 20 block 521 to file 1 block 521File: /u01/oracle/oradata/orcl/system01.dbf (1)Block: 521 Offsets: 0 to 127 Dba:0x00400209------------------------------------------------------------------------06a20000 09024000 d7010000 00000106 fa520000 01000000 3b000000 7301000000000000 01f80200 00000000 00002500 02000000 11024000 02004c00 18200000d7010000 00011800 ffff4200 c6048404 84040000 1800a31f 1a1f951d cd1c4e1b7a1aad19 49177b16 b315d614 0a14ef12 05120e11 380f680e 910d790c 69099c08<32 bytes per line>BBED> copy file 20 block 522 to file 1 block 522File: /u01/oracle/oradata/orcl/system01.dbf (1)Block: 522 Offsets: 0 to 127 Dba:0x0040020a------------------------------------------------------------------------06a20000 0a024000 d7010000 00000106 e81e0000 01000000 3b000000 bb01000000000000 01f80200 00000000 00002500 02000000 20024000 04000700 15200000d7010000 00011500 ffff3c00 b2057605 76050000 1500521d 811cb71b e31a8a1807172216 ce120312 f9102010 410f750e 590dad0c 800bb30a dc096507 9606b205<32 bytes per line>BBED> copy file 20 block 523 to file 1 block 523File: /u01/oracle/oradata/orcl/system01.dbf (1)Block: 523 Offsets: 0 to 127 Dba:0x0040020b------------------------------------------------------------------------06a20000 0b024000 d7010000 00000106 7b7e0000 01000000 3b000000 d001000000000000 01000300 00000000 00002500 02000000 27024000 04002f00 0f200000d7010000 00010f00 ffff3000 f50dc50d c50d0000 0f00301d 561c481b 821aab199c18c117 f816b113 ea122011 5110890f c00ef50d 00000000 00000000 00000000<32 bytes per line>BBED> sum applyCheck value for File 1, Block 523:current = 0x7e7b, required = 0x7e7bBBED>BBED> exit
2.5修复后 重新启动数据
修复后可以正常启动
SQL> startupORACLE instance started.Total System Global Area 8217530368 bytesFixed Size 2269552 bytesVariable Size 1761611408 bytesDatabase Buffers 6442450944 bytesRedo Buffers 11198464 bytesDatabase mounted.Database opened.SQL>
3.后记
常言道有备无患,但是仍然有很多很多的案例因为没有备份,不得不选择各种非常规手段来恢复数据,只有个expdp或者rman就可以解决99%的问题!备份--数据库的最后一道保险!希望大家都不会用到BBED和DUL!




