当前位置: 首页 > news >正文

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

 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 2021Copyright (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!

相关文章:

  • java汇总区间
  • 关于网络丢包的一种可能性分析
  • YOLOv9改进策略 :主干优化 | 极简的神经网络VanillaBlock 实现涨点 |华为诺亚 VanillaNet
  • 机器人规划算法——基于A-star和CostMap膨胀地图的全局规划(附Github源码链接)
  • Mysql-数据库范式和Mysql安装
  • MCU友好过渡MPU,米尔基于STM32MP135开发板裸机开发应用笔记
  • HANA中的内存及磁盘使用统计
  • 美国CPC认证如何办理?CPC审核不通过有哪些原因呢?
  • ArcGIS Pro横向水平图例
  • Android开发 OCR:通过Tesseract实现图片文字识别
  • 题目:新一的宝藏搜寻加强版(蓝桥OJ 4059)
  • 学习笔记——C语言基本概念指针(下)——(8)
  • 【Linux】文件查看命令(六)
  • AMD GPUs - Radeon™ PRO W7900与NVIDIA 4000系列GPU性能
  • 工作日志- 不定期更新
  • 分享的文章《人生如棋》
  • 03Go 类型总结
  • android百种动画侧滑库、步骤视图、TextView效果、社交、搜房、K线图等源码
  • Essential Studio for ASP.NET Web Forms 2017 v2,新增自定义树形网格工具栏
  • ES学习笔记(10)--ES6中的函数和数组补漏
  • interface和setter,getter
  • java中具有继承关系的类及其对象初始化顺序
  • leetcode-27. Remove Element
  • Node 版本管理
  • use Google search engine
  • 工程优化暨babel升级小记
  • 后端_ThinkPHP5
  • 坑!为什么View.startAnimation不起作用?
  • 力扣(LeetCode)965
  • 猫头鹰的深夜翻译:JDK9 NotNullOrElse方法
  • 如何打造100亿SDK累计覆盖量的大数据系统
  • MPAndroidChart 教程:Y轴 YAxis
  • TPG领衔财团投资轻奢珠宝品牌APM Monaco
  • ​iOS安全加固方法及实现
  • #Linux(make工具和makefile文件以及makefile语法)
  • (02)vite环境变量配置
  • (delphi11最新学习资料) Object Pascal 学习笔记---第8章第2节(共同的基类)
  • (待修改)PyG安装步骤
  • (二十五)admin-boot项目之集成消息队列Rabbitmq
  • (二十一)devops持续集成开发——使用jenkins的Docker Pipeline插件完成docker项目的pipeline流水线发布
  • (翻译)Quartz官方教程——第一课:Quartz入门
  • (机器学习的矩阵)(向量、矩阵与多元线性回归)
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (每日持续更新)信息系统项目管理(第四版)(高级项目管理)考试重点整理 第13章 项目资源管理(七)
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (原創) 如何解决make kernel时『clock skew detected』的warning? (OS) (Linux)
  • (转)3D模板阴影原理
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)PlayerPrefs在Windows下存到哪里去了?
  • .Net 中Partitioner static与dynamic的性能对比
  • .NET/C# 阻止屏幕关闭,阻止系统进入睡眠状态
  • .Net下C#针对Excel开发控件汇总(ClosedXML,EPPlus,NPOI)
  • .net用HTML开发怎么调试,如何使用ASP.NET MVC在调试中查看控制器生成的html?
  • .NET中的十进制浮点类型,徐汇区网站设计
  • .net中我喜欢的两种验证码