Oracle-通过BBED强制打开数据库

news2024/11/16 17:29:28

前言:

        在通过备份进行数据恢复时,经常会遇到由于备份的不完整,特别是归档日志的缺失,导致虽然数据文件已经顺利恢复,但是数据文件的恢复时间点没有完全一致或者数据文件的fuzzy的状态不一致,从而数据库无法正常的打开,面对这种情况除了继续追增量日志将数据文件恢复到时间点一致之外,我们还可以通过bbed工具修改数据文件强制打开数据库,这种非常规方式在故障恢复时可以派上用场

测试场景:

        在Oracle11.2.0.4通过备份在异地恢复数据文件,恢复出来的数据文件checkpoint_change#并不完全一致,fuzzy的状态也不一致,此时,我们无法将数据库正常的打开,即使是resetlogs也不行

        通过open resetlogs打开数据库,至少要满足以下条件

        1 每个数据文件的resetlog_change#在相同,即同一个incarnation

        2 每个数据文件的checkpoint_change#相同

        3 每个数据文件的fuzzy状态相同,并fhsta状态为0

        而当前的恢复场景,除了条件1满足之外,其他并不满足,需要通过bbed修改数据文件

bbed测试:

        首先配置好bbed的配置文件以确保识别到数据文件

$ cat /tmp/bbed.par 
blocksize=8192
listfile=/tmp/datafile.list
mode=edit
$ cat /tmp/datafile.list 
1 /u01/app/oracle/oradata/dbocs/datafile/system 2306867200
2 /u01/app/oracle/oradata/dbocs/datafile/sysaux 660602880
3 /u01/app/oracle/oradata/dbocs/datafile/undotbs1 508559360
4 /u01/app/oracle/oradata/dbocs/datafile/users 543948800
5 /u01/app/oracle/oradata/dbocs/datafile/undotbs2 104857600
6 /u01/app/oracle/oradata/dbocs/datafile/test1 209715200

        开始修改数据文件头里面的checkpoint_change#,这个在数据文件block 1所在的结构kcvfh.kcvfhckp.kcvcpscn.kscnbas(offset 484)里面,当前值为16进制0x0049cfb9换算成10进制就是4837305

        通过bbed修改该值,通过使用assign或者modify命令进行修改,assign的优势在于可以使用10进制进行修改,不用转化成16进制,并且不需要考虑操作系统的字节序,因为对于Linux平台字节序是litter,修改值是需要从小端开始

--将scn改成比原来大,要确保数据文件头的scn大于块里面的scn
--原来是4837305,改成10000000
BBED> assign dba 1,1 kcvfh.kcvfhckp.kcvcpscn.kscnbas  = 10000000
--修改之后,要重新计算修改后的数据块的 checksum 值
BBED> sum apply 
Check value for File 1, Block 1:
current = 0x1a4c, required = 0x1a4c
--验证数据块是否正常
BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/dbocs/datafile/system
BLOCK = 1
​
​
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   : 0
Total Blocks Influx           : 0
Message 531 not found;  product=RDBMS; facility=BBED
--其他的数据文件2,3,4,5,6重复以上操作

        通过bbed修改之后,checkpoint_change#统一为10000000

select file#,name,CHECKPOINT_CHANGE#,RESETLOGS_CHANGE#,FUZZY,CHECKPOINT_COUNT
from v$datafile_header
​
     FILE# NAME                                                         CHECKPOINT_CHANGE# RESETLOGS_CHANGE# FUZ CHECKPOINT_COUNT
---------- ------------------------------------------------------------ ------------------ ----------------- --- ----------------
         1 /u01/app/oracle/oradata/dbocs/datafile/system                          10000000            925702 NO               286
         2 /u01/app/oracle/oradata/dbocs/datafile/sysaux                          10000000            925702 NO               286
         3 /u01/app/oracle/oradata/dbocs/datafile/undotbs1                        10000000            925702 YES              207
         4 /u01/app/oracle/oradata/dbocs/datafile/users                           10000000            925702 NO               285
         5 /u01/app/oracle/oradata/dbocs/datafile/undotbs2                        10000000            925702 NO                 7
         6 /u01/app/oracle/oradata/dbocs/datafile/test1                           10000000            925702 YES                7

        接下来修改数据文件的fuzzy 状态,fuzzy的状态存储在数据文件block 1的kcvfhsta(offset 138)

