关于oracle数据库坏块的总结

点赞:32991 浏览:154840 近期更新时间:2024-02-20 作者:网友分享原创网站原创

【摘 要】在天津地铁1号线系统数据库全库备份过程中,经常出现由于数据库坏块导致全库备份中止的情况,本文针对1号线数据库坏块的产生及处理做了归纳总结,其中加入了个人工作中的一些经验教训.

【关 键 词 】Oracle 数据库 坏块

一、什么是数据库的坏块

首先我们来大概看一下数据库块的格式和结构.数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer.在对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括:数据块的类型、数据块的地址信息、数据块的 SCN号以及数据块的头部和尾部.如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了.Oracle 数据坏块大致分为两种,一种是由于磁盘损坏造成的物理坏块,另外一种是由于数据库读写错误造成的逻辑坏块.

关于oracle数据库坏块的总结参考属性评定
有关论文范文主题研究: 关于数据库的论文范文素材 大学生适用: 学院学士论文、研究生论文
相关参考文献下载数量: 13 写作解决问题: 本科论文怎么写
毕业论文开题报告: 论文模板、论文摘要 职称论文适用: 技师论文、职称评中级
所属大学生专业类别: 本科论文怎么写 论文题目推荐度: 经典题目

因此处理Oracle 数据坏块的时候首先需要考虑的就是坏块是由于什么造成的.如果是物理坏块,则首先需要考虑的是更换硬盘,然后再考虑逻辑坏块的处理方法.

二、坏块对数据库产生的影响

如果数据库出现坏块,数据库的告警日志文件里面会存在有如下的一些报错信息:Ora-1578以及Ora-600 and trace file in bdump Directory,数据坏块往往是数据库在执行某些insert、updata、deletc语句时会出现ORA-01578 ORA-01110 数据块损坏的报错信息.

在数据库备份过程中出现了数据库坏块,造成数据库全库备份中断,需要恢复坏块后,才能正常备份数据库.例如以下报错信息:

Corrupt block relative dba: 0x030a455f (file 12, block 673119)

Data in bad block

Reread of blocknum等于673119, file等于 C:\DATAFILE\AFC_TBS.DBF. found same corrupt data

从报错信息中我们可以看出,坏块出现在数据文件C:\DATAFILE\AFC_TBS.DBF上,文件号为12,坏块号为673119,sequence号为26717

三、坏块产生的原因

Oracle调用标准C的系统函数,对数据块进行读写操作,因此,坏块可能是由以下几种原因产生:硬件的I/O错误、操作系统的I/O错误或缓冲问题、内存或paging问题、磁盘修复工具、一个数据文件的一部分正在被覆盖、Oracle试图访问一个未被格式化的系统块失败、数据文件部分溢出、Oracle或者操作系统的bug

四、坏块的处理方法

(一)通过下面这个查询语句就可以查出当前存在坏块的对象是什么,是索引还是表.需要注意的是如果是temp文件中出现坏块,是没有记录返回的:

SELECT tablespace_name, segment_type, owner, segment_name, partition_name FROM dba_extents WHERE file_id 等于 and between block_id AND block_id + blocks 1;(其中〈AFN〉是文件号,〈BL〉是坏块号)

(二)根据1中查询出来的对象类型,确定相应的处理方法

1.出现坏块的常见对象有:Sys用户下的对象、回滚段、临时段、索引或者分区索引表.

2.常用的处理方法有:恢复数据文件、只恢复坏的block、通过ROWID RANGE SCAN 保存数据、使用DBMS_REPAIR包、使用EVENT

(三)具体处理方法的介绍

1.恢复数据文件方法:

如果数据库是归档方式下,并且有完整的物理备份,就可以使用此方法来恢复. 步骤如下:

(1)先offline受影响的数据文件,执行语句;

(2)保留有坏块的数据文件,然后拷贝备份的数据文件.如果恢复的数据文件要求路径不同,执行语句;

(3)恢复数据文件,执行语句;

(4)Online恢复后的数据文件,执行语句.

2.只恢复坏的block(9i以上版本可用)

使用这种方法要求数据库版本是9.2.0以上,要求配置了Rman的catalog数据库,数据库为归档方式,并且有完整的物理备份.步骤如下:

使用RMAN的BLOCKRECOVER命令 :

Rman>run{blockrecover datafile 12 block 673119;}

也可以强制使用某个SCN号之前的备份,恢复数据块.

Rman>run{blockrecover datafile12 block 673119 restore until sequence 26717;}

注:坏块恢复成功后,通常要做一次全库备份,全库备份的大小会比上一次大很多,最好是在全库备份之前,先做一次归档备份,这样可以减少全库备份的大小,不过全备还是会比上一次的大.再一次全库备份大小就会恢复到之前的大小了.

五、坏块的预先发现的方法

(一)如果要检测数据库中所有的表,可以利用exp工具导出整个数据库可以检测坏块.不过这个工具有一些缺陷,对以下情况的坏块是检测不出来的:HWM以上的坏块是不会发现的;索引中存在的坏块是不会发现的;数据字典中的坏块是不会发现的

(二)如果只是对数据库中比较重要的表进行坏块检查,可以使用ANALYZE TABLE tablename VALIDATE STRUCTURE CASCADE 的方法来检测坏块,它执行坏块的检查,但是不会标记坏块为corrupt,检测的结果保存在USER_DUMP_DEST目录下的用户trace文件中.

(三)使用Oracle的专门工具dbv来检查坏块,具体的语法如下:

例如:Dbv file等于C:\DATAFILE\AFC_TBS.DBF blocksize等于8192

注:因为dbv要求file后面跟的必须是一个文件扩展名,所以如果用裸设备存储的,就必须使用ln链接裸设备到一个文件,然后再用dbv对这个链接文件进行检查.