首页 > Linux操作系统 > Linux操作系统 > oracle 游离坏块的处理
前天早上上班同事告訴我她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.4解决方法:修复逻辑坏块
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博客 ” ,链接:https://blog.itpub.net/16381228/viewspace-710097/ ,如需转载,请注明出处,否则将追究法律责任。