当前位置 > 主页 > 万和大讲堂 >


如何处理Oracle数据库中的坏块问题_南京Oracle认证培训分享

2016-10-09 16:22

  本文南京Oracle认证培训主要介绍如何去处理在Oracle数据库中出现坏块的问题,对于坏块产生在不同的对象上,处理的方法会有所不同,本文将大致对这些方法做一些介绍。因为数据库运行时间长了,由于硬件设备的老化,出现坏块的几率会越来越大,因此,做为一个DBA,怎么去解决数据库出现的坏块问题就成了一个重要的议题了。


  什么是数据库的坏块


  首先我们来大概看一下数据库块的格式和结构


  数据库的数据块有固定的格式和结构,分三层:cache layer,transaction layer,data layer。在我们对数据块进行读取写入操作的时候,数据库会对要读写的数据块做一致性的检查,其中包括:数据块的类型、数据块的地址信息、数据块的SCN号以及数据块的头部和尾部。如果发现其中有不一致的信息,那数据库就会标记这个数据块为坏块了。数据库的坏块分为两种,逻辑坏块和物理坏块。


  坏块对数据库产生的影响


  如果数据库出现坏块,数据库的告警日志文件里面会存在有如下的一些报错信息:Ora-1578以及Ora-600 and trace file in bdump directory,其中Ora-600错误的第一个参数值的范围是[2000]-[8000],不同的值代表着数据块的不同的层出现问题,具体的如下表所示:


  Range                   block layer


  Cache layer             2000 – 4000


  Transaction layer       4000 – 6000


  Data layer              6000 - 8000


  坏块产生影响的对象可能是数据字典表、回滚段表、临时段、用户数据表和索引等。不同的对象产生坏块后的处理方法不尽相同。更多内容,请咨询南京Oracle认证培训


  坏块产生的原因


  Oracle调用标准C的系统函数,对数据块进行读写操作,因此,坏块是有可能由以下几种原因产生:


  硬件的I/O错误


  操作系统的I/O错误或缓冲问题


  内存或paging问题


  磁盘修复工具


  一个数据文件的一部分正在被覆盖


  Oracle试图访问一个未被格式化的系统块失败


  数据文件部分溢出


  Oracle或者操作系统的bug


  坏块的处理方法


  1.先收集相应的关于坏快的信息,从AlertSID.log文件或者从trace文件中查找,找到例如以下的一些信息:


  Ora-1578  file#  (RFN)  block#


  Ora-1110  file#  (AFN)  block#


  Ora-600   file#  (AFN)  block#


  其中RFN表示的是relative_fno


  AFN表示的是file_id


  Select file_name,tablespace_name,file_id “AFN”,relative_fno “RFN”


  From dba_data_files;


  Select file_name,tablespace_name,file_id, relative_fno“RFN”


  From dba_temp_files;


  2.确定存在坏块的对象是什么:


  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;


  通过上面这个查询语句就可以查出当前存在坏块的对象是什么,是什么类型的对象。南京Oracle认证培训提醒大家需要注意的是如果是temp文件中出现坏块,是没有记录返回的。


  3.根据2中查询出来的对象类型,确定相应的处理方法


  出现坏块的常见对象有:


  Sys用户下的对象


  回滚段


  临时段


  索引或者分区索引


  表


  常用的处理方法有:


  恢复数据文件


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


  通过ROWID RANGE SCAN 保存数据


  使用DBMS_REPAIR


  使用EVENT


  4.具体处理方法的介绍


  ◎恢复数据文件方法:


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


  步骤如下:


  1)先offline受影响的数据文件,执行以下的语句:


  ALTER DATABASE DATAFILE 'name_file' OFFLINE;


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


  ALTER DATABASE RENAME FILE 'old_name' TO 'new_name';


  3) 恢复数据文件,执行以下语句:


  RECOVER DATAFILE 'name_of_file';


  4)Online恢复后的数据文件,执行以下的语句:


  ALTER DATABASE DATAFILE 'name_of_file' ONLINE;


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


  使用这种方法要求数据库版本是9.2.0以上,要求配置了Rman的catalog数据库,数据库为归档方式,并且有完整的物理备份。更多内容,请咨询南京Oracle认证培训


  步骤如下:


  使用RMAN的BLOCKRECOVER命令 :


  Rman>run{blockrecover datafile 5 block 11,16;}


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


  Rman>run{blockrecover datafile 5 block 11,16 restore until sequence 8505;}


  ◎通过ROWID RANGE SCAN 保存数据


  1) 先取得坏块中ROW ID的最小值,执行以下的语句:


  SELECT dbms_rowid.rowid_create(1,,,,0) from DUAL;


  2)取得坏块中的ROW ID的最大值,执行以下的语句:


  SELECT dbms_rowid.rowid_create(1,,,+1,0) from DUAL;


  3)建议一个临时表存储那些没有坏块的数据,执行以下的语句:


  CREATE TABLE salvage_table AS SELECT  *   FROM  corrupt_tab Where 1=2;


  4)保存那些不存在坏块的数据到临时表中,执行以下的语句:


  INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A WHERE rowid < '';


  INSERT INTO salvage_table SELECT /*+ ROWID(A) */ * FROM A  WHERE rowid >= '‘;


  5) 根据临时表中的数据重建表,重建表上的索引,限制。


  ◎使用10231诊断事件,在做全表扫描的时候跳过坏块


  可以在session级别设定:


  ALTER SESSION SET EVENTS '10231 TRACE NAME CONTEXT FOREVER, LEVEL 10';


  也可以在数据库级别上设定,在初始化参数中加入:event="10231 trace name context forever, level 10" ,然后重启数据库。


  然后从存在坏块的表中取出不存在坏块的数据,执行以下的语句:


  CREATE TABLE salvage_emp AS SELECT * FROM corrupt_table;


  最后rename生成的corrupt_table为原来表的名字,并重建表上的索引和限制。更多内容,请咨询南京Oracle认证培训


  ◎使用dbms_repair包进行恢复


  使用dbms_repair标记有坏块的表,在做全表扫描的时候跳过坏块,执行以下的语句:


  Execute DBMS_REPAIR.SKIP_CORRUPT_BLOCKS('','');


  然后使用exp工具或者createtable as select的方法取出没有坏块数据,然后重建表,表上的索引和限制。


  想和兴趣相投的朋友们一起交流吗?那就来江苏万和计算机培训中心吧。而江苏万和作为南京专业的Oracle认证培训中心,也是Oracle等众多厂商的授权培训、考试机构,欢迎广大有志于此行业发展的学员们加入。

最近开班 more>
  • 全栈开发
  • 前端基础班
  • 软件测试
  • Java大数据开发工程师
  • 云原生精英班
  • 开发课程基础班第四期
  • 开发课程基础班第三期
  • 开发课程基础班第二期
  • 开发课程基础班第一期
  • Java Web UI Python
  • CISP
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • HCIE-Datacom(HCIA,HCIP基础)
  • HCIP-Datacom(HCIA基础)
  • HCIA-Datacom(0基础)
  • OCM 12C
  • OCP 19C
  • RHCE 9.0
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • 脱产班
  • vip班
  • 考试计划
  • 脱产班
  • 脱产班
  • 脱产班
  • 双休班
  • 双休班
  • 双休班
  • 双休班
  • 业余班
  • 业余班
  • 10月16日
  • 9月23日
  • 9月2日
  • 9月30日
  • 8月26日
  • 10月8日
  • 9月23日
  • 9月16日
  • 9月9日
  • 随时开课
  • 9月21日
  • 10月17日
  • 9月18日
  • 9月2日
  • 11月2日
  • 10月26日
  • 9月7日
  • ——
  • 随时开课
  • 9月26日
    • 姓 名 :
    • 电 话 :
    • 课 程 :

技术交流群

  • Java大数据交流群560819979加入
  • Python技术交流群595083299加入
  • Oracle技术交流群595119011加入
  • Web前端技术交流群604697610加入
  • Huawei技术交流群482919361加入
  • Redhat技术交流群587875348加入
  • UI设计技术交流群511649801加入
  • Cisco技术交流群596886705加入
  • IT运维技术交流群605888381加入