在Oracle中,如果发现有坏块,那么如何检索其它未坏的数据?
A 答案如下所示:
首先需要找到坏块的ID(dbv工具可以实现),假设坏块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函数。
http://mp.weixin.qq.com/s/Vm5PqNcDcITkOr9cQg6T7w
About Me:小麦苗● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:230161599
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。