温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

【BBED】BBED模拟并修复ORA-08102错误

发布时间:2020-07-17 12:50:54 来源:网络 阅读:485 作者:小麦苗best 栏目:关系型数据库

BBED】BBED模拟并修复ORA-08102错误

 

1.1  BLOG文档结构图

【BBED】BBED模拟并修复ORA-08102错误 

 

1.2  前言部分

1.2.1  导读和注意事项

各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~

使用BBED修复ORA-08102错误(重点)

BBED的使用

数据块格式的dump文件解释

④ ORA-08102错误的trace文件解释

从rdba获取ROWID信息

⑥ 其它实用技能

 

1.3  本文简介

这几天一个朋友问我有关ORA-08102的错误,而且是关于OBJ$表上的I_OBJ4索引。这些系统对象的索引,不能采用重建或设置事件的方式来修复该错误。模模糊糊的记得很早以前看过使用BBED的方式来修复该错误,只是已经记不清了。正好,趁此机会把该错误再模拟的复现一下,也把bbed再熟悉一下吧。

朋友发给我的参考文章也是大师惜分飞的博客地址,大致看了一下过程,主要是找到索引块的相关地址,然后利用bbed把键值修改的和表中存储的一致即可。还是那句话,“纸上得来终觉浅,绝知此事要躬行。”,自己模拟实验,这个过程是必须的。

废话不多说,开始实验吧。

1.3.1  相关文章链接

阅读本篇文章,请先阅读以下内容:

1. Oracle 中 Object_iD Data_Object_ID 的区别:http://blog.itpub.net/26736162/viewspace-2145230/

2. Oracle的dump函数:http://blog.itpub.net/26736162/viewspace-2145228/

3. BBED的几篇文章:

【BBED】编译及基本命令(1)http://blog.itpub.net/26736162/viewspace-2075216/

【BBED】丢失归档文件情况下的恢复:http://blog.itpub.net/26736162/viewspace-2079337/

【BBED】 sys.bootstrap$ 对象的恢复:http://blog.itpub.net/26736162/viewspace-2083621/

【BBED】 SYSTEM文件头损坏的恢复(4)http://blog.itpub.net/26736162/viewspace-2084329/

【BBED】bbed常用命令:http://blog.itpub.net/26736162/viewspace-2123465/

 

 

1.4  注意事项

1、bbed毕竟是未公开的恢复方式,所以不熟悉的朋友要慎用。

2、startup force慎用

3、操作bbed之前最好先把数据库关闭

 

1.5  相关知识点扫盲

An ORA-08102 indicates that there is a mismatch between the key(s) stored in the index and the values stored in the table.What typically happens in the index is built and at some future time,some type of corruption occurs,either in the table or index,to cause the mismatch.

ORA-08102常见于索引键值与表上存的值不一致。

[oracle@rhel6lhr ~]$ oerr ora 8102

08102, 00000, "index key not found, obj# %s, file %s, block %s (%s)"

// *Cause:  Internal error: possible inconsistency in index

// *Action:  Send trace file to your customer support representative, along

//           with information on reproducing the error

 

 

ora-08102这种错误说明索引或表出现了数据不一致,索引上记录的键值和表里的数据不一致,引起访问失败,一般重建下索引就可以解决两边不一致改表和索引都能达到目的,只要一致即可,但有一个原则就是索引键值始终要保证按顺序递增。通常有三种情况

1.如果损坏为索引,则删除索引并重建索引但对于indexobj#小于56的情况,由于是核心的bootstrap$对象,index是在DB启动时由DB自动创建,此种情况下通过设置event 38003startup migrate模式都不能解决,但obj#>56的则可以

2.如果损坏为块级别,则采用坏块的处理方法

3.如果损坏的为表的记录级别的则采用bbed或其它工具

 

I_OBJ1I_OBJ2I_OBJ3I_OBJ4I_OBJ5这几个都是OBJ$基表的索引,如果损坏会非常麻烦,因为ORACLE 对这些对象的DDL做了严格限制,没有办法简单修复们。

【BBED】BBED模拟并修复ORA-08102错误 

 

SYS@ora11g > drop index i_obj4;

drop index i_obj5

           *

ERROR at line 1:

ORA-00701: object necessary for warmstarting database cannot be altered

 

 

---------------------------------------------------------------------

第二章 实验部分

2.1  实验环境介绍

项目

source db

db 类型

单机

db version

11.2.0.3.0

db 存储

FS

OS版本及kernel版本

RHEL 6.5

 

2.2  实验目标

实验目标:使用BBED模拟并修复ORA-08102错误。