--使用另一种方式modify修改,将kcvfhsta的值修改为0x0000
BBED>  m /x 0000 file 1 block 1 offset 138
--修改之后,要重新计算修改后的数据块的checksum 值
BBED> sum apply
--验证数据块是否正常 
BBED> verify
--其他的数据文件2,3,4,5,6重复以上操作

        修改完之后,确认fuzzy状态为0

select HXFNM,fhsta from x$kcvfh
​
HXFNM                                                             FHSTA
------------------------------------------------------------ ----------
/u01/app/oracle/oradata/dbocs/datafile/system                         0
/u01/app/oracle/oradata/dbocs/datafile/sysaux                         0
/u01/app/oracle/oradata/dbocs/datafile/undotbs1                       0
/u01/app/oracle/oradata/dbocs/datafile/users                          0
/u01/app/oracle/oradata/dbocs/datafile/undotbs2                       0
/u01/app/oracle/oradata/dbocs/datafile/test1                          0
​
 select file#,name,CHECKPOINT_CHANGE#,RESETLOGS_CHANGE#,FUZZY,CHECKPOINT_COUNT
 from v$datafile_header
​
​
     FILE# NAME                                                         CHECKPOINT_CHANGE# RESETLOGS_CHANGE# FUZ CHECKPOINT_COUNT
---------- ------------------------------------------------------------ ------------------ ----------------- --- ----------------
         1 /u01/app/oracle/oradata/dbocs/datafile/system                          10000000            925702 NO               286
         2 /u01/app/oracle/oradata/dbocs/datafile/sysaux                          10000000            925702 NO               286
         3 /u01/app/oracle/oradata/dbocs/datafile/undotbs1                        10000000            925702 NO               207
         4 /u01/app/oracle/oradata/dbocs/datafile/users                           10000000            925702 NO               285
         5 /u01/app/oracle/oradata/dbocs/datafile/undotbs2                        10000000            925702 NO                 7
         6 /u01/app/oracle/oradata/dbocs/datafile/test1                           10000000            925702 NO                 7

        checkpoint_change#以及fuzzy状态修改完之后,已经满足了打开数据库的条件,接下来需要重建一下控制文件

--重建控制文件
STARTUP NOMOUNT
CREATE CONTROLFILE REUSE DATABASE "DBOCS" RESETLOGS  ARCHIVELOG
    MAXLOGFILES 192
    MAXLOGMEMBERS 3
    MAXDATAFILES 1024
    MAXINSTANCES 32
    MAXLOGHISTORY 633
LOGFILE
  GROUP 11 '/u01/app/oracle/oradata/dbocs/onlinelog/group_11.256.1036344439'  SIZE 500M BLOCKSIZE 512,
  GROUP 14 '/u01/app/oracle/oradata/dbocs/onlinelog/group_14.291.1036352287'  SIZE 500M BLOCKSIZE 512
-- STANDBY LOGFILE
DATAFILE
  '/u01/app/oracle/oradata/dbocs/datafile/system',
  '/u01/app/oracle/oradata/dbocs/datafile/sysaux',
  '/u01/app/oracle/oradata/dbocs/datafile/undotbs1',
  '/u01/app/oracle/oradata/dbocs/datafile/users',
  '/u01/app/oracle/oradata/dbocs/datafile/undotbs2',
  '/u01/app/oracle/oradata/dbocs/datafile/test1'
CHARACTER SET ZHS16GBK
;

        使用open resetlogs打开数据库

--recover database
RECOVER DATABASE USING BACKUP CONTROLFILE;
--open database
ALTER DATABASE OPEN RESETLOGS;
--添加临时文件
ALTER TABLESPACE TEMP ADD TEMPFILE '/u01/app/oracle/oradata/dbocs/tempfile/temp.257.1036073905' size 100M;

        打开数据库之后,大概率会出现ORA-00600 [4194]的报错,因为在添加一条新的undo记录的时候,会去比较undo块里面的最大记录数跟redo日志里面的undo最大记录数,如果出现不一致,就会触发ORA-00600[4194]的错误

