ITPub博客

首页 > 数据库 > Oracle > Oracle日常问题-坏块修复

Oracle日常问题-坏块修复

原创 Oracle 作者:chenoracle 时间:2020-02-17 11:25:40 0 删除 编辑

Oracle 日常问题- 坏块 修复

一:问题现象

(1)NC 进行收款结算时报错 (ORA-01578)

(2) 数据备份日志 (exp) 报错:

(3) 数据库警告日志报错:

二:问题原因

机房意外断电,导致数据库数据块损坏;

三:基本信息

(1) 数据库服务器操作系统:

(2) 数据库版本

四:查看数据文件号及名称

select  file_id , tablespace_name , file_name , bytes / 1024 / 1024   from  dba_data_files order   by   1 ;

五:通过DBV 检查文件是否有坏块

(1) 检查 nnc_index01.dbf 文件

dbv file='/oradata/nc/nnc_index01.dbf'

结论file_id=6(nnc_index01.dbf),block=196373,643867,459202 出现三个索引坏块

(2) 检查 nnc_index02.dbf 文件

dbv file='/oradata/nc/nnc_index0 2 .dbf'

结论:file_id=8(nnc_index02.dbf),block=169072 出现一个索引坏块

(3) 检查 nnc_data01.dbf 文件

dbv file='/oradata/nc/nnc_ data 01.dbf'

结论:file_id=5(nnc_data01.dbf) 无坏块

(4) 检查 nnc_data02.dbf 文件

dbv file='/oradata/nc/nnc_ data 0 2 .dbf'

结论:file_id=7(nnc_data02.dbf),block=336465 出现一个数据坏块

(5) 检查 nnc_user01.dbf 文件

dbv file='/oradata/nc/nnc_ user 01.dbf'

......

(6) 检查 nnc_undotbs01.dbf 文件

dbv file='/oradata/nc/nnc_ undotbs 01.dbf'

......

(7) 检查 nnc_sysaux01.dbf 文件

dbv file='/oradata/nc/nnc_ sysaux .dbf'

......

(8) 检查 nnc_system01.dbf 文件

dbv file='/oradata/nc/nnc_ system01.d bf'

......

六:查看坏块所属段及类型

(1) 查看 file=6(459202) 对应段类型及名称

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 459202  between block_id and block_id + blocks - 1;

(2) ) 查看 file=6(643867) 对应段类型及名称

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 643867  between block_id and block_id + blocks - 1;

(3) 查看 file=6(1963727) 对应段类型及名称

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 6

   and 1963727  between block_id and block_id + blocks - 1;

(4) 查看 file=8(169072) 对应段类型及名称

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 8

   and 169072  between block_id and block_id + blocks - 1;

(5) 查看 file=7( 336465 ) 对应段类型及名称

select tablespace_name, segment_type, owner, segment_name

  from dba_extents

 where file_id = 7

   and 336465 between block_id and block_id + blocks - 1;

七:恢复之前需要先备份损坏数据块对应的表

通过exp 备份不能直接备份出有坏块的表,需要设置内部事件

ALTER SYSTEM SET EVENTS='10231 trace name context forever,level 10';

通过expdp 备份可以直接跳过坏块;

八:查看数据库备份

归档模式,并且有rman 备份,有前两天的 Rman 全备以及全备到今天的所有归档日志;

恢复方式:基于数据块的Rman 恢复

(1) 恢复 datafile=7 的所有坏块

RMAN>backup validate datafile 7;

select * from v$database_block_corruption where file#=4;

RMAN>blockrecover datafile 7  block 336465  from backupset;

验证坏块位置

进行恢复

RMAN>blockrecover datafile 7 block 336465;

检查是否恢复成功

(2) 恢复 datafile=6 的所有坏块

RMAN>backup validate datafile 6;

select * from v$database_block_corruption where file#=6;

RMAN>blockrecover datafile 6  block  459202 ,  643867, 1963727 ;

验证坏块位置

进行恢复

检查是否恢复成功

(3) 恢复 datafile=8 的所有坏块

RMAN>backup validate datafile 8;

RMAN> blockrecover datafile 8  block  169072 ;

验证坏块位置

进行恢复

检查是否恢复成功

欢迎关注我的微信公众号"IT小Chen",共同学习,共同成长!!!


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

请登录后发表评论 登录
全部评论
Oracle ACE、OCMU 用户组成员、Oracle 11g OCM、微信公众号"IT小Chen"

注册时间:2014-08-05

  • 博文量
    853
  • 访问量
    2727978