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出现三个索引坏块



结论:file_id=8(nnc_index02.dbf),block=169072出现一个索引坏块
(3) 检查nnc_data01.dbf文件
dbv file='/oradata/nc/nnc_data01.dbf'



结论:file_id=5(nnc_data01.dbf)无坏块
(4) 检查nnc_data02.dbf文件
dbv file='/oradata/nc/nnc_data02.dbf'

结论:file_id=7(nnc_data02.dbf),block=336465出现一个数据坏块
(5) 检查nnc_user01.dbf文件
dbv file='/oradata/nc/nnc_user01.dbf'
......
(6) 检查nnc_undotbs01.dbf文件
dbv file='/oradata/nc/nnc_undotbs01.dbf'
......
(7) 检查nnc_sysaux01.dbf文件
dbv file='/oradata/nc/nnc_sysaux.dbf'
......
(8) 检查nnc_system01.dbf文件
dbv file='/oradata/nc/nnc_system01.dbf'
......
六:查看坏块所属段及类型
(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;


验证坏块位置


进行恢复


检查是否恢复成功





