每个oracle 数据块完全是二进制写入。在oracle数据块被使用之前,oracle检查它可能的块损坏。如果数据块的格式没有遵循原来格式,这种情况被认为是块损坏。这篇文章就是讨论oracle dba如何处理块损坏。
数据块损坏的检查在缓存中和其他更高层次的oracle模式执行。在缓存模式被检查的信息如下:
- : 块种类
- :块的对应物
- : 块版本
- :块队列数字
- :数据块地址
- :块的校验和
在缓存模式下,如果块的格式不一致,则块被认为介质损坏,然而在更高层次的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问题解决后,你可以开始还原损坏数据库的冒险。按照下面胡步骤来还原损坏的数据库;
- 确定损坏的内容。在报警日志,跟踪文件和完整的错误的信息来确定数据块损坏的具体内容。猜想错误的信息表明损坏是来之具体的文件块
- 连接上内部服务管理器
- 确定损坏文件的名字
- 确定损坏文件具体特征
- 在下列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‘;
:对于用户表,记下表和拥有者的名字
- 通过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;
- 如果是硬件或者控制器坏了,迁移这些文件到好的磁盘上
:对于归档模式下的数据库,使损坏的数据文件脱机,并且从好的磁盘上的备份恢复数据。还原数据文件,然后使他联机,文件又能使用了
:对于非归档下的数据库,使损坏数据文件脱机,从好的磁盘上的备份恢复数据。接着使数据文件联机,文件现在能使用了
- 再次确认在对象上的分析数据来确保不再损坏
在这点上,损坏块的数据可以通过一些工具被抢救
:在损坏前,你可以确保介质恢复来还原数据库到一个阶段
:你可以通过有效地输出删除和重建对象
:如果你知道指向损坏的文件号和块号,你可以通过环查坏段来抢救损坏表的数据
:当执行全表扫描时,在参数文件上设置事件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 ,通过这些你可以提取来之坏段的数据。这些工具很昂贵,而且不保证所有数据可以被抢救。
Comment