模拟错误过程:通过bbed修改OBJ$表中DATAOBJ#列最大的行所在的块,让DATAOBJ#的值增大,从而和索引中记录的值不一致。重启数据库并创建表让数据库报出ORA-08102错误。

修复错误过程:通过bbed把表中或索引中的不一致的数据修改成一致的,从而修复ORA-08102错误。

2.3  实验过程

2.3.1  做全备

[oracle@rhel6lhr ~]$ more rman_full.sh

rman target / nocatalog <<>

run{

backup database format '/home/oracle/bak/%d_%U.full';

sql 'alter system archive log current';

backup archivelog all format '/home/oracle/bak/%d_%U.arc';

backup current controlfile format '/home/oracle/bak/%d_%U.ctl';

}

EOF

 


 

 

2.3.2  模拟一:BBED模拟ORA-08102错误

通过BBED修改OBJ$DATAOBJ$重现I_OBJ4索引报ORA-08102错误。定位需要破坏的OBJ$DATAOBJ$列最大的记录,使之和索引I_OBJ4中记录不一致,从而实现ORA-8102错误。

[oracle@rhel6lhr ~]$ ORACLE_SID=ora11g

[oracle@rhel6lhr ~]$ sqlplus / as sysdba

 

SQL*Plus: Release 11.2.0.3.0 Production on Thu Sep 21 09:24:08 2017

 

Copyright (c) 1982, 2011, Oracle.  All rights reserved.

 

 

Connected to:

Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production

With the Partitioning, OLAP, Data Mining and Real Application Testing options

 

SYS@ora11g > select object_id,object_type from dba_objects where object_name='I_OBJ4';

 

OBJECT_ID OBJECT_TYPE

---------- -------------------

        39 INDEX

 

SYS@ora11g > select max(DATAOBJ#) from obj$;

 

MAX(DATAOBJ#)

-------------

        94098

 

SYS@ora11g > select dump(94098,16) from dual;

 

DUMP(94098,16)

-----------------------

Typ=2 Len=4: c3,a,29,63 ===>>>>> Typ=2表示NUMBER,96表示CHARLen=4表示4位长度,所以,94098在数据库内部的存储格式为04c30a2963

 

 

SYS@ora11g > SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILE#,

  2         DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK#,

  3         DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) ROW#

  4    FROM OBJ$

  5   WHERE DATAOBJ# = 94098;

 

     FILE#     BLOCK#       ROW#

---------- ---------- ----------

         1        241         27

 

SYS@ora11g > SELECT COUNT(*) COUNTS,

  2         MAX(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)) MAX_ROWNUM,

  3         MIN(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)) MIN_ROWNUM

  4    FROM SYS.OBJ$ D

  5   WHERE DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) = 1

  6     AND DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) = 241;

 

    COUNTS MAX_ROWNUM MIN_ROWNUM

---------- ---------- ----------

       105        104          0

 

 

根据以上的SQL可以得到下表的内容:

项目

OBJ$DATAOBJ#列的最大值

94098

OBJ$DATAOBJ#列的最大值dump

Typ=2 Len=4: c3,a,29,63  即:04c30a2963

该行所在数据块的地址

     FILE#     BLOCK#       ROW#

---------- ---------- ----------

         1        241         27

该行的存储情况

    COUNTS MAX_ROWNUM MIN_ROWNUM

---------- ---------- ----------

       105        104          0

即:OBJ$DATAOBJ#列的最大值为94098,该值在Oracle数据库中的存储格式为04c30a2963,该行数据所在的块为1号文件,241号块,第27行,该块上共有105行数据,最大值的行号为104,最小值的行号为0

 


全文请参考:http://blog.itpub.net/26736162/viewspace-2145368/

 

 

第四章 实验中用到的SQL总结

SELECT COUNT(*) COUNTS,

       MAX(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)) MAX_ROWNUM,

       MIN(DBMS_ROWID.ROWID_ROW_NUMBER(ROWID)) MIN_ROWNUM

  FROM SYS.OBJ$ D

WHERE DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) = 1

   AND DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) = 241;

 

SELECT DBMS_ROWID.ROWID_RELATIVE_FNO(ROWID) FILE#,

       DBMS_ROWID.ROWID_BLOCK_NUMBER(ROWID) BLOCK#,

       DBMS_ROWID.ROWID_ROW_NUMBER(ROWID) ROW#

  FROM SYS.OBJ$

WHERE DATAOBJ# = 94109;

 

SELECT DUMP(94098, 16) FROM DUAL;

 

