#每日一记#第六天+Oracle数据库出现坏块该怎么办?
  

一道闪电 2873

{{ttag.title}}
问题描述
日常数据库巡检,发现Alert日志提示ORA-01578:Oracle数据库损坏 (文件号 10,块号 28732);

排查步骤

1
、找出所有受影响的数据库对象
select tablespace_name, segment_type, owner,segment_name  from dba_extents
where file_id = 10 and 28732 between block_idAND block_id + blocks - 1;

查询可得,受影响的数据库对象为t_test , 类型为table

2
、 查询受坏块影响的对象
查询表对应的索引信息。
SQL> select owner, index_name, index_typefrom dba_indexes
where table_owner='test' ANDtable_name='t_test';

查询主键约束条件。
SQL> select owner, constraint_name,constraint_type, table_name from dba_constraints
WHERE owner='test' ANDconstraint_name='&INDEX_NAME' AND constraint_type='P';

3
、通过plsql 查询与表相关的触发器和视图,并对创建语句做好备份


解决步骤
Step a    
利用dbms_repair包,先创建repair table两个表:
begin
   dbms_repair.admin_tables(
   table_name=>'REPAIR_TABLE',
  table_type=>dbms_repair.repair_table,
  action=>dbms_repair.create_action,
   tablespace=>'ts_test');  
   end;
   /

begin
   dbms_repair.admin_tables(
  table_type=>dbms_repair.orphan_table,
   action=>dbms_repair.create_action,
  tablespace=>'ts_test');  
   end;
   /

Step b
校验受损的对象
set serveroutput on
declare
    rpr_count int;
    begin
    rpr_count:=0;
    dbms_repair.check_object(
    schema_name=>'test',
    object_name=>'t_test',
    repair_table_name=>'REPAIR_TABLE',
   corrupt_count=>rpr_count);  
   dbms_output.put_line('repaircount:'||to_char(rpr_count));
   end;
   /
repair count:1

Step c
下面的查询中可以看出列marked_corrupt全部为true,表明我们在check_object过程中已经标注了坏块

SQL> select object_name,block_id,corrupt_type,marked_corrupt,corrupt_description,repair_descriptionfrom repair_table;

OBJECT_NAM   BLOCK_ID CORRUPT_TYPEMARKED_COR CORRUPT_DESCRIP REPAIR_DESCRIPTION
---------- ---------- ------------ ------------------------- ------------------------------
t_test              27632        6148 TRUE                      mark block software corrupt

Step d
忽略坏块
exec dbms_repair.skip_corrupt_blocks(schema_name=> 'test',object_name => 't_test',flags =>dbms_repair.skip_flag );

PL/SQL procedure successfully completed.

Step e
通过hint强制count(*) 走全表扫描,执行结果无报错,统计结果对比之前,坏块导致表t_test数据丢失了3行。

Select /* full(t_test)*/ count(*) from t_test;

反思
数据库检查出坏块不要慌,先搞清楚坏的是表还是索引,索引的话重建就完事,表的话可能得牺牲点数据,不过一切都建立在数据库没备份的情况下!

打赏鼓励作者,期待更多好文!

打赏
9人已打赏

HNing 发表于 2022-7-26 19:40
  
此篇文章内容不错,感谢分享,实战类的项目排错经验,非常有助于给大家在日常工作中提供问题处理思路
sangfor_1126 发表于 2022-7-7 17:34
  
感谢分享,有利于工作和学习!
包清晨 发表于 2022-7-7 17:51
  
感谢分享,有利于工作和学习!
白鹭先生 发表于 2022-7-8 08:45
  
感谢分享,有利于工作和学习!
韩_鹏 发表于 2022-7-8 08:46
  
感谢分享                                                                                       
guafeng00 发表于 2022-7-8 08:59
  
感谢分享,有利于工作和学习!
她丶ta 发表于 2022-7-8 09:23
  

感谢分享,有利于工作和学习!
怪兽君 发表于 2022-7-8 09:38
  
感谢分享,有利于工作和学习!
angelccn 发表于 2022-7-8 11:05
  
感谢分享,有利于工作和学习!
头像被屏蔽
司马缸砸了光 发表于 2022-7-8 11:25
  
提示: 作者被禁止或删除 内容自动屏蔽
发表新帖
热门标签
全部标签>
标准化排查
新版本体验
【 社区to talk】
每日一问
高手请过招
功能体验
纪元平台
技术笔记
产品连连看
信服课堂视频
每日一记
安装部署配置
社区新周刊
sangfor周刊
平台使用
S豆商城资讯
技术晨报
技术盲盒
GIF动图学习
畅聊IT
答题自测
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
运维工具
用户认证
原创分享
解决方案
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
排障笔记本
产品预警公告
玩转零信任
技术争霸赛
「智能机器人」
追光者计划
2023技术争霸赛专题
卧龙计划
华北区拉练
天逸直播
以战代练
秒懂零信任
山东区技术晨报
文档捉虫
齐鲁TV
华北区交付直播
每周精选
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
西北区每日一问
升级&主动服务
高频问题集锦
POC测试案例
全能先锋系列
安全效果
云化安全能力
专家说
热门活动
产品动态
行业实践
产品解析
关键解决方案

本版版主

197
347
1002

发帖

粉丝

关注

217
292
151

发帖

粉丝

关注

25
16
5

发帖

粉丝

关注

7
12
27

发帖

粉丝

关注

5
10
7

发帖

粉丝

关注

32
38
46

发帖

粉丝

关注

10
3
1

发帖

粉丝

关注

本版达人

皮皮虾·真

本周建议达人

郑州网络

本周分享达人

二进制网络

本周提问达人