一:问题现象

(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 ;


验证坏块位置


进行恢复


检查是否恢复成功

转载自chenoracle

最后修改:2022 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