Block recovery completed at rba 1.73.16, scn 0.10000067
Errors in file /u01/app/oracle/diag/rdbms/dbocs/dbocs/trace/dbocs_mmon_40326.trc  (incident=14524):
ORA-00600: internal error code, arguments: [4194], [], [], [], [], [], [], [], [], [], [], []
Incident details in: /u01/app/oracle/diag/rdbms/dbocs/dbocs/incident/incdir_14524/dbocs_mmon_40326_i14524.trc
Arg [a] - Maximum Undo record number in Undo block
Arg [b] - Undo record number from Redo block
Since we are adding a new undo record to our undo block, we would expect that the new record number is equal to the maximum record number in the undo block plus one. 
Before Oracle can add a new undo record to the undo block it validates that this is correct. 
If this validation fails, then an ORA-600 [4194] will be triggered.

​        数据库打开之后才出现的ORA-00600 [4194]的报错,一般都是undo表空间里面的回滚段问题,不是system的回滚段问题,可以通过重建undo表空间解决

--关闭自动undo段管理
alter system set undo_management = manual scope=spfile;
--10513禁用事务的回滚
 alter system set    event = '10513 trace name context forever, level 2' scope=spfile;
--重启数据库,以严格模式启动
shutdown immediate
startup restrict
--检查非offline的回滚段,system的回滚段一直都是online的可以不用管,需要确保其他回滚段都是offline,不能出现'PARTLY AVAILABLE' or 'NEEDS RECOVERY'
SQL> select tablespace_name, status, segment_name from dba_rollback_segs where status != 'OFFLINE';
​
TABLESPACE_NAME                STATUS           SEGMENT_NAME
------------------------------ ---------------- ------------------------------
SYSTEM                         ONLINE           SYSTEM
​
--重建undo表空间
SQL> create undo tablespace undo1 datafile size 100M;
SQL> drop tablespace undotbs1 including contents and datafiles;
​
--设置默认表空间为新的undo表空间以及开启自动undo段管理,删除event参数
alter system set undo_tablespace=undo1 scope=spfile;
alter system set undo_management =auto scope=spfile;
alter system reset event scope=spfile;
--重启
shutdown immediate;
startup

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1047689.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

三维模型3DTile格式轻量化压缩处理重难点分析

三维模型3DTile格式轻量化压缩处理重难点分析 在对三维模型3DTile格式进行轻量化压缩处理的过程中,存在一些重要而又困难的问题需要解决。以下是几个主要的重难点: 1、压缩率和模型质量之间的平衡:压缩技术的目标是尽可能地减少数据大小&…

用CRM系统提高客户转化率

影响客户转化的因素有很多,例如潜在客户是否真实有效、销售跟进策略、销售跟进流程和及时性等。不少企业正在使用CRM销售管理系统,下面说说CRM系统如何提高提高客户转化率? 1、甄别高质量获客渠道 CRM系统可以对获取的客户线索进行分析&…

premire 两个视频叠加显示

1 背景视频放到 v1 视频轨道 前视 视频 放到 v2 视频轨道 2 调整 前视 视频颜色参数 2.1 曲线 亮度 暗度 调整 黑白鲜明对比 2.2 基本校正 对比度 白色 黑色 饱和度 曝光 3 效果控件 -> 混合模式 -> 滤色 4 视频人物大小调整 位置调整

基于微信小程序的宠物交易商城系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言运行环境说明用户的主要功能有:管理员的主要功能有:具体实现截图详细视频演示为什么选择我自己的网站自己的小程序(小蔡coding)有保障的售后福利 代码参考论文参考源码获取 前言 💗博主介绍:✌…

电设备工厂的BOM管理系统

一、什么是BOM管理系统? BOM管理系统是一种软件工具,用于管理和跟踪产品的物料清单。它包括产品的组成结构、零部件的规格、数量和关联信息。BOM管理系统提供了一个集中存储和更新BOM数据的平台,并确保所有相关部门和团队都能够访问最新的BO…

2023工博会 | 上海添力网络营销公司 | 助力工业品线上推广

2023年9月23日,为期五天的工博会正式落下帷幕。本届工博会不仅有数量,更加有质量,国内外企业纷纷拿出看家本领,围绕着“绿色低碳”、“数字化转型”、“数字经济”、“科技创新”、“智能制造”等主题进行推陈出新。 本次工博会也…

未来预判:跨境电商全球化的下一个步伐

在当今全球化的时代,跨境电商已经成为了国际贸易和全球商业的主要驱动力之一。跨境电商不仅仅改变了消费者的购物方式,也对传统零售业产生了深远的影响。 然而,随着技术和市场的不断发展,跨境电商也在不断演化,其全球…

2023 现阶段H5的机型适配