SELECT DUMP(OBJ#, 16),

       DUMP(DATAOBJ#, 16),

       DUMP(OWNER#, 16),

       DUMP(NAME, 16),

       DUMP(NAMESPACE, 16),

       DUMP(SUBNAME, 16),

       DUMP(TYPE#, 16),

       DUMP(CTIME, 16),

       DUMP(MTIME, 16),

       DUMP(STIME, 16),

       DUMP(STATUS, 16),

       DUMP(REMOTEOWNER, 16),

       DUMP(LINKNAME, 16),

       DUMP(FLAGS, 16),

       DUMP(OID$, 16),

       DUMP(SPARE1, 16),

       DUMP(SPARE2, 16),

       DUMP(SPARE3, 16),

       DUMP(SPARE4, 16),

       DUMP(SPARE5, 16),

       DUMP(SPARE6, 16)

  FROM SYS.OBJ$ D

WHERE DATAOBJ# = 94098;

 

SELECT OBJ#,

       DATAOBJ#,

       OWNER#,

       NAME,

       NAMESPACE,

       SUBNAME,

       TYPE#,

       CTIME,

       MTIME,

       STIME,

       STATUS,

       REMOTEOWNER,

       LINKNAME,

       FLAGS,

       OID$,

       SPARE1,

       SPARE2,

       SPARE3

  FROM SYS.OBJ$ D

WHERE DATAOBJ# = 94098;

 

SELECT * FROM SYS.OBJ$ D WHERE D.NAME = 'OBJ$';

 

SELECT 'DUMP(' || D.COLUMN_NAME || ',16),'

  FROM DBA_TAB_COLS D

WHERE D.TABLE_NAME = 'OBJ$'

ORDER BY D.COLUMN_ID;

SELECT D.COLUMN_NAME || ','

  FROM DBA_TAB_COLS D

WHERE D.TABLE_NAME = 'OBJ$'

ORDER BY D.COLUMN_ID;

 

 

SELECT * FROM sys.Bootstrap$ ;

 

ORA-08102: index key not found, obj# 39, file 1, block 94083 (2)

 

select /*+ index(t i_obj4) */ DATAOBJ# from sys.obj$  t 

minus

select /*+ full(t1) */ DATAOBJ# from sys.obj$  t1;

 

 

select /*+ full(t1) */ DATAOBJ# from sys.obj$  t1

minus

  select /*+ index(t i_obj4) */ DATAOBJ# from sys.obj$  t 

;

select /*+ full(t) */  DATAOBJ#,type#,owner# from sys.obj$  t  WHERE t.dataobj# IN (94098,94099);

select /*+ full(t i_obj4) */  DATAOBJ#,type#,owner# from sys.obj$  t  WHERE t.dataobj# IN (94098,94099);

 

 

--16进制转换为10进制

select utl_raw.cast_to_number('c30a2964') from dual;

 

 

show all

map

p kdbr

p *kdbr[27]

x /rnnncncntttnccncnnn

d /v count 32

f /x c30a29

sum

sum apply

v

 

 




About Me

.............................................................................................................................................

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

● 本文在itpub(http://blog.itpub.net/26736162/abstract/1/)、博客园(http://www.cnblogs.com/lhrbest)和个人微信公众号(xiaomaimiaolhr)上有同步更新

● 本文itpub地址:http://blog.itpub.net/26736162/viewspace-2145368/

● 本文博客园地址:http://www.cnblogs.com/lhrbest/p/7576416.html

● 本文pdf版、个人简介及小麦苗云盘地址:http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答:http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址:http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

.............................................................................................................................................

● QQ群号:230161599(满)、618766405

● 微信群:可加我微信,我拉大家进群,非诚勿扰

● 联系我请加QQ好友646634621,注明添加缘由

● 于 2017-09-20 09:00 ~ 2017-09-23 22:00 在魔都完成

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

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

.............................................................................................................................................

小麦苗的微店:https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书:http://blog.itpub.net/26736162/viewspace-2142121/

.............................................................................................................................................

使用微信客户端扫描下面的二维码来关注小麦苗的微信公众号(xiaomaimiaolhr)及QQ群(DBA宝典),学习最实用的数据库技术。

【BBED】BBED模拟并修复ORA-08102错误【BBED】BBED模拟并修复ORA-08102错误【BBED】BBED模拟并修复ORA-08102错误【BBED】BBED模拟并修复ORA-08102错误

   小麦苗的微信公众号      小麦苗的DBA宝典QQ群1     小麦苗的DBA宝典QQ群2        小麦苗的微店

.............................................................................................................................................

【BBED】BBED模拟并修复ORA-08102错误cdn.qqmail.com/zh_CN/htmledition/p_w_picpaths/function/qm_open/ico_mailme_02.png">
【BBED】BBED模拟并修复ORA-08102错误
【BBED】BBED模拟并修复ORA-08102错误
【BBED】BBED模拟并修复ORA-08102错误




向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI