暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

在Oracle中,如果发现有坏块,那么如何检索其它未坏的数据?

DB宝 2017-08-01
471



Q
题目如下所示:

在Oracle中,如果发现有坏块,那么如何检索其它未坏的数据?


     

A
答案如下所示:



首先需要找到坏块的IDdbv工具可以实现),假设坏块ID<BID>,假定文件编号为<FID>。运行下面的SQL语句查找段名:

SELECT SEGMENT_NAME,SEGMENT_TYPE,EXTENT_ID,BLOCK_ID, BLOCKS

FROM DBA_EXTENTS T

WHERE FILE_ID = <FID>

AND <BID> BETWEEN BLOCK_ID AND (BLOCK_ID + BLOCKS - 1);

找到坏块所属的段名称,若段是一个表,则最好建立一个临时表,存放好的数据。若段是索引,则删除它,再重建。

CREATE TABLE GOOD_TABLE AS

SELECT FROM BAD_TABLE WHERE ROWID NOT IN

(SELECT ROWID FROM BAD_TABLE WHERE SUBSTR(ROWID,10,6) = <BID>);

还可以使用诊断事件10231设置在全表扫描时跳过坏块,如下所示:

SQL> ALTER SYSTEM SET EVENTS '10231 trace name context forever,level 10';

然后创建一个临时表GOOD_TABLE将原表中除坏块的数据都检索出来:

SQL>CREATE TABLE GOOD_TABLE AS SELECT * FROM BAD_TABLE;

最后关闭诊断事件:

SQL> ALTER SYSTEM SET EVENTS '10231 TRACE NAME CONTEXT OFF ';

事件10231的说明如下:

[oracle@rhel6lhr ~]$ oerr ora 10231

10231, 00000, "skip corrupted blocks on _table_scans_"

// *Action: such blocks are skipped in table scans, and listed in trace files

关于ROWID的结构,还可以参考DBMS_ROWID.ROWID_CREATE函数。




DB笔试面试历史连接

http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w

About Me:小麦苗

 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用

● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/

 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

 版权所有,欢迎分享本文,转载请保留出处

 QQ:646634621  QQ群:230161599

● 题目解答若有不当之处,还望各位朋友批评指正,共同进步

长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。



最后修改时间:2020-01-10 21:07:12
文章转载自DB宝,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论