【DB笔试面试219】在Oracle中,如果发现有坏块,那么如何检索其它未坏的数据?
在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 |
● 本文作者:小麦苗,只专注于数据库的技术,更注重技术的运用
● 作者博客地址:http://blog.itpub.net/26736162/abstract/1/
● 本系列题目来源于作者的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解
● 版权所有,欢迎分享本文,转载请保留出处
● QQ:646634621 QQ群:230161599
● 题目解答若有不当之处,还望各位朋友批评指正,共同进步
长按下图识别二维码或微信扫描下图二维码来关注小麦苗的微信公众号:xiaomaimiaolhr,学习最实用的数据库技术。
本文分享自微信公众号 - DB宝(lhrdba)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。
更多相关文章
- 【DB笔试面试618】在Oracle中,“OR扩展”可以有查询转换吗?
- 【DB笔试面试692】在Oracle中,V$SYSSTAT中的CLASS列分别代表什么?
- 【DB笔试面试497】Oracle使用哪个包可以生成并传递数据库告警信
- 【DB笔试面试624】在Oracle中,Hash Join是不是有排序?Hash Join会
- 【DB笔试面试844】在Oracle中,tnsnames.ora文件的作用是什么?
- 【DB笔试面试641】在Oracle中,新建索引后统计信息是否自动收集?
- 【DB笔试面试238】在Oracle中,如何将信息写入Oracle的告警日志中?
- 【DB笔试面试109】在Oracle中,Which 。。。conventional path of
- 【DB笔试面试846】在Oracle中,TWO_TASK环境变量的作用是什么?