oracle三种类型坏块的处理思路总结(没有物理备份)

坏块的发生,很罕见,但生产系统偶尔还是会出现。如果有物理备份,处理起来相对简单,直接进行块级recover即可,但如果只有逻辑备份呢?处理起来要分四种情况,在此总结一下:

一、块的data部分坏了,在sql执行扫描到这个块的时候会报ORA-01578:

ERROR at line 1:
ORA-01578: ORACLE data block corrupted (file # 21, block # 12)
ORA-01110: data file 21: ‘/u01/app/oracle/oradata/RWDB_production/T6.DBF‘

但是,这种坏块不会影响数据库重启,只是在重启到open阶段的时候会报:

Thu Nov 20 10:39:00 CST 2014
Corrupt Block Found
         TSN = 26, TSNAME = CORRUPT
         RFN = 21, BLK = 12, RDBA = 88080396
         OBJN = 591083, OBJD = 591083, OBJECT = USER_TAB, SUBOBJECT =
         SEGMENT OWNER = RWUSER, SEGMENT TYPE = Table Segment

db在open的时候会扫描数据文件的状态,这里可以清楚地看到是什么类型的段、什么用户、什么对象出现了坏块。还可以用dbv工具进一步check:

[[email protected]]/u01/app/oracle/admin/RWDB>dbv file=/u01/app/oracle/oradata/RWDB_production/T6.DBF

DBVERIFY - Verification complete

Total Pages Examined         : 25
Total Pages Processed (Data) : 0
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 11
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 13
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Highest block SCN            : 1132783081 (0.1132783081)

这里也可以清楚地看到Total Pages Marked Corrupt为1,即有1个坏块。

处理:

这种类型的坏块,处理办法有很多,support上的建议办法如下:

1、用DBMS_REPAIR.SKIP_CORRUPT_BLOCKS处理,即跳过坏块。

2、用CTAS建一个临时表,上面坏了的表为user_tab,可建一个临时表user_tab_tmp

3、将user_tab表重命名:alter table user_tab rename to user_tab_corrupt

4、将user_tab_tmp改为生产系统正式表:alter table user_tab_tmp rename to user_tab

5、重建user_tab表的索引

这种恢复办法,那个坏块里面的数据会丢掉。如果是每天都进行逻辑备份,还可以将现在的user_tab与昨天逻辑备份里面的user_tab进行比对,以最大限度恢复数据。

二、datafile的head块坏了(1号块)

一个8k block大小的数据文件,我们用ultraedit打开,以16进制方式显示,其中00000000~00001ff0是0号块,后面开始是1号块,即这个数据文件的head块。这个块坏了就相当危险,数据库重启会直接报错:

SQL> conn /as sysdba;
Connected to an idle instance.
SQL> startup;
ORACLE instance started.

Total System Global Area  935329792 bytes
Fixed Size                  2100680 bytes
Variable Size             385876536 bytes
Database Buffers          541065216 bytes
Redo Buffers                6287360 bytes
Database mounted.
ORA-01122: database file 24 failed verification check
ORA-01110: data file 24: ‘/u01/app/oracle/oradata/RWDB_production/T9.DBF‘
ORA-01210: data file header is media corrupt

可以看到,数据库打不开了。

alert报下面的东西:
Thu Nov 20 15:11:10 CST 2014
ALTER DATABASE OPEN
Read of rdba: 0x06000001 (file 24, block 1) failed with ORA-01210.
Hex dump of (file 24, block 1) in trace file /u01/app/oracle/admin/RWDB/udump/rwdb_ora_5850.trc
Corrupt block relative dba: 0x06000001 (file 24, block 1)
Bad header found during datafile header read
Data in bad block:
 type: 49 format: 1 rdba: 0x31000031
 last change scn: 0x0000.00000000 seq: 0x31 flg: 0x31
 spare1: 0x0 spare2: 0x0 spare3: 0x0
 consistency value in tail: 0x00000b01
 check value in block header: 0x3131
 block checksum disabled
Trying reread from disk.
Reread of rdba: 0x06000001 (file 24, block 1) failed with ORA-01210
ORA-1122 signalled during: ALTER DATABASE OPEN...

dbv也可以检测到:

[[email protected]]/u01/app/oracle/admin/RWDB/bdump>dbv file=/u01/app/oracle/oradata/RWDB_production/T9.DBF

DBVERIFY - Verification complete

Total Pages Examined         : 25
Total Pages Processed (Data) : 1
Total Pages Failing   (Data) : 0
Total Pages Processed (Index): 0
Total Pages Failing   (Index): 0
Total Pages Processed (Other): 10
Total Pages Processed (Seg)  : 0
Total Pages Failing   (Seg)  : 0
Total Pages Empty            : 13
Total Pages Marked Corrupt   : 1
Total Pages Influx           : 0
Highest block SCN            : 1132794574 (0.1132794574)

如果半夜干升级割接(要重启服务器),遇到这种问题,身边又没有DBA,还是很棘手的,业务直接就会中断,如果是HA的系统,坏的datafile又刚好在磁阵上,那么通过切换也无法解决这个问题,因为oracle资源组就起不来。对于非归档模式的数据库,解决方法如下:

SQL> ALTER DATABASE DATAFILE ‘/u01/app/oracle/oradata/RWDB_production/T9.DBF‘ OFFLINE DROP;

Database altered.

SQL> alter database open;

Database altered.

这里,先不管数据丢失与否,先启动了数据库再说,免得故障闹大!:)

