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

一道闪电 1734

{{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】
技术笔记
功能体验
技术咨询
产品连连看
标准化排查
GIF动图学习
2023技术争霸赛专题
每周精选
信服课堂视频
通用技术
自助服务平台操作指引
秒懂零信任
技术晨报
安装部署配置
答题自测
原创分享
升级&主动服务
社区新周刊
POC测试案例
畅聊IT
专家问答
技术圆桌
在线直播
MVP
网络基础知识
升级
安全攻防
上网策略
测试报告
日志审计
问题分析处理
流量管理
每日一记
运维工具
云计算知识
用户认证
解决方案
sangfor周刊
VPN 对接
项目案例
SANGFOR资讯
专家分享
技术顾问
信服故事
SDP百科
功能咨询
终端接入
授权
设备维护
资源访问
地址转换
虚拟机
存储
迁移
加速技术
排障笔记本
产品预警公告
玩转零信任
信服圈儿
S豆商城资讯
技术争霸赛
「智能机器人」
追光者计划
深信服技术支持平台
社区帮助指南
答题榜单公布
纪元平台
卧龙计划
华北区拉练
天逸直播
以战代练
山东区技术晨报
文档捉虫活动
齐鲁TV
华北区交付直播
2024年技术争霸赛
北京区每日一练
场景专题
故障笔记
排障那些事
高手请过招
高频问题集锦
全能先锋系列
云化安全能力

本版版主

189
299
979

发帖

粉丝

关注

217
288
151

发帖

粉丝

关注

25
13
5

发帖

粉丝

关注

7
11
24

发帖

粉丝

关注

5
7
7

发帖

粉丝

关注

31
34
45

发帖

粉丝

关注

本版达人

皮皮虾·真

本周建议达人

郑州网络

本周分享达人

二进制网络

本周提问达人