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",共同学习,共同成长!!!
