处理在oracle中的数据库块损坏

 

每个oracle 数据块完全是二进制写入。在oracle数据块被使用之前,oracle检查它可能的块损坏。如果数据块的格式没有遵循原来格式,这种情况被认为是块损坏。这篇文章就是讨论oracle dba如何处理块损坏。

 

数据块损坏的检查在缓存中和其他更高层次的oracle模式执行。在缓存模式被检查的信息如下:

  1. 块种类
  2. :块的对应物
  3. 块版本
  4. :块队列数字
  5. :数据块地址
  6. :块的校验和

在缓存模式下,如果块的格式不一致,则块被认为介质损坏,然而在更高层次的oracle模式下的数据块格式不一致被认为是软件损坏。

 

在损坏的块中的信息或多或少会丢失;你将不得不使用一些数据恢复或者输出来重建它。Oracle有几种工具——例如PRM-DUL (parnassusdata.com) ,你可以使用它提取坏块中的数据出来,但是很明显使用这些工具将会是很贵的。你必须要衡量使用这些工具并且重建丢失的信息的花费(而且不保证百分百成功)。

 

当oracle遇到块损坏时,你经常看见错误的信息例如ORA-1578或者ORA-600。你可以使用几种工具去确定数据库是否损坏,也可以搞清楚损坏的类型和内容。

 

分析表

通过分析表结构和它的关联对象,你可以执行表详细胡数据块检查去辩证是否块损坏;

 

Analyze table table_name validate structure cascade;

 

数据块在缓存或者更高级别模式中被检查。索引块也被检查并且在表数据和索引行关系之间的一对一也被证实。

 

使用DB_VERIFY

Oracle提供DB_VERIFY去验证数据文件即使当数据文件脱机或则数据库不可用。DB_VERIFY是一个外部的命令行去证实数据文件和脱机下物理结构的完整性。

 

使用oracle校验和工具

Oracle提供一些悄可以用来证实损坏数据的校验和工具

校验和工具能够设置在init.ora 文件中的参数和事件

通过设置db_block_checksum来在下一次所有数据块更新的次数。数据库写入器进行计算校验和的任务。当数据块的校验和被写进磁盘上时,校验和被存储在它的缓存头部。

 

在校验和形成后,块总是会使用校验和即使参数后来修改了。

设置log_block_checksum引起重做日志文件块被计算的校验和

 

对于在参数文件中每个的事件甚至10210,10211,10212和10225通过添加下面的行

Event =’event_number trace name errorstack  forever, level 10’

 

当事件10225被设置时,fet$和uset$数据字典表可以通过检查他们的完整性来检查损坏。不匹配的格式的数据块被标记成软件损坏。

 

:设置db_block_cache_protect值来保护来自即将损坏的缓存层次。它可能引起数据块事例崩溃,但是损坏没有写入磁盘

 

拯救来自损坏oracle数据库中数据

 

Oracle数据块损坏有各种各样的原因,例如这些:

:硬件损坏

:操作系统bug

:输入输出或则缓存问题

:不支持重复修理磁盘

:内存问题

:oracle bug

:电脑病毒

 

数据块损坏通常来之硬件上的问题,所以悄应该第一时间解决硬件问题或者修复操作系统错误。当所有非oracle问题解决后,你可以开始还原损坏数据库的冒险。按照下面胡步骤来还原损坏的数据库;

  1. 确定损坏的内容。在报警日志,跟踪文件和完整的错误的信息来确定数据块损坏的具体内容。猜想错误的信息表明损坏是来之具体的文件块
  2. 连接上内部服务管理器
  3. 确定损坏文件的名字
  4. 确定损坏文件具体特征
  5. 在下列4步骤,还原的方法依照损坏的段来确定

:对于回滚胡段或者数据字典损坏,咨询下oracle是否支持,因为这牵扯到使系统不可还原复杂的非文件参数。

:对于索引段,确定索引来之哪个表,如下:

Svrgmgr>select table_owner ,table_name  from dba_indexes  where index_name=’segment_name’

:对于集群段,确定集群关系的表,如下:

Svrmgr>select owner,table_name from dba_tables where cluster_name =‘segment_name‘;

:对于用户表,记下表和拥有者的名字

  1. 通过analyze命令来确定问题不是间歇的至少两次。在服务器管理器,如果是表使用下面命令:

Svrmgr>analyze  table owner,tablename validate structure cascade;

如果是索引使用下面命令:

Svrmgr>analyze table owner ,tablename validate structure cascade;

如果是集群使用下面的命令

Svrmgr>analyze cluster owner,clustername validate structure cascade;

  1. 如果是硬件或者控制器坏了,迁移这些文件到好的磁盘上

:对于归档模式下的数据库,使损坏的数据文件脱机,并且从好的磁盘上的备份恢复数据。还原数据文件,然后使他联机,文件又能使用了

 

:对于非归档下的数据库,使损坏数据文件脱机,从好的磁盘上的备份恢复数据。接着使数据文件联机,文件现在能使用了

  1. 再次确认在对象上的分析数据来确保不再损坏

 

 

在这点上,损坏块的数据可以通过一些工具被抢救

 

   :在损坏前,你可以确保介质恢复来还原数据库到一个阶段

   :你可以通过有效地输出删除和重建对象

   :如果你知道指向损坏的文件号和块号,你可以通过环查坏段来抢救损坏表的数据

      :当执行全表扫描时,在参数文件上设置事件10231引起oracle跳过软件和介质损坏段

Event=’10231’ trace name context forever,level 10’

:当进行索引范围扫描时,在参数文件上设置事件10233引起oracle来跳过软件和介质坏段

Event=’10233’ trace namecontext forever,level 10’

 

Tip

Oracle 的支持服务也有一些工具,如PRM-DUL (parnassusdata.com),BBED ,通过这些你可以提取来之坏段的数据。这些工具很昂贵,而且不保证所有数据可以被抢救。


Posted

in

by

Tags:

Comments

Leave a Reply

Your email address will not be published. Required fields are marked *