Oracle利用BBED恢复崩溃实例(ORA-01092,ORA-00704,ORA-01578)

 欢迎关注作者,更多数据库相关安装配置,troubleshooting,调优,备份恢复等资源

墨天伦:潇湘秦的个人主页 - 墨天轮
CSDN:潇湘秦-CSDN博客

公众号:潇湘秦

​---------------------------------------------------------------------------------------------

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主要用于以下几个方面:

  1. 数据恢复和修复:当数据库发生损坏或者数据文件受损时,BBED可以用于检查和修复受影响的数据块。通过BBED,用户可以直接浏览损坏的数据块,并进行相应的修复操作。

  2. 深入了解数据库内部结构:BBED允许用户直接查看数据库内部的数据结构和存储方式,包括数据块的布局、数据页的组织方式等。这对于理解Oracle数据库的内部工作原理和优化性能非常有帮助。

  3. 数据分析和调试: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.o    chown oracle:oinstall ssbbded.ochown oracle:oinstall  bbedus.msg编译bbed make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed        [oracle@DBSVR1 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed       Linking 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]$ ./bbed  Password: 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.txt
1  /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.txt​
BBED: Release 2.0.0.0.0 - Limited Production on Sun Mar 7 10:08:35 2021

Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

BBED>
BBED> info
​
 File#  Name                                                        Size(blks)
​
 -----  ----                                                        ----------
​
     1  /u01/oracle/oradata/orcl/system01.dbf                                0
​
    20  /u01/oracle/oradata/tmp/bbed_system.dbf                              0
​
          
​
BBED> set count 128
​
        COUNT           128
​
          
​
BBED> 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 00000000    
​
 00000000 01000000 07000000 20100000 00000000 03000000 07000000 0c024000
​
 00000000 00000000 01000000 03000000 00000000 00000000 00000000 01000000
​
 00000000 3b000000 00000040 09024000 07000000 00000000 00000000 00000000
​
 <32 bytes per line>
​
BBED>  copy file 20 block 521 to file 1 block 521
​
 File: /u01/oracle/oradata/orcl/system01.dbf (1)
​
 Block: 521              Offsets:    0 to  127           Dba:0x00400209
​
------------------------------------------------------------------------
​
 06a20000 09024000 d7010000 00000106 fa520000 01000000 3b000000 73010000
​
 00000000 01f80200 00000000 00002500 02000000 11024000 02004c00 18200000
​
 d7010000 00011800 ffff4200 c6048404 84040000 1800a31f 1a1f951d cd1c4e1b
​
 7a1aad19 49177b16 b315d614 0a14ef12 05120e11 380f680e 910d790c 69099c08
​
 <32 bytes per line>
​
BBED> copy file 20 block 522 to file 1 block 522
​
 File: /u01/oracle/oradata/orcl/system01.dbf (1)
​
 Block: 522              Offsets:    0 to  127           Dba:0x0040020a
​
------------------------------------------------------------------------
​
 06a20000 0a024000 d7010000 00000106 e81e0000 01000000 3b000000 bb010000
​
 00000000 01f80200 00000000 00002500 02000000 20024000 04000700 15200000
​
 d7010000 00011500 ffff3c00 b2057605 76050000 1500521d 811cb71b e31a8a18
​
 07172216 ce120312 f9102010 410f750e 590dad0c 800bb30a dc096507 9606b205
​
 <32 bytes per line>

BBED> copy file 20 block 523 to file 1 block 523
​
 File: /u01/oracle/oradata/orcl/system01.dbf (1)
​
 Block: 523              Offsets:    0 to  127           Dba:0x0040020b
​
------------------------------------------------------------------------
​
 06a20000 0b024000 d7010000 00000106 7b7e0000 01000000 3b000000 d0010000    
​
 00000000 01000300 00000000 00002500 02000000 27024000 04002f00 0f200000
​
 d7010000 00010f00 ffff3000 f50dc50d c50d0000 0f00301d 561c481b 821aab19
​
 9c18c117 f816b113 ea122011 5110890f c00ef50d 00000000 00000000 00000000

 <32 bytes per line>
​
BBED> sum apply
​
Check value for File 1, Block 523:
​
current = 0x7e7b, required = 0x7e7b   
​
BBED>
BBED> exit

2.5修复后 重新启动数据    

 修复后可以正常启动

SQL> startup
ORACLE instance started.
​
Total System Global Area 8217530368 bytes
Fixed Size        2269552 bytes
Variable Size     1761611408 bytes
Database Buffers   6442450944 bytes
Redo Buffers       11198464 bytes
Database mounted.
Database opened.
SQL> 
​

3.后记

   常言道有备无患,但是仍然有很多很多的案例因为没有备份,不得不选择各种非常规手段来恢复数据,只有个expdp或者rman就可以解决99%的问题!备份--数据库的最后一道保险!希望大家都不会用到BBED和DUL!

  • 14
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇湘秦

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值