[20231103]rename IDL_UB1$后使用bbed的恢复的后遗症.txt --//前段时间遇到的问题,测试使用rename IDL_UB1$后使用bbed的恢复,当时没有发现这个问题,今天才意识到问题. --//我只能继续前面的恢复操作. 1.环境: SYS@book> @ver1 PORT_STRING VERSION BANNER ------------------- ---------- ---------------------------------------------------------------------------- x86_64/Linux 2.4.xx 11.2.0.4.0 Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production 2.问题提出: --//我本来想再尝试rename修改后长度不一致的情况,发现问题. SYS@book> rename IDL_UB1$ to IDL_UB1Y_BAK; rename IDL_UB1$ to IDL_UB1Y_BAK * ERROR at line 1: ORA-00600: internal error code, arguments: [13011], [18], [4280486], [6], [4280486], [17], [], [], [], [], [], [] --//4280486 = set dba 1,86182 = alter system dump datafile 1 block 86182 = 0x4150a6,正好是当时insert obj$的块号. --//很明显索引不一致.当时我犯了一个小错误,我仅仅analyze table IDL_UB1$,分析对象错了. SYS@book> analyze table IDL_UB1$ validate structure cascade; Table analyzed. --//实际上应该分析obj$表. SYS@book> analyze table obj$ validate structure cascade; analyze table obj$ validate structure cascade * ERROR at line 1: ORA-01499: table/index cross reference failure - see trace file --//检查跟踪文件发现如下: row not found in index tsn: 0 rdba: 0x00400168 env [0x7fff55680a40]: (scn: 0x0003.1775a1d0 xid: 0x007b.020.00000008 uba: 0x00000000.0000.00 statement num=0 parent xid: 0x0000.000.00000000 st-scn: 0x0000.00000000 hi-scn: 0x0000.00000000 ma-scn: 0x0003.1775a11a flg: 0x00000060) col 0; len 3; (3): c2 03 1a col 1; len 2; (2): c1 03 col 2; len 1; (1): 80 col 3; len 6; (6): 00 40 00 f3 00 17 Block header dump: 0x004000f3 Object id on Block? Y seg/obj: 0x12 csc: 0x03.176048bd itc: 1 flg: - typ: 1 - DATA fsl: 0 fnx: 0x0 ver: 0x01 Itl Xid Uba Flag Lck Scn/Fsc 0x01 0x000a.008.00004d7f 0x00c03342.0f06.13 --U- 1 fsc 0x0000.176048c2 --//0x00400168 = set dba 1,360 = alter system dump datafile 1 block 360 = 4194664 SYS@book> @ find_objz 1 360 '' 1 SYS@book> @ pr ============================== FILE_ID : 1 BLOCK_ID : 360 BLOCKS : 8 SEGMENT_TYPE : INDEX OWNER : SYS SEGMENT_NAME : I_OBJ4 PARTITION_NAME : EXTENT_ID : 0 BYTES : 65536 TABLESPACE_NAME : SYSTEM RELATIVE_FNO : 1 SEGTSN : 0 SEGRFN : 1 SEGBID : 360 PL/SQL procedure successfully completed. --//一看到这里我马上反应过来我前面的恢复有问题,因为rename 对象的操作实际上delete然后insert. --//这样其它obj$涉及到的索引都要修改,我犯了教条主义的错误,有点想当然了. --//0x004000f3 = set dba 1,243 = alter system dump datafile 1 block 243 = 4194547 --//很明显索引i_obj4找不到这个键值. --//另外注意这样执行没有问题,看来oracle的索引检查存在问题的. SYS@book> validate index i_obj4; Index analyzed. SYS@book> analyze index i_obj4 validate structure; Index analyzed. 3.尝试恢复前看看obj$有那些索引: SYS@book> @ ind2 obj$ Display indexes where table or index name matches obj$... TABLE_OWNER TABLE_NAME INDEX_NAME POS# COLUMN_NAME DSC ----------- ---------- ---------- ---- ------------- ---- SYS OBJ$ I_OBJ1 1 OBJ# 2 OWNER# 3 TYPE# I_OBJ2 1 OWNER# 2 NAME 3 NAMESPACE 4 REMOTEOWNER 5 LINKNAME 6 SUBNAME 7 TYPE# 8 SPARE3 9 OBJ# I_OBJ3 1 OID$ I_OBJ4 1 DATAOBJ# 2 TYPE# 3 OWNER# I_OBJ5 1 SPARE3 2 NAME 3 NAMESPACE 4 TYPE# 5 OWNER# 6 REMOTEOWNER 7 LINKNAME 8 SUBNAME 9 OBJ# INDEX_OWNER TABLE_NAME INDEX_NAME IDXTYPE UNIQ STATUS PART TEMP H LFBLKS NDK NUM_ROWS CLUF LAST_ANALYZED DEGREE VISIBILIT ----------- ---------- ---------- ------- ---- ------ ---- ---- -- ------ ----- -------- ----- ------------------- ------ --------- SYS OBJ$ I_OBJ1 NORMAL YES VALID NO N 2 250 86998 86998 1156 2017-02-04 06:00:11 1 VISIBLE OBJ$ I_OBJ2 NORMAL YES VALID NO N 3 875 86998 86998 64478 2017-02-04 06:00:11 1 VISIBLE OBJ$ I_OBJ3 NORMAL NO VALID NO N 2 16 3421 3421 249 2017-02-04 06:00:11 1 VISIBLE OBJ$ I_OBJ4 NORMAL NO VALID NO N 2 382 9342 86998 3259 2017-02-04 06:00:11 1 VISIBLE OBJ$ I_OBJ5 NORMAL YES VALID NO N 3 875 86998 86998 64466 2017-02-04 06:00:11 1 VISIBLE 4.尝试i_obj4索引恢复: SYS@book> select /*+ full(obj$) */ rowid,DATAOBJ#,TYPE#,OWNER# from obj$ where name='IDL_UB1$' ; ROWID DATAOBJ# TYPE# OWNER# ------------------ ---------- ---------- ---------- AAAAASAABAAAADzAAX 225 2 0 SYS@book> @ rowid AAAAASAABAAAADzAAX OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT ------ ---- ----- --- ---------- ----- ---------------------------------------- 18 1 243 23 0x4000F3 1,243 alter system dump datafile 1 block 243 ; SYS@book> select /*+ index(obj$ i_obj4) */ rowid,DATAOBJ#,TYPE#,OWNER# from obj$ where name='IDL_UB1$' ; no rows selected --//有点不理解,使用提示index(obj$ i_obj4)至少应该看到错误的rowid. BBED> x /rnnnx dba 1,363 *kd_off[10] rowdata[4] @4436 ---------- flag@4436: 0x00 (NONE) lock@4437: 0x00 data key: col 0[3] @4439: 225 col 1[2] @4443: 2 col 2[1] @4446: 0 col 3[6] @4448: 0x00 0x41 0x50 0xa6 0x00 0x06 --//004150a6 = set dba 1,86182 = alter system dump datafile 1 block 86182 = 4280486,还是指向原来的位置. --//噢明白了前面使用索引的查询不对,应该写成,实际上看上面的执行计划很容易明白,走的是 INDEX FULL SCAN: SYS@book> select /*+ index(obj$ i_obj4) */ rowid,DATAOBJ#,TYPE#,OWNER# from obj$ where DATAOBJ#=225 and TYPE#=2 and OWNER#=0 ; ROWID DATAOBJ# TYPE# OWNER# ------------------ ---------- ---------- ---------- AAAAASAABAAAVCmAAG 225 2 0 SYS@book> @ rowid AAAAASAABAAAVCmAAG OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT ------ ---- ----- --- ---------- ------- ---------------------------------------- 18 1 86182 6 0x4150A6 1,86182 alter system dump datafile 1 block 86182 --//很明显指向rename后的对象. --//修复就很简单就是col 3[6] 现在的0x00 0x41 0x50 0xa6 0x00 0x06 换成 00 40 00 f3 00 17. BBED> dump dba 1,363 offset 4448 count 6 File: /mnt/ramdisk/book/system ------------------------------------ 004150a6 0006 <16 bytes per line> assign dba 1,363 offset 4448 = 0x00; assign dba 1,363 offset 4449 = 0x40; assign dba 1,363 offset 4450 = 0x00; assign dba 1,363 offset 4451 = 0xf3; assign dba 1,363 offset 4452 = 0x00; assign dba 1,363 offset 4453 = 0x17; BBED> sum apply Check value for File 1, Block 363: current = 0xc26a, required = 0xc26a BBED> verify DBVERIFY - Verification starting FILE = /mnt/ramdisk/book/system01.dbf BLOCK = 363 SYS@book> alter system flush buffer_cache; System altered. SYS@book> select /*+ index(obj$ i_obj4) */ rowid,DATAOBJ#,TYPE#,OWNER#,name from obj$ where DATAOBJ#=225 and TYPE#=2 and OWNER#=0 ; ROWID DATAOBJ# TYPE# OWNER# NAME ------------------ -------- ----- ------ --------- AAAAASAABAAAADzAAX 225 2 0 IDL_UB1$ --//剩下i_obj1,i_obj3索引也是类似. 5.尝试i_obj1索引恢复: SYS@book> @ treedump i_obj1 OBJECT_ID ---------- 36 *** 2023-11-02 11:26:14.695 ----- begin tree dump branch: 0x400151 4194641 (0: nrow: 250, level: 1) leaf: 0x400152 4194642 (-1: nrow: 421 rrow: 421) leaf: 0x400153 4194644 (0: nrow: 420 rrow: 420) .... SYS@book> select /*+ index(obj$ i_obj1) */ rowid,obj#,OWNER#,type# from obj$ where OBJ#=225 and OWNER#=0 ; ROWID OBJ# OWNER# TYPE# ------------------ ---------- ---------- ---------- AAAAASAABAAAVCmAAG 225 0 2 --//4194642 = set dba 1,338 = alter system dump datafile 1 block 338 = 0x400152 BBED> x /rnnn dba 1,338 *kd_off[226] rowdata[3711] @4688 ------------- flag@4688: 0x00 (NONE) lock@4689: 0x02 keydata[6]: 0x00 0x41 0x50 0xa6 0x00 0x06 data key: col 0[3] @4697: 225 col 1[1] @4701: 0 col 2[2] @4703: 2 --//i_OBJ1是唯 一索引 ,rowid在date key前面. BBED> dump dba 1,338 offset 4690 count 6 File: /mnt/ramdisk/book/system ------------------------------------ 004150a6 0006 <16 bytes per line> assign dba 1,338 offset 4690 = 0x00; assign dba 1,338 offset 4691 = 0x40; assign dba 1,338 offset 4692 = 0x00; assign dba 1,338 offset 4693 = 0xf3; assign dba 1,338 offset 4694 = 0x00; assign dba 1,338 offset 4695 = 0x17; BBED> sum apply Check value for File 1, Block 338: current = 0x6f2b, required = 0x6f2b BBED> verify DBVERIFY - Verification starting FILE = /mnt/ramdisk/book/system01.dbf BLOCK = 338 SYS@book> alter system flush buffer_cache; System altered. SYS@book> select /*+ index(obj$ i_obj1) */ rowid,obj#,OWNER#,type#,name from obj$ where OBJ#=225 and OWNER#=0 and type#=2; ROWID OBJ# OWNER# TYPE# NAME ------------------ ---- ------ ----- -------- AAAAASAABAAAADzAAX 225 0 2 IDL_UB1$ 6.尝试i_obj3索引恢复: --//剩下i_obj3索引也是类似. SYS@book> set null null SYS@book> select /*+ full(obj$ ) */ rowid,oid$ from obj$ where name='IDL_UB1$'; ROWID OID$ ------------------ ----- AAAAASAABAAAADzAAX null --//很幸运name='IDL_UB1$'的OID$是NULL,i_obj3不会存在这样的键值.也就是不需要修复操作. SYS@book> analyze table obj$ validate structure cascade; Table analyzed. --//这样才算彻底恢复. --//我不再做不等长rename的bbed测试了,这样工作量有点大,直接修改obj$数据字典的方法还是简单许多. 6.总结: --//主要问题在于分析对象错误,实际上如果意识到rename操作是delete然后insert,就应该意识到自己的恢复没有完成. --//另外不建议选择bbed的恢复模式. 7.补充相关ora-00600 13011错误信息: ORA-00600: internal error code, arguments: [13011], [18], [4280486], [6], [4280486], [17], [], [], [], [], [], [] --//4280486 = set dba 1,86182 = alter system dump datafile 1 block 86182 = 0x4150a6 --//1,243 = file#,block# dba(10): 4194547 = file#,block# dba(16): 0x4000f3 --//仅仅是我的猜测: 参数1 : obj# 对象号,obj$的obj#=18. 参数2 : 块号 dba 1,86182 参数3 : 行号 索引上记录的行号 0x6 参数4 : 块号 dba 1,86182 参数5 : 行号 表上记录的行号 0x17=23 --//这里块号一样我不是很清楚。总感觉参数4应该记录的是4194547。 8.后记: --//为了检验自己恢复正确,继续做rename测试,小心不要在生产系统做这样的测试!! SYS@book> rename IDL_UB1$ to IDL_UB1Y_BAK; Table renamed. SYS@book> shutdown immediate Database closed. Database dismounted. ORACLE instance shut down. SYS@book> startup ORACLE instance started. Total System Global Area 643084288 bytes Fixed Size 2255872 bytes Variable Size 205521920 bytes Database Buffers 427819008 bytes Redo Buffers 7487488 bytes Database mounted. Database opened. --//可以正常启动. SYS@book> @ rowid AAAAASAABAAAADzAAX || DBMS_ROWID.ROWID_BLOCK_NUMBER ('AAAAASAABAAAADzAAX') * ERROR at line 13: ORA-00604: error occurred at recursive SQL level 1 ORA-00942: table or view does not exist SYS@book> update obj$ set name='IDL_UB1$' where name='IDL_UB1Y_BAK'; 1 row updated. SYS@book> commit ; Commit complete. SYS@book> alter system flush buffer_cache; System altered. SYS@book> alter system flush shared_pool; System altered. SYS@book> @ rowid AAAAASAABAAAADzAAX OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT ------ ---- ----- --- ---------- ----- ---------------------------------------- 18 1 243 23 0x4000F3 1,243 alter system dump datafile 1 block 243 ; --//OK,现在恢复正常. SYS@book> select /*+ index(obj$ i_obj4) */ rowid,DATAOBJ#,TYPE#,OWNER# from obj$ where name='IDL_UB1$' ; ROWID DATAOBJ# TYPE# OWNER# ------------------ -------- ----- ------ AAAAASAABAAAVCmAAt 225 2 0 SYS@book> @ rowid AAAAASAABAAAVCmAAt OBJECT FILE BLOCK ROW ROWID_DBA DBA TEXT ------ ---- ----- --- ---------- ------- ---------------------------------------- 18 1 86182 45 0x4150A6 1,86182 alter system dump datafile 1 block 86182 --//rowid已经变了.
[20231103]rename IDL_UB1$后使用bbed的恢复的后遗症.txt
来源:这里教程网
时间:2026-03-03 19:00:42
作者:
编辑推荐:
- [20231103]rename IDL_UB1$后使用bbed的恢复的后遗症.txt03-03
- CentOS7.6安装oracle 11.2.0.4 Error in invoking target 'agent nmhs' of makefile03-03
- 记一次rac TNS-12541,ORA-12520,ORA-12521 错误处理03-03
- [20231103]rename IDL_UB1$后使用bbed的恢复3.txt03-03
- [20231105]降序索引的疑问.txt03-03
- 关于Oracle 10g ASM磁盘大小的限制03-03
- Ooracle 高水位线(high water mask)在不同段管理模式下的推进03-03
- ORACLE 如何诊断高水位争用(enq: HW – contention)03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- 记一次rac TNS-12541,ORA-12520,ORA-12521 错误处理
- ORA-02354 ORA-01555 ORA-22924
ORA-02354 ORA-01555 ORA-22924
26-03-03 - 修改主机时区对Oracle的影响分析
修改主机时区对Oracle的影响分析
26-03-03 - Oracle 标准审计功能及开启
Oracle 标准审计功能及开启
26-03-03 - 研究Oracle 延迟块清除(defered block cleanout)
- ORACLE下一次奇怪的job停止问题分析及处理
ORACLE下一次奇怪的job停止问题分析及处理
26-03-03 - Oracle标准审计,关闭AUDIT
Oracle标准审计,关闭AUDIT
26-03-03 - Oracle 在查询的where子句中,索引的索引列/前导列是否作为单个表谓词提供列进行匹配
- Oracle 标准审计,设置AUDIT_SYSLOG _LEVEL参数
Oracle 标准审计,设置AUDIT_SYSLOG _LEVEL参数
26-03-03 - 一次异常宕机后数据库启动报ora-600[4000]错误恢复
一次异常宕机后数据库启动报ora-600[4000]错误恢复
26-03-03
