前天早上上班同事告訴我她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可破壞區塊限制
查看trace文件
ORACLE_HOME = /u/oracle/product/9.2.0.4System 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/