oracle 游离坏块的处理

本文介绍了一种Oracle数据库中遇到的数据坏块问题及其解决方案。通过分析错误信息和使用DBV工具定位坏块位置,最终采用填充数据块的方法成功修复了损坏的逻辑块。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

前天早上上班同事告訴我她oracle 的0級備份沒有成功,報如下錯誤:

RMAN-00571: ===========================================================
RMAN-00569: =============== ERROR MESSAGE STACK FOLLOWS ===============
RMAN-00571: ===========================================================
RMAN-03009: failure of backup command on ORA_DISK_1 channel at 10/31/2011 05:14:11
ORA-19566: 超過檔案 0的 /u/oradata/hrm/hrmasm.dbf可破壞區塊限制

ORA-19566: exceeded limit of string corrupt blocks for file string
Cause: The user specified limit of allowable corrupt blocks was exceeded while reading the specified datafile for a datafile copy or backup.
Action: None. The copy or backup operation fails. The session trace file contains detailed information about which blocks were corrupt.

查看trace文件

ORACLE_HOME = /u/oracle/product/9.2.0.4
System name:    Linux
Node name:      hrmdb
Release:        2.6.9-22.ELsmp
Version:        #1 SMP Mon Sep 19 18:32:14 EDT 2005
Machine:        i686
Instance name: hrm
Redo thread mounted by this instance: 1
Oracle process number: 96
Unix process pid: 3334, image: oracle@hrmdb (TNS V1-V3)
*** SESSION ID:(24.22820) 2011-10-31 16:57:14.565
***
Corrupt block relative dba: 0x0199d0a6 (file 6, block 1691814)
Fractured block found during backing up datafile
Data in bad block -
 type: 6 format: 2 rdba: 0x0199d0a6
 last change scn: 0x0ac2.5ad0c8e9 seq: 0x1 flg: 0x06
 consistency value in tail: 0x636d0601
 check value in block header: 0xda9f, computed block checksum: 0x2e42
 spare1: 0x0, spare2: 0x0, spare3: 0x0
***
Reread of blocknum=1691814, file=/u/oradata/hrm/hrmasm.dbf. found same corrupt data
*** 2011-10-31 17:04:44.323
ORA-27037: 无法取得档案状态
Linux Error: 2: No such file or directory
Additional information: 4
问题分析: 根据ORA-19566初步判断数据文件hrmasm.dbf应该有数据坏块。 使用DBV工具对hrmasm.dbf进行分析分析结果如下: [oracle@hrmdb ~]$ dbv file=/u/oradata/hrm/hrmasm.dbf blocksize=8192; 找到两个坏块1691898,1691814; 查询select * from V$BACKUP_CORRUPTION;显示备份遇到的坏块如下:
SQL> select * from V$BACKUP_CORRUPTION;
 
     RECID      STAMP  SET_STAMP  SET_COUNT     PIECE#      FILE#     BLOCK#     BLOCKS CORRUPTION_CHANGE# MARKED_CORRUPT CORRUPTION_TYPE
---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ------------------ -------------- ---------------
         1  766057401  766056939       5091          1          6    1691814          1                  0 YES            FRACTURED
         2  766057401  766056939       5091          1          6    1691898          1                  0 YES            FRACTURED
可以确定逻辑坏块为1691814,1691898;

解决方法:修复逻辑坏块

1.首先查看此两块中放的是什么数据,使用如下语句

SQL> SELECT segment_name,segment_type,extent_id,block_id, blocks
  2  from dba_extents t
  3   where file_id=6
  4     and 1691898 between block_id and (block_id + blocks - 1) ;
 
 
 
SEGMENT_NAME                                                                     SEGMENT_TYPE        EXTENT_ID   BLOCK_ID     BLOCKS
-------------------------------------------------------------------------------- ------------------ ---------- ---------- ----------
 
SQL> SELECT segment_name,segment_type,extent_id,block_id, blocks
  2  from dba_extents t
  3  where file_id=6
  4  and 1691814 between block_id and (block_id + blocks - 1) ;
 
SEGMENT_NAME                                                                     SEGMENT_TYPE        EXTENT_ID   BLOCK_ID     BLOCKS
-------------------------------------------------------------------------------- ------------------ ---------- ---------- ----------
 
通过以上查询发现此两块都为空块,没有数据。(如果有数据,对放置的表、索引、触发器等,删除重建就可以修复);

1.首先尝试通过RMAN备份数据恢复;

RMAN> blockrecover datafile 6 block 169184;

因为0级备份已经被删除,所以不能回复(备份很重要啊!)

2.通过在网上查找发现可以插入数据填满数据块进行修复,做法如下:
       1).修改表空间为不能自动扩展(alter database datafile /u/oradata/hrm/hrmasm.dbf autoextend off )

        2).创建一个实体表(create table aa (a char(500))

        3).对aa插入数据使把数据文件的剩余空间填满(insert into values("aaaaaaaaaaaa"); insert into aa select * from aa;反复执行,知道报错)

         4).查看数据文件的剩余空间                                                         

  SQL> select tablespace_name,file_id,sum(bytes)/1024/1024 size_m
  2    from dba_free_space
  3   where file_id=6 group by tablespace_name,file_id;
 
TABLESPACE_NAME                   FILE_ID     SIZE_M
------------------------------ ---------- ----------
HRMASM                                  6  4445.4375

还未填满,继续执行第三步,直到SIZE_M接近零;

            5).当剩余空间被填满,可以使用SQL查询1691898、1691814块中有没有填充数据,如果有表示已经成功修复。

SELECT segment_name,segment_type,extent_id,block_id, blocks
from dba_extents t
 where file_id=6
   and 1691898 between block_id and (block_id + blocks - 1) ;

              6).然后对操作进行COMMIT,以及做alter system checkpoint 把数据写入数据文件中。

               7).使用DBV查看是否修复成功。

[oracle@hrmdb ~]$ dbv file=/u/oradata/hrm/hrmasm.dbf blocksize=8192

               8).删除表aa释放空间(drop table aa;)

               9).修改表空间为自动扩展(alter database datafile /u/oradata/hrm/hrmasm.dbf autoextend on)

设定好RMAN 0级备份,做数据全备份,问题解决。

在此感谢天堂向左DBA向右! http://www.oracleblog.org/working-case/how-to-deal-with-corrupt-block/

 

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/16381228/viewspace-710097/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/16381228/viewspace-710097/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值