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

一道闪电 6133

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

本版版主

211
408
1047

发帖

粉丝

关注

8
18
28

发帖

粉丝

关注

12
11
1

发帖

粉丝

关注

本版达人

皮皮虾·真

本周建议达人

郑州网络

本周分享达人

二进制网络

本周提问达人