个人愚见 现在的主流体验,是大屏手机展示更多的内容,并不着重于放大展示, 所以,外层布局使用vw,百分比,flex,内层直接px就行 参考: https://juejin.cn/post/7128051145431318535

LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

0x000000000006A220 处的第一机会异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 0x000000000006A220 处有未经处理的异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 最近做一个测试&#…

Matlab论文插图绘制模板第116期—带时间刻度的图

之前的文章中,分享了Matlab带线标记的图: 带阴影标记的图: 带箭头标记的图: 带图形标记的图: 带Latex公式的图: 进一步,分享一下带时间刻度的图,先来看一下成品效果: 特别…

步力宝科技爆款产品定位,开创智能物联网新商业

数据显示,中国处于 “亚健康”状态人口数量约占总人口的70%,亚健康是一种临界状态,指介于健康和疾病之间的状态。亚健康是一个动态演变的过程,既有向慢病发展的趋势,也能通过合理的干预使人体重返健康状态,…

垃圾收集器G1ZGC

G1收集器(-XX:UseG1GC) G1 (Garbage-First)是一款面向服务器的垃圾收集器,主要针对配备多颗处理器及大容量内存的机器. 以极高概率满足GC停顿时间要求的同时,还具备高吞吐量性能特征. ​ ​ G1将Java堆划分为多个大小相等的独立区域(Region)&#…

1、Kafka 安装与简单使用

第 1 章 Kafka 概述 1.1 定义 Kafka传统定义: Kafka是一个分布式的基于发布/订阅模式的消息队列(Message Queue),主要应用于大数据实时处理领域。 Kafka最新定义 : Kafka是 一个开源的 分 布式事件流平台 &#xff08…

【AIGC】只要10秒,AI生成IP海报,解放双手!!! | 京东云技术团队

看完这篇文章,你将学会以下价值连城的内容 1、云端部署(配置不行的小伙伴看) 云端模型放置位置 2、本地部署(配置达标的小伙伴看) 3、运用SD训练IP的流程和技巧(LoRA篇) 4、运用SD稳定生成高…

【C语言】指针与动态内存

文章目录 1. 使用动态内存的意义2. 动态内存分配函数2.1 malloc2.2 free2.3 calloc2.4 realloc 3. 动态内存会被自动释放吗?4. 涉及动态内存常见的错误使用4.1 对NULL指针的解引用操作4.2 未对开辟的动态内存空间初始化4.3 越界访问4.4 对非动态开辟内存使用free释放…

vue-cli项目打包体积太大,服务器网速也拉胯(100kb/s),客户打开网站需要等十几秒!!! 尝试cdn优化方案

一、首先用插件webpack-bundle-analyzer查看自己各个包的体积 插件用法参考之前博客 vue-cli项目中,使用webpack-bundle-analyzer进行模块分析,查看各个模块的体积,方便后期代码优化 二、发现有几个插件体积较大,有改成CDN引用的…

解决github 2FA验证

安装谷歌浏览器插件 身份验证器 https://chrome.google.com/webstore/detail/authenticator/bhghoamapcdpbohphigoooaddinpkbai 安装后点击这里后,选中github网页提供的二维码,插件会生成一个code,粘贴到github网页需要输入code的地方 验证…

Visual Studio 删除行尾空格

1.CtrlH 打开替换窗口(注意选择合适的查找范围) VS2010: VS2017、VS2022: 2.复制下面正则表达式到上面的选择窗口(注意前面有一个空格): VS2010: $ VS2017、VS2022: $ 3.下面的替换窗口不写入 VS2010: VS2017、VS2022: 4.点选“正则表达式…

UE4蓝图

1、绑定蓝图到对象并打印对象名称 2、变量数值 3、变量字符串 4、侧边栏 5、分支判断 6、倒计时停止 7、每隔一秒执行一次 8、倒计时按条件执行 9、多按键阻断、重置 10、门的状态:开、关、开关 11、一个键盘事件完成多个事件 12、随机抽奖 13、分:秒计时器&#x…

opentelemetry、grafana、Prometheus、jaeger、victoria-metrics 介绍、关系与使用

Opentelemetry OTEL 是 OpenTelemetry 的简称, 是 CNCF 的一个可观测性项目,旨在提供可观测性领域的标准化方案,解决观测数据的数据模型、采集、处理、导出等的标准化问题,提供与三方 vendor 无关的服务。 OpenTelemetry 是一组标…