三、datafile的os head块坏了(0号块)

什么是datafile的0号块?官方称之为操作系统的头块,里面的东西不是oracle写的,是操作系统记录的文件大小等文件系统相关的信息。0号块坏了,可以正常重启数据库,没问题。但是,如果哪一天遇到紧急问题需要重建控制文件,将会面临报错:

ORA-27047: unable to read the header block of file

对于0号块的检测,用前面的dbv根本检测不出来(dbv命令貌似不检测0号块),需要用dbfsize来检测:

[[email protected]]/u02/backup>dbfsize /u01/app/oracle/oradata/RWDB_production/T8.DBF
/u01/app/oracle/oradata/RWDB_production/T8.DBF: Header block magic number is bad

这里会提示一个什么magic号坏了。

解决方法:

resize一下有问题的数据文件大小,os block head就会被重写,问题可以解决。

alter database datafile ‘/u01/app/oracle/oradata/RWDB_production/T8.DBF‘ resize <new size>


四、整个datafile都坏了(各种坏块的综合体)

笔者曾遇到过一次,整个文件都坏了,这种问题,可看做是以上坏块情况的集体爆发。

如:

dbvfile=/data1/app/oracle/oradata/RWDB/IRDBRoamerTS_01.dbf

Total Pages Examined         : 1926

Total Pages Processed (Data) : 0

Total Pages Failing   (Data) : 0

Total Pages Processed (Index): 0

Total Pages Failing   (Index): 0

Total Pages Processed (Other): 0

Total Pages Processed (Seg)  : 0

Total Pages Failing   (Seg) : 0

Total Pages Empty            : 0

Total Pages Marked Corrupt  : 1926

Total Pages Influx           : 0

Highest block SCN            : 0 (0.0)

这里可以看到,总共检测了1926个块,全坏了。如果遇到数据库重启,就无法open成功。

如果有RMAN备份,这种情况就很简单,直接restore、recover坏的数据文件就行。如果没有物理备份,就要先用上面第二种情况的解决办法先把数据库打开,然后再恢复数据。恢复数据的方法,与第二种里面又有所不同,既然这个文件里的块都坏了,再skip哪个块就没意义了。恢复数据的步骤如下:

1、看看这个dbf里面有哪些对象

2、用最新的逻辑备份将上面的对象impdp进新的表空间(如果IRDBRoamerTS_01不是表空间下的唯一文件,也可以不用建新的表空间)

时间: 2024-10-17 21:20:40

oracle三种类型坏块的处理思路总结(没有物理备份)的相关文章

如何处理Oracle数据库中的坏块问题

本文主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍.因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了. 一:什么是数据库的坏块   首先我们来大概看一下数据库块的格式和结构 数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在我们对数据块进

qlserver、Mysql、Oracle三种数据库的优缺点总结

这篇文章主要介绍了sqlserver.Mysql.Oracle三种数据库的优缺点总结,需要的朋友可以参考下 一.sqlserver优点:易用性.适合分布式组织的可伸缩性.用于决策支持的数据仓库功能.与许多其他服务器软件紧密关联的集成性.良好的性价比等:为数据管理与分析带来了灵活性,允许单位在快速变化的环境中从容响应,从而获得竞争优势.从数据管理和分析角度看,将原始数据转化为商业智能和充分利用Web带来的机会非常重要.作为一个完备的数据库和数据分析包,SQLServer为快速开发新一代企业级商业应

C++ 中的三种类型

C++中一共三种类型 1.C++内置类型,2.1节中讲到的int.double.bool等就是基本的内置类型(低级数据类型): 2.C++还定义了一个内容丰富的抽象数据类型标准库,其中重要的如string.vector,数组和指针等(更高级的抽象数据类型): 3.第三种就是自定义的类类型,前面说过C++ 设计的焦点就是使所定义的类类型的行为可以像内置类型一样自然.

mysql、sqlserver、oracle三种数据库维护索引、外键、字段语法总结

mysql.sqlserver.oracle三种数据库维护索引.外键.字段语法总结 1.     MYSQL数据库 1)    创建索引 CREATE INDEX index_name ON table_name(column_list) CREATE UNIQUE INDEX index_name ON table_name(column_list) 修改表的方式添加索引 ALTER TABLE table_name ADD INDEX index_name(column_list) ALTE

20151015_系统分析阶段分析类的三种类型

在系统分析阶段将分析类分为三种类型:实体类.界面类.控制类. 1.实体类 实体类主要是作为数据管理和业务逻辑处理层面上存在的类别: 它们主要在分析阶段区分 实体类的主要职责是存储和管理系统内部的信息,它也可以有行为,甚至很复杂的行为,但这些行为必须与它所代表的实体对象密切相关 基本信息 上述给出的实体类的定义是比较抽象的.类具有继承和递归的特点,实体类可以在抽象类的基础上进一步定义具体的类 实体类是用于对必须存储的信息和相关行为建模的类.实体对象(实体类的实例)用于保存和更新一些现象的有关信息,

真空镀膜材料网话聊钢界电商的三种类型

据真空镀膜材料网最近的观察,钢铁交易的网上平台大致可以分为三种,刻章机网在这里把他们简单的定义为挂羊头卖狗肉型.自食其力型.拓展业务型. 挂羊头卖狗肉型.从事钢铁行业的人员上网时可能经常会上一些钢铁资讯类的网站,去那里看一下当前的钢铁行业态势和行业新闻,但是近几年来,不知道大家有没有发现,越来越多的资讯类的网站开始了他们的商业之旅,有的是给自己的咨询设置权限,只有开通会员才可以浏览:还有的是设置了钢铁交易的模块,改变了最初的资讯类平台,转而做起了销售. 自食其力型.这种类型大多是一些大中型的钢铁

设计模式之总结篇(设计模式六大原则以及设计模式三种类型)

经过这半年的学习,自己对设计模式这门课程也有了一定的认知.前面也发了关于23个设计模式的博客.现在对这些设计模式进行一个整体的总结. 首先,设计模式有六大原则: 原则一.单一职责原则 定义:There should never be more than one reason for a class to change(不要存在多于一个导致类变更的原因).通俗的说,即一个类只负责一项职责. 好处: 1.降低类的复杂度. 2.提高可读性. 3.提高可维护性. 4.变更引起的风险降低. 原则二.里氏替

备份的三种类型

完全备份:备份全部选中的文件夹,并不依赖文件的存档属性来确定备份那些文件:(在备份过程中,任何现有的标记都被清除,每个文件都被标记为已备份,换言之,清除存档属性).差异备份:差异备份是针对完全备份:备份上一次的完全备份后发生变化的所有文件:(差异备份过程中,只备份有标记的那些选中的文件和文件夹.它不清除标记,既:备份后不标记为已备份文件,换言之,不清除存档属性).增量备份:增量备份是针对于上一次备份(无论是哪种备份),备份上一次备份后,所有发生变化的文件:(增量备份过程中,只备份有标记的选中的文

一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等于byte, Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64

一开始看到Int16, Int32, Int64这三种类型就觉得有点怪, 为什么要整个数字结尾的, 挺怪的. 昨天互相想到, ms这么干就是想让大家一眼就知道这个数据类型占多大空间吧. Int8, 等于byte, Int16, 等于short, 占2个字节. -32768 32767 Int32, 等于int, 占4个字节. -2147483648 2147483647 Int64, 等于long, 占8个字节. -9223372036854775808 9223372036854775807