资讯专栏INFORMATION COLUMN

遇到物理坏块后数据恢复过程

IT那活儿 / 2545人阅读
遇到物理坏块后数据恢复过程

点击上方蓝字关注我们


故障描述


工作中发现主机b-domain3上AAA数据库异常,数据库处于mount状态,使用命令打开数据库。数据库出现如下错误

经查询此错误为磁盘产生坏块,数据库编号为20的文件在进行CP命令时,无法正常进行,其余文件可正常进行,确定为已损坏文件。


  故障恢复  


数据库处于noarchivelog模式,备份文件时间为2017年份,无法使用,故进行数据恢复时会丢失数据,只能进行部分恢复。

1.确定表空间所有对象

a) LOB字段

b) 子分区

c) 分区表

d) 普通表

e) 子分区索引

f) 分区索引

g) 普通索引

2.确定非20号文件对象

select ‘alter table ‘||owner||’.’||table_name||’ move tablespace AAA_OBS_DATA1 PARALLEL 8;’ from dba_dba_extents where segment_type=’TABLE’  and relative_fno<>20 and tablespace_name=’AAA_OBS_DATA’;

生成迁移表空间脚本


3.迁移正常表到新表空间

a)  使用步骤三中生成的脚本进行表空间迁移,将正常表从AAA_OBS_DATA表空间迁移到AAA_OBS_DATA1表空间。

b)  迁移lob字段(根据步骤1中a序列生成的内容)

ALTER TABLE AAA.BAK_I_BUSI MOVE LOB (HUB_INFO) STORE AS (TABLESPACE AAA_OBS_DATA1);

ALTER TABLE AAA.BAK_I_BUSI MOVE LOB (COMMAND_CONTENT) STORE AS (TABLESPACE AAA_OBS_DATA1);


c)  迁移索引(根据步骤1中g序列生成的内容)

ALTER INDEX AAA.SYS_IL0000020524C00010$$ REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.SYS_IL0000020524C00009$$ REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I191000_0_PK REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I191000_0_UK REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I191000_1_UK REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I185000_0_INDEX REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.PK_SVC_TEMPLET_INFO REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.PK_BIZ_INFO REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.PK_TRAN_INFO REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.PK_COMM_INTERF_SVC_INFO REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I135000_0_INDEX REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I135000_1_INDEX REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.GJ7_CK_AAA_USERINFO_ALL_BID REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.I162000_0_PK REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.SYS_C0067279 REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.SYS_C0067280 REBUILD TABLESPACE AAA_OBS_DATA1;

ALTER INDEX AAA.SYS_C0067283 REBUILD TABLESPACE AAA_OBS_DATA1;

4.确定20号文件中的对象

selectdistinct owner,segment_name from dba_extents wheresegment_type=TABLE and relative_fno=20;(部分数据)  

5.恢复20号文件中受影响对象

根据步骤4中查询到的表检索extents分布状况

SELECT e.segment_name,

      o.data_object_id,

      e.relative_fno,

      e.block_id,

      e.blocks

 FROM dba_extents e, dba_objects o

WHERE o.owner = e.owner

  AND o.object_name = e.segment_name

  AND e.owner = AAA

  AND e.segment_name = ACCESS_LOG_2020070112

  AND e.relative_fno = 20

ORDER BY e.relative_fno, o.data_object_id, e.block_id;


根据data_object_id,relative_fno,block_id构造最大/最小rowid

最小:

SELECT dbms_rowid.rowid_create(1, 92499, 20, 2057856, 0) low_rid FROM dual;

最大:

SELECT dbms_rowid.rowid_create(1, 92499, 20, 3145857, 0) low_rid FROM dual;


创建表:

根据影响最小rowid创建表

CREATE TABLE aaa.ACCESS_LOG_2020070112_BAK TABLESPACE AAA_OBS_DATA1 AS SELECT * FROM aaa.ACCESS_LOG_2020070112 where rowid < AAAWlTAAUAAH2aAAAA;

根据插入影响最大的rowid之后数据

INSERT INTO aaa.ACCESS_LOG_2020070112_BAK SELECT * FROM aaa.ACCESS_LOG_2020070112 WHERE ROWID > AAAWlTAAUAAMACBAAA;

提取原表索引信息,

SELECT DBMS_METADATA.GET_DDL(INDEX,INDEX_NAME,AAA) FROM DUAL;

创建关于新表的索引。

其他表根据以上操作,进行创建恢复。

6.无法恢复对象

在步骤5中对受影响表进行数据恢复,只能恢复部分数据,有部分表在构造rowid时,产生了错误的rowid,无法进行恢复。

无法恢复数据表:(共计14张表无法恢复)

ACCESS_LOG_2020090147

ACCESS_LOG_2020090141

ACCESS_LOG_2020090118

ACCESS_LOG_2020070135

ACCESS_LOG_2020070132

ACCESS_LOG_2020110156

ACCESS_LOG_2020110151

ACCESS_LOG_2020110152

ACCESS_LOG_2020110148

ACCESS_LOG_2020110146

ACCESS_LOG_2020100157

ACCESS_LOG_2020100150

ACCESS_LOG_2020100135

ACCESS_LOG_2020100132

7.建议

数据库运行在非归档模式下,故障发生后没有有效的备份,很难进行数据的完全恢复,因此建议:

1.数据开启归档模式

2.每日对数据库进行备份(全备,增量备份)

3.后续业务使用新用户,新表空间存储数据。


END



文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/129986.html

相关文章

  • Java 异常处理

    摘要:下面是异常处理机制的语法结构业务实现代码输入不合法如果执行块里业务逻辑代码时出现异常,系统自动生成一个异常对象,该对象被提交给运行时环境,这个过程被称为抛出异常。 Java的异常机制主要依赖于try、catch、finally、throw和throws五个关键字, try关键字后紧跟一个花括号括起来的代码块(花括号不可省略),简称try块,它里面放置可能引发异常的代码 catch后对...

    senntyou 评论0 收藏0
  • java:异常处理

    摘要:异常处理机制异常与异常类的继承体系在程序中,当程序出现意外情况时,系统会自动生成一个来通知程序,从异常发生出逐渐向外传播,如果没有人来处理该异常,就会交给来处理,对异常的处理方法是,打印异常跟踪栈信息,并中止程序的执行。 1 为什么要处理异常? 异常机制可以使程序的异常处理代码与正常业务代码分离,保证程序代码的健壮性。在设计程序的时候,好的程序需要尽可能处理已知的可能产生的错误,但是事...

    LuDongWei 评论0 收藏0
  • java 多线程编程核心技术 3—线程间通信

    摘要:在从返回前,线程与其他线程竞争重新获得锁。就绪队列存储了将要获得锁的线程,阻塞队列存储了被阻塞的线程。当线程呈状态,调用线程对象的方法会出现异常。在执行同步代码块过程中,遇到异常而导致线程终止,锁也会被释放。 方法wait()的作用是使当前执行代码的线程进行等待,wait()方法是Object类的方法,该方法用来将当前线程置入预执行队列中,并且在wait()所在的代码行处停止执行,直...

    Dogee 评论0 收藏0
  • 异常机制详解

    摘要:当运行时系统遍历调用栈而未找到合适的异常处理器,则运行时系统终止。不可查异常编译器不要求强制处置的异常包括运行时异常与其子类和错误。 目录介绍 1.什么是异常 2.异常 2.1 异常的概述和分类【了解】 2.2 JVM默认是如何处理异常的【理解】 2.3 异常处理的两种方式【理解】 2.4 try...catch的方式处理异常【掌握】 2.5 编译期异常和运行期异常的区别【理解】...

    wanghui 评论0 收藏0
  • 分布式锁的原理和实现详解

    摘要:分布式情况下这个就需要换成分布式锁以保证数据一致性。三分布式锁实现原理所需的依赖一个拥有强一致性的服务发现存储仓库。保证数据一致性一个具有高可用性的服务发现存储仓库。 一、基本概念 分布式锁,是单机锁的一种扩展,主要是为了锁住分布式系统中不同机器代码的物理块或逻辑块。以此保证不同机器之间的逻辑一致性。 二、一个简单的案例 对DB写操作的双检锁案例 伪代码如下 if (可以插入一条数...

    young.li 评论0 收藏0

发表评论

0条评论

IT那活儿

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<