标签云
asm恢复 bbed bootstrap$ dul In Memory kcbzib_kcrsds_1 kccpb_sanity_check_2 MySQL恢复 ORA-00312 ORA-00607 ORA-00704 ORA-00742 ORA-01110 ORA-01555 ORA-01578 ORA-01595 ORA-08103 ORA-600 2131 ORA-600 2662 ORA-600 3020 ORA-600 4000 ORA-600 4137 ORA-600 4193 ORA-600 4194 ORA-600 16703 ORA-600 kcbzib_kcrsds_1 ORA-600 KCLCHKBLK_4 ORA-15042 ORA-15196 ORACLE 12C oracle dul ORACLE PATCH Oracle Recovery Tools oracle加密恢复 oracle勒索 oracle勒索恢复 oracle异常恢复 Oracle 恢复 ORACLE恢复 ORACLE数据库恢复 oracle 比特币 OSD-04016 YOUR FILES ARE ENCRYPTED 勒索恢复 比特币加密文章分类
- Others (2)
- 中间件 (2)
- WebLogic (2)
- 操作系统 (103)
- 数据库 (1,763)
- DB2 (22)
- MySQL (76)
- Oracle (1,605)
- Data Guard (52)
- EXADATA (8)
- GoldenGate (24)
- ORA-xxxxx (166)
- ORACLE 12C (72)
- ORACLE 18C (6)
- ORACLE 19C (15)
- ORACLE 21C (3)
- Oracle 23ai (8)
- Oracle ASM (69)
- Oracle Bug (8)
- Oracle RAC (54)
- Oracle 安全 (6)
- Oracle 开发 (28)
- Oracle 监听 (28)
- Oracle备份恢复 (588)
- Oracle安装升级 (97)
- Oracle性能优化 (62)
- 专题索引 (5)
- 勒索恢复 (86)
- PostgreSQL (30)
- pdu工具 (6)
- PostgreSQL恢复 (9)
- SQL Server (32)
- SQL Server恢复 (13)
- TimesTen (7)
- 达梦数据库 (3)
- 达梦恢复 (1)
- 生活娱乐 (2)
- 至理名言 (11)
- 虚拟化 (2)
- VMware (2)
- 软件开发 (39)
- Asp.Net (9)
- JavaScript (12)
- PHP (2)
- 小工具 (22)
-
最近发表
- .sstop勒索加密数据库恢复
- 解决一次硬件恢复之后数据文件0kb的故障恢复case
- Error in invoking target ‘libasmclntsh19.ohso libasmperl19.ohso client_sharedlib’问题处理
- ORA-01171: datafile N going offline due to error advancing checkpoint
- linux环境oracle数据库被文件系统勒索加密为.babyk扩展名溯源
- ORA-600 ksvworkmsgalloc: bad reaper
- ORA-600 krccfl_chunk故障处理
- Oracle Recovery Tools恢复案例总结—202505
- ORA-600 kddummy_blkchk 数据库循环重启
- 记录一次asm disk加入到vg通过恢复直接open库的案例
- CHECKDB 发现了 N 个分配错误和 M 个一致性错误
- 达梦数据库dm.ctl文件异常恢复
- Oracle Recovery Tools修复ORA-00742、ORA-600 ktbair2: illegal inheritance故障
- 可能是 tempdb 空间用尽或某个系统表不一致故障处理
- 11.2.0.4库中遇到ORA-600 kcratr_nab_less_than_odr报错
- [MY-013183] [InnoDB] Assertion failure故障处理
- Oracle 19c 202504补丁(RUs+OJVM)-19.27
- Oracle Recovery Tools修复ORA-600 6101/kdxlin:psno out of range故障
- pdu完美支持金仓数据库恢复(KingbaseES)
- 虚拟机故障引起ORA-00310 ORA-00334故障处理
标签归档:bbed
利用bbed找回ORACLE更新前值
模拟数据块更新
SQL> create table t_xifenfei(id number,name varchar2(10)); Table created. SQL> insert into t_xifenfei values(1,'XFF'); 1 row created. SQL> insert into t_xifenfei values(2,'CHF'); 1 row created. SQL> commit; Commit complete. SQL> alter system checkpoint; System altered. SQL> select id,rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from t_xifenfei; ID ROWID REL_FNO BLOCKNO ROWNO ---------- ------------------ ---------- ---------- ---------- 1 AAASc+AAEAAAACvAAA 4 175 0 2 AAASc+AAEAAAACvAAB 4 175 1 SQL> select dump(1,'16') from dual; DUMP(1,'16') ----------------- Typ=2 Len=2: c1,2 SQL> select dump(2,'16') from dual; DUMP(2,'16') ----------------- Typ=2 Len=2: c1,3 SQL> select dump('XFF','16') FROM DUAL; DUMP('XFF','16') ---------------------- Typ=96 Len=3: 58,46,46 SQL> SELECT DUMP('CHF','16') FROM DUAL; DUMP('CHF','16') ---------------------- Typ=96 Len=3: 43,48,46 SQL> update t_xifenfei set name='XIFENFEI' where id=1; 1 row updated. SQL> commit; Commit complete. SQL> select dump('XIFENFEI','16') from dual; DUMP('XIFENFEI','16') ------------------------------------- Typ=96 Len=8: 58,49,46,45,4e,46,45,49 SQL> alter system checkpoint; System altered. SQL> select * from t_xifenfei; ID NAME ---------- ---------- 1 XIFENFEI 2 CHF
这里我们对数据库进行了一次更新操作,并且dump出来对应值,为了方便定位到相应记录
bbed查看相关值
[oracle@xifenfei ~]$ bbed listfile=listfile mode=edit password=blockedit BBED: Release 2.0.0.0.0 - Limited Production on Wed Aug 8 20:50:47 2012 Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> set file 4 block 175 FILE# 4 BLOCK# 175 BBED> map File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Dba:0x010000af ------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes @0 struct ktbbh, 72 bytes @20 struct kdbh, 14 bytes @100 struct kdbt[1], 4 bytes @114 sb2 kdbr[2] @118 ub1 freespace[8031] @122 ub1 rowdata[35] @8153 ub4 tailchk @8188 BBED> p kdbr sb2 kdbr[0] @118 8053 sb2 kdbr[1] @120 8068 BBED> p *kdbr[1] rowdata[15] ----------- ub1 rowdata[15] @8168 0x2c BBED> x /rnc rowdata[15] @8168 ----------- flag@8168: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8169: 0x00 cols@8170: 2 col 0[2] @8171: 2 col 1[3] @8174: CHF BBED> p *kdbr[0] rowdata[0] ---------- ub1 rowdata[0] @8153 0x2c BBED> x /rnc rowdata[0] @8153 ---------- flag@8153: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8154: 0x02 cols@8155: 2 col 0[2] @8156: 1 col 1[8] @8159: XIFENFEI BBED> set count 64 COUNT 64 <32 bytes per line> BBED> d /v File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8153 to 8191 Dba:0x010000af ------------------------------------------------------- 2c020202 c1020858 4946454e 4645492c l ,......XIFENFEI, 000202c1 03034348 462c0002 02c10203 l ......CHF,...... 58464602 068de8 l XFF.... <16 bytes per line>
使用bbed找回历史值
--准备工作,通过dump出来的值,推算出来第一条记录的起点02c10203584646, --在这个值的基础上offset-3得到offset值为8078 BBED> p kdbr sb2 kdbr[0] @118 8053 sb2 kdbr[1] @120 8068 --修改row directory指针位置 BBED> m /x 8e1f File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 118 to 181 Dba:0x010000af ------------------------------------------------------------------------ 8e1f841f 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 <32 bytes per line> BBED> p kdbr sb2 kdbr[0] @118 8078 sb2 kdbr[1] @120 8068 BBED> sum apply Check value for File 4, Block 175: current = 0xdff8, required = 0xdff8 BBED> verify DBVERIFY - Verification starting FILE = /u01/oracle/oradata/ora11g/users01.dbf BLOCK = 175 Block Checking: DBA = 16777391, Block Type = KTB-managed data block data header at 0xb53cd264 kdbchk: xaction header lock count mismatch trans=2 ilk=1 nlo=0 --提示事务锁错误 Block 175 failed with check code 6108 DBVERIFY - Verification complete Total Blocks Examined : 1 Total Blocks Processed (Data) : 1 Total Blocks Failing (Data) : 1 Total Blocks Processed (Index): 0 Total Blocks Failing (Index): 0 Total Blocks Empty : 0 Total Blocks Marked Corrupt : 0 Total Blocks Influx : 0 Message 531 not found; product=RDBMS; facility=BBED BBED> p *kdbr[0] rowdata[25] ----------- ub1 rowdata[25] @8178 0x2c BBED> d File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8178 to 8191 Dba:0x010000af ------------------------------------------------------------------------ 2c000202 c1020358 46460206 8de8 <32 bytes per line> BBED> x /rnc rowdata[25] @8178 ----------- flag@8178: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8179: 0x00 --被更新前的记录事务锁标识为0,而更新后的事务锁标识为2 cols@8180: 2 col 0[2] @8181: 1 col 1[3] @8184: XFF --修改事务锁标识为2 BBED> m /x 02 offset 8179 File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8179 to 8191 Dba:0x010000af ------------------------------------------------------------------------ 020202c1 02035846 4602068d e8 <32 bytes per line> BBED> set offset 8153 OFFSET 8153 BBED> d File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8153 to 8191 Dba:0x010000af ------------------------------------------------------------------------ 2c020202 c1020858 4946454e 4645492c 000202c1 03034348 462c0202 02c10203 58464602 068de8 <32 bytes per line> --把更新后值的事务锁标识改为0 BBED> m /x 00 offset +1 File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8154 to 8191 Dba:0x010000af ------------------------------------------------------------------------ 000202c1 02085849 46454e46 45492c00 0202c103 03434846 2c020202 c1020358 46460206 8de8 <32 bytes per line> BBED> sum apply Check value for File 4, Block 175: current = 0xddfa, required = 0xddfa BBED> verify DBVERIFY - Verification starting FILE = /u01/oracle/oradata/ora11g/users01.dbf BLOCK = 175 Block Checking: DBA = 16777391, Block Type = KTB-managed data block data header at 0xb53cd264 kdbchk: the amount of space used is not equal to block size used=42 fsc=0 avsp=8041 dtl=8088 -->提示块的空间使用不正确 Block 175 failed with check code 6110 DBVERIFY - Verification complete Total Blocks Examined : 1 Total Blocks Processed (Data) : 1 Total Blocks Failing (Data) : 1 Total Blocks Processed (Index): 0 Total Blocks Failing (Index): 0 Total Blocks Empty : 0 Total Blocks Marked Corrupt : 0 Total Blocks Influx : 0 Message 531 not found; product=RDBMS; facility=BBED BBED> p ktbbh struct ktbbh, 72 bytes @20 ub1 ktbbhtyp @20 0x01 (KDDBTDATA) union ktbbhsid, 4 bytes @24 ub4 ktbbhsg1 @24 0x0001273e ub4 ktbbhod1 @24 0x0001273e struct ktbbhcsc, 8 bytes @28 ub4 kscnbas @28 0x0000e88a ub2 kscnwrp @32 0x0002 sb2 ktbbhict @36 2 ub1 ktbbhflg @38 0x32 (NONE) ub1 ktbbhfsl @39 0x00 ub4 ktbbhfnx @40 0x010000a8 struct ktbbhitl[0], 24 bytes @44 struct ktbitxid, 8 bytes @44 ub2 kxidusn @44 0x0006 ub2 kxidslt @46 0x001e ub4 kxidsqn @48 0x000002c6 struct ktbituba, 8 bytes @52 ub4 kubadba @52 0x00c000d9 ub2 kubaseq @56 0x0086 ub1 kubarec @58 0x2a ub2 ktbitflg @60 0x8000 (KTBFCOM) union _ktbitun, 2 bytes @62 sb2 _ktbitfsc @62 2 ub2 _ktbitwrp @62 0x0002 ub4 ktbitbas @64 0x0000e550 struct ktbbhitl[1], 24 bytes @68 struct ktbitxid, 8 bytes @68 ub2 kxidusn @68 0x0006 ub2 kxidslt @70 0x0008 ub4 kxidsqn @72 0x000002c7 struct ktbituba, 8 bytes @76 ub4 kubadba @76 0x00c000da ub2 kubaseq @80 0x0086 ub1 kubarec @82 0x12 ub2 ktbitflg @84 0x2001 (KTBFUPB) union _ktbitun, 2 bytes @86 sb2 _ktbitfsc @86 0 ub2 _ktbitwrp @86 0x0000 ub4 ktbitbas @88 0x0000e88d --所有的_ktbitfsc修改为0 BBED> m /x 00 offset 62 File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 62 to 125 Dba:0x010000af ------------------------------------------------------------------------ 000050e5 00000600 0800c702 0000da00 c0008600 12000120 00008de8 00000000 00000000 00000001 0200ffff 1600751f 691f691f 00000200 8e1f841f 00000000 <32 bytes per line> BBED> sum apply Check value for File 4, Block 175: current = 0xddf8, required = 0xddf8 BBED> verify DBVERIFY - Verification starting FILE = /u01/oracle/oradata/ora11g/users01.dbf BLOCK = 175 Block Checking: DBA = 16777391, Block Type = KTB-managed data block data header at 0xb53cd264 kdbchk: the amount of space used is not equal to block size used=42 fsc=0 avsp=8041 dtl=8088 Block 175 failed with check code 6110 DBVERIFY - Verification complete Total Blocks Examined : 1 Total Blocks Processed (Data) : 1 Total Blocks Failing (Data) : 1 Total Blocks Processed (Index): 0 Total Blocks Failing (Index): 0 Total Blocks Empty : 0 Total Blocks Marked Corrupt : 0 Total Blocks Influx : 0 Message 531 not found; product=RDBMS; facility=BBED BBED> p kdbh struct kdbh, 14 bytes @100 ub1 kdbhflag @100 0x00 (NONE) sb1 kdbhntab @101 1 sb2 kdbhnrow @102 2 sb2 kdbhfrre @104 -1 sb2 kdbhfsbo @106 22 sb2 kdbhfseo @108 8053 sb2 kdbhavsp @110 8045 sb2 kdbhtosp @112 8045 --修改kdbhtosp和kdbhavsp值 BBED> m /x 6e1f offset 112 File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 112 to 175 Dba:0x010000af ------------------------------------------------------------------------ 6e1f0000 02008e1f 841f0000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 <32 bytes per line> BBED> m /x 6e1f offset 110 File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 110 to 173 Dba:0x010000af ------------------------------------------------------------------------ 6e1f6e1f 00000200 8e1f841f 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000 <32 bytes per line> BBED> sum apply Check value for File 4, Block 175: current = 0xddf8, required = 0xddf8 --数据块验证通过 BBED> verify DBVERIFY - Verification starting FILE = /u01/oracle/oradata/ora11g/users01.dbf BLOCK = 175 DBVERIFY - Verification complete Total Blocks Examined : 1 Total Blocks Processed (Data) : 1 Total Blocks Failing (Data) : 0 Total Blocks Processed (Index): 0 Total Blocks Failing (Index): 0 Total Blocks Empty : 0 Total Blocks Marked Corrupt : 0 Total Blocks Influx : 0 Message 531 not found; product=RDBMS; facility=BBED
重启数据库
SQL> shutdown abort ORACLE instance shut down. SQL> startup ORACLE instance started. Total System Global Area 313860096 bytes Fixed Size 1344652 bytes Variable Size 251661172 bytes Database Buffers 54525952 bytes Redo Buffers 6328320 bytes Database mounted. Database opened. --找回更新前值 SQL> select * from chf.t_xifenfei; ID NAME ---------- ---------- 1 XFF 2 CHF
ORACLE update 操作内部原理
对于oracle的update操作,在数据块中具体是如何出来,是直接更新原来值,还是通过插入新值修改指针的方法实现.下面通过证明:
模拟表插入数据
SQL> create table t_xifenfei(id number,name varchar2(10)); Table created. SQL> insert into t_xifenfei values(1,'XFF'); 1 row created. SQL> insert into t_xifenfei values(2,'CHF'); 1 row created. SQL> commit; Commit complete. SQL> alter system checkpoint; System altered. SQL> select id,rowid, 2 dbms_rowid.rowid_relative_fno(rowid)rel_fno, 3 dbms_rowid.rowid_block_number(rowid)blockno, 4 dbms_rowid.rowid_row_number(rowid) rowno 5 from t_xifenfei; ID ROWID REL_FNO BLOCKNO ROWNO ---------- ------------------ ---------- ---------- ---------- 1 AAASc+AAEAAAACvAAA 4 175 0 2 AAASc+AAEAAAACvAAB 4 175 1 SQL> alter system dump datafile 4 block 175; System altered. SQL> select value from v$diag_info where name='Default Trace File'; VALUE -------------------------------------------------------------------------------- /u01/oracle/diag/rdbms/ora11g/ora11g/trace/ora11g_ora_24625.trc
数据存储对应16进制值
SQL> select dump(1,'16') from dual; DUMP(1,'16') ----------------- Typ=2 Len=2: c1,2 SQL> select dump(2,'16') from dual; DUMP(2,'16') ----------------- Typ=2 Len=2: c1,3 SQL> select dump('XFF','16') FROM DUAL; DUMP('XFF','16') ---------------------- Typ=96 Len=3: 58,46,46 SQL> SELECT DUMP('CHF','16') FROM DUAL; DUMP('CHF','16') ---------------------- Typ=96 Len=3: 43,48,46
得出第一条记录对应值为:02c10203584646;第二条记录对应值为:02c10303434846
dump 数据块得到记录
bdba: 0x010000af data_block_dump,data header at 0xb683c064 =============== tsiz: 0x1f98 hsiz: 0x16 pbl: 0xb683c064 76543210 flag=-------- ntab=1 nrow=2 frre=-1 fsbo=0x16 fseo=0x1f84 avsp=0x1f6e tosp=0x1f6e 0xe:pti[0] nrow=2 offs=0 0x12:pri[0] offs=0x1f8e ---->8078 0x14:pri[1] offs=0x1f84 ---->8068 block_row_dump: tab 0, row 0, @0x1f8e tl: 10 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 02 col 1: [ 3] 58 46 46 tab 0, row 1, @0x1f84 tl: 10 fb: --H-FL-- lb: 0x1 cc: 2 col 0: [ 2] c1 03 col 1: [ 3] 43 48 46 end_of_block_dump End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175
bbed查看相关记录
BBED> p kdbr sb2 kdbr[0] @118 8078 <--第一条row directory指针位置 sb2 kdbr[1] @120 8068 <--第二条row directory指针位置 BBED> p *kdbr[0] rowdata[10] ----------- ub1 rowdata[10] @8178 0x2c BBED> x /rnc rowdata[10] @8178 ----------- flag@8178: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8179: 0x01 cols@8180: 2 col 0[2] @8181: 1 col 1[3] @8184: XFF BBED> p *kdbr[1] rowdata[0] ---------- ub1 rowdata[0] @8168 0x2c BBED> x /rnc rowdata[0] @8168 ---------- flag@8168: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8169: 0x01 cols@8170: 2 col 0[2] @8171: 2 col 1[3] @8174: CHF BBED> d File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8168 to 8191 Dba:0x010000af ------------------------------------------------------------------------ 2c010202 c1030343 48462c01 0202c102 03584646 010650e5 <32 bytes per line>
这里可以得到结论如下:
1.数据是从块的底部开始往上存储
2.在每一条记录的头部分别有flag/lock/cols对应这里的2c0102
3.这里的偏移量和dump出来的数据可以看出来两条记录是连续在一起(偏移量分别为:8168和8178)
更新一条记录
SQL> update t_xifenfei set name='XIFENFEI' where id=1; 1 row updated. SQL> commit; Commit complete. SQL> alter system checkpoint; System altered. SQL> alter system dump datafile 4 block 175; System altered. SQL> select dump('XIFENFEI','16') from dual; DUMP('XIFENFEI','16') ------------------------------------- Typ=96 Len=8: 58,49,46,45,4e,46,45,49
我们可以但看到值有XFF改变为XIFENFEI,存储长度变大
dump数据块信息
bdba: 0x010000af data_block_dump,data header at 0xb683c064 =============== tsiz: 0x1f98 hsiz: 0x16 pbl: 0xb683c064 76543210 flag=-------- ntab=1 nrow=2 frre=-1 fsbo=0x16 fseo=0x1f75 avsp=0x1f69 tosp=0x1f69 0xe:pti[0] nrow=2 offs=0 0x12:pri[0] offs=0x1f75 ---->8053 0x14:pri[1] offs=0x1f84 ---->8068 block_row_dump: tab 0, row 0, @0x1f75 tl: 15 fb: --H-FL-- lb: 0x2 cc: 2 col 0: [ 2] c1 02 col 1: [ 8] 58 49 46 45 4e 46 45 49 tab 0, row 1, @0x1f84 tl: 10 fb: --H-FL-- lb: 0x0 cc: 2 col 0: [ 2] c1 03 col 1: [ 3] 43 48 46 end_of_block_dump End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175
通过对比第一次dump出来的数据块发现:row 0的值和偏移量发生了变化
bbed查看相关记录
BBED> set file 4 block 175 FILE# 4 BLOCK# 175 BBED> map File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Dba:0x010000af ------------------------------------------------------------ KTB Data Block (Table/Cluster) struct kcbh, 20 bytes @0 struct ktbbh, 72 bytes @20 struct kdbh, 14 bytes @100 struct kdbt[1], 4 bytes @114 sb2 kdbr[2] @118 ub1 freespace[8031] @122 ub1 rowdata[35] @8153 ub4 tailchk @8188 BBED> p kdbr sb2 kdbr[0] @118 8053 <--第一条row directory指针位置 sb2 kdbr[1] @120 8068 <--第二条row directory指针位置 BBED> p *kdbr[1] rowdata[15] ----------- ub1 rowdata[15] @8168 0x2c BBED> x /rnc rowdata[15] @8168 ----------- flag@8168: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8169: 0x00 cols@8170: 2 col 0[2] @8171: 2 col 1[3] @8174: CHF BBED> p *kdbr[0] rowdata[0] ---------- ub1 rowdata[0] @8153 0x2c BBED> x /r rowdata[0] @8153 ---------- flag@8153: 0x2c (KDRHFL, KDRHFF, KDRHFH) lock@8154: 0x02 cols@8155: 2 col 0[2] @8156: 0xc1 0x02 col 1[8] @8159: 0x58 0x49 0x46 0x45 0x4e 0x46 0x45 0x49 BBED> set count 64 COUNT 64 <32 bytes per line> BBED> d /v File: /u01/oracle/oradata/ora11g/users01.dbf (4) Block: 175 Offsets: 8153 to 8191 Dba:0x010000af ------------------------------------------------------- 2c020202 c1020858 4946454e 4645492c l ,......XIFENFEI, 000202c1 03034348 462c0002 02c10203 l ......CHF,...... 58464602 068de8 l XFF.... <16 bytes per line>
从这里可以看到
1.这里可以看到三个值(XFF,CHF,XIFENFEI)均存在,但是通过p kdbr和dump block不能看到,因为row directory中无指针指定到该值上
2.也是通过row directory指针使得我们从原先看到的第一条记录处于数据块最底部变成了现在相对而言的数据部分最上层,
3.绝大多数情况:数据库更新一条记录,不是直接修改数据值,而是重新插入一条新记录,然后修改row directory指针指定到新的offset上
4.不是直接update,而是insert+指针来实现,这样做的好处:1)如果修改记录update值的长度发生变化(变大或者变小)那么该值之前的数据都要发生变动,对数据库来说成本太高.2)如果直接更新值可能导致其他数据变动,使得其他行受到影响.
5.由于是修改row directory指针,所以该处理方法的rowid值不会发生变化
使用bbed解决ORA-00607/ORA-00600[4194]故障
ORA-00607/ORA-00600[4194]错误
数据库启动因为出现ORA-00607/ORA-00600[4194],导致数据库不能正常open
Fri Nov 4 23:10:37 2011 SMON: enabling cache recovery Fri Nov 4 23:10:37 2011 ARC2: Archival started ARC0: STARTING ARCH PROCESSES COMPLETE ARC0: Becoming the heartbeat ARCH ARC2 started with pid=18, OS id=21535 Fri Nov 4 23:10:38 2011 Errors in file /u01/oracle/admin/XFF/udump/xff_ora_21529.trc: ORA-00600: internal error code, arguments: [4194], [35], [6], [], [], [], [], [] Fri Nov 4 23:10:41 2011 Doing block recovery for file 1 block 18 Block recovery from logseq 2, block 48668 to scn 458453 Fri Nov 4 23:10:41 2011 Recovery of Online Redo Log: Thread 1 Group 1 Seq 2 Reading mem 0 Mem# 0 errs 0: /u01/oracle/oradata/XFF/redo01.log Block recovery stopped at EOT rba 2.48670.16 Block recovery completed at rba 2.48670.16, scn 0.458451 Doing block recovery for file 1 block 9 Block recovery from logseq 2, block 48668 to scn 458450 Fri Nov 4 23:10:41 2011 Recovery of Online Redo Log: Thread 1 Group 1 Seq 2 Reading mem 0 Mem# 0 errs 0: /u01/oracle/oradata/XFF/redo01.log Block recovery completed at rba 2.48670.16, scn 0.458451 Fri Nov 4 23:10:41 2011 Errors in file /u01/oracle/admin/XFF/udump/xff_ora_21529.trc: ORA-00604: error occurred at recursive SQL level 1 ORA-00607: Internal error occurred while making a change to a data block ORA-00600: internal error code, arguments: [4194], [35], [6], [], [], [], [], [] Error 604 happened during db open, shutting down database USER: terminating instance due to error 604 Instance terminated by USER, pid = 21529 ORA-1092 signalled during: ALTER DATABASE OPEN...
分析trace文件
*** SESSION ID:(159.3) 2011-11-04 23:10:37.648 tkcrrsarc: (WARN) Failed to find ARCH for message (message:0x1) tkcrrpa: (WARN) Failed initial attempt to send ARCH message (message:0x1) *** ktuc_diag_dmp: dump of current change vector ktudb redo: siz: 252 spc: 7200 flg: 0x0012 seq: 0x0037 rec: 0x06 xid: 0x0000.022.00000028 ktubl redo: slt: 34 rci: 0 opc: 11.1 objn: 15 objd: 15 tsn: 0 Undo type: Regular undo Begin trans Last buffer split: No Temp Object: No Tablespace Undo: No 0x00000000 prev ctl uba: 0x00400012.0037.1f prev ctl max cmt scn: 0x0000.0006c75b prev tx cmt scn: 0x0000.0006c75d txn start scn: 0xffff.ffffffff logon user: 0 prev brb: 4194318 prev bcl: 0 KDO undo record: KTB Redo op: 0x04 ver: 0x01 op: L itl: xid: 0x0000.020.00000029 uba: 0x00400013.0037.05 flg: C--- lkc: 0 scn: 0x0000.0006fecb KDO Op code: URP row dependencies Disabled xtype: XA flags: 0x00000000 bdba: 0x0040006a hdba: 0x00400069 itli: 1 ispac: 0 maxfr: 4863 tabn: 0 slot: 1(0x1) flag: 0x2c lock: 0 ckix: 191 ncol: 17 nnew: 12 size: 0 col 1: [ 9] 5f 53 59 53 53 4d 55 31 24 col 2: [ 2] c1 02 col 3: [ 2] c1 03 col 4: [ 2] c1 0a col 5: [ 4] c3 2e 55 0a col 6: [ 1] 80 col 7: [ 3] c2 02 59 col 8: [ 3] c2 02 02 col 9: [ 1] 80 col 10: [ 2] c1 03 col 11: [ 2] c1 02 col 16: [ 2] c1 02 *** 2011-11-04 23:10:38.086 ksedmp: internal or fatal error ORA-00600: internal error code, arguments: [4194], [35], [6], [], [], [], [], [] Current SQL statement for this session: update undo$ set name=:2,file#=:3,block#=:4,status$=:5,user#=:6,undosqn=:7,xactsqn=:8,scnbas=:9, scnwrp=:10,inst#=:11,ts#=:12,spare1=:13 where us#=:1 ----- Call Stack Trace ----- calling call entry argument values in hex location type point (? means dubious value) -------------------- -------- -------------------- ---------------------------- ksedst()+27 call ksedst1() 0 ? 1 ? ksedmp()+557 call ksedst() 0 ? 0 ? 0 ? 0 ? 0 ? 0 ? ksfdmp()+19 call ksedmp() 3 ? BFFA8C28 ? AC152C0 ? CBD2DA0 ? 3 ? BFFA9764 ? kgeriv()+188 call 00000000 CBD2DA0 ? 3 ? kseipre()+42 call kgeriv() CBD2DA0 ? B6A50020 ? 1062 ? 2 ? BFFA8C68 ? BFFA8C5C ? ksesic2()+21 call kseipre() 1062 ? 2 ? BFFA8C68 ? 32B36940 ? BFFA8D38 ? 8C4A3A9 ? kturdb()+1757 call ksesic2() 1062 ? 0 ? 23 ? 0 ? 0 ? 6 ? 0 ? kco_issue_callback( call 00000000 B6A09FA4 ? B6A0A01E ? 11 ? )+176 2D306014 ? B6A387C0 ? kcoapl()+2440 call kco_issue_callback( B6A09FA0 ? 2D306000 ? ) B6A387C0 ? kcbapl()+322 call kcoapl() B6A09FA0 ? 2D306000 ? 1 ? 0 ? 2000 ? 0 ? B6A387C0 ? kcrfw_redo_gen()+94 call kcbapl() B6A09FA0 ? 2D3F6A1C ? 10 CBE3AE8 ? 0 ? B6A387C0 ? kcbchg1_main()+8669 call kcrfw_redo_gen() 3 ? BFFA9358 ? BFFA9370 ? CBE3AE8 ? 0 ? BFFA9390 ? kcbchg1()+63 call kcbchg1_main() 0 ? 3 ? BFFA97B0 ? BFFA9798 ? 0 ? 0 ? ktuchg()+3344 call kcbchg1() 0 ? 3 ? BFFA97B0 ? BFFA9798 ? 0 ? 0 ? ktbchg2()+493 call ktuchg() 2 ? 2F9EEF8C ? 3 ? B6A0CA98 ? B6A0CAA0 ? B6A09FA0 ? B6A387C0 ? B6A0C7A0 ? 0 ? 0 ? kddchg()+1661 call ktbchg2() 0 ? 2F9EEF8C ? B6A0CA98 ? B6A0CAA0 ? B6A09FA0 ? B6A387B8 ? B6A0C7A0 ? 0 ? 0 ? kduovw()+7960 call kddchg() B6A3877C ? B6A0CA98 ? B6A0CAA0 ? B6A09FA0 ? B6A0C7A0 ? 0 ? 0 ? BFFA9C58 ? kduurp()+2316 call kduovw() B6A3877C ? 0 ? 10 ? B6A357A4 ? 0 ? B6A3877C ? kdusru()+4339 call kduurp() B6A3877C ? 958412D ? CBDC720 ? BFFA9FEC ? B8 ? B6A40380 ? kauupd()+366 call kdusru() B6A357A4 ? 2F9EEFF8 ? B6A3877C ? 0 ? updrow()+5889 call kauupd() B6A357A0 ? 2F9EEFF8 ? B6A3877C ? 0 ? 2FA479FC ? E ? F ? 2F9EF31C ? 12 ? BFFB0544 ? BFFB04E4 ? qerupRowProcedure() call updrow() 2F9E5B64 ? 7FFF ? DB4 ? 48 ? +62 2F9EFBF4 ? BFFB08B4 ? qerupFetch()+1187 call 00000000 2F9EF4B0 ? 7FFF ? updaul()+3474 call 00000000 2F9EF4B0 ? 0 ? 2F9EF370 ? 7FFF ? updThreePhaseExe()+ call updaul() 2F9E5B64 ? BFFB0D2C ? 0 ? 3470 updexe()+813 call updThreePhaseExe() 2F9E5B64 ? 0 ? B6A3877C ? BFFB0E00 ? 2F9E5B64 ? 1 ? BFFB0E00 ? 0 ? opiexe()+17967 call updexe() 2F9E5B64 ? BFFB1074 ? opiodr()+2347 call 00000000 4 ? 4 ? BFFB25A8 ? rpidrus()+434 call opiodr() 4 ? 4 ? BFFB25A8 ? 2 ? skgmstack()+210 call 00000000 BFFB2004 ? 97492FE ? CBD2E9C ? BFFB1FE8 ? BFFB24EC ? BFFB2004 ? rpidru()+98 call skgmstack() BFFB1FE8 ? CBD2B60 ? F618 ? 9749546 ? BFFB2004 ? rpiswu2()+1061 call 00000000 BFFB24EC ? BFFB25E8 ? BFFB2500 ? 2 ? BFFB24B0 ? 5953 ? rpidrv()+1915 call rpiswu2() 32F0A1D4 ? 0 ? BFFB24B0 ? 2 ? BFFB2528 ? 0 ? BFFB24B0 ? 0 ? 9749800 ? 97498DC ? BFFB24EC ? 8 ? rpiexe()+65 call rpidrv() 2 ? 4 ? BFFB25A8 ? 8 ? ktuscu()+697 call rpiexe() 2 ? 1C ? 2A ? 32FF3404 ? 0 ? BFFB2710 ? kqrcmt()+945 call 00000000 32AFA70C ? 3 ? ktcrcm()+945 call kqrcmt() 31A2B84C ? 1 ? 0 ? ktuswr()+1855 call ktcrcm() 31A2B84C ? 0 ? 0 ? 0 ? 0 ? 1 ? 0 ? 0 ? ktusmous_online_und call ktuswr() 1 ? 0 ? 0 ? 0 ? 0 ? 0 ? oseg()+951 ktusmout_online_ut( call ktusmous_online_und 1 ? A ? 0 ? 3 ? )+737 oseg() ktusmiut_init_ut()+ call ktusmout_online_ut( 1 ? 0 ? 0 ? 1084 ) ktuini()+688 call ktusmiut_init_ut() 0 ? BFFB4744 ? CBD2E9C ? CBD2E9C ? CBD2DA0 ? 7 ? adbdrv()+5699 call ktuini() 0 ? 0 ? 0 ? 0 ? 64000000 ? 3 ? opiexe()+18301 call adbdrv() 59D4 ? 0 ? 9EE16E2F ? 494C4 ? 32B33CD0 ? 0 ? opiosq0()+3918 call opiexe() 4 ? 0 ? BFFB8988 ? kpooprx()+250 call opiosq0() 3 ? E ? BFFB8B90 ? A4 ? kpoal8()+867 call kpooprx() BFFBAD68 ? BFFB990C ? 13 ? 1 ? 0 ? A4 ? opiodr()+2347 call 00000000 5E ? 17 ? BFFBAD64 ? ttcpip()+4227 call 00000000 5E ? 17 ? BFFBAD64 ? 0 ? DABCA66 ? 93 ? opitsk()+1991 call ttcpip() CBDA5A0 ? 5E ? BFFBAD64 ? 0 ? BFFBA244 ? BFFBAE88 ? opiino()+1387 call opitsk() 0 ? 0 ? opiodr()+2347 call 00000000 3C ? 4 ? BFFBB950 ? opidrv()+915 call opiodr() 3C ? 4 ? BFFBB950 ? 0 ? sou2o()+113 call opidrv() 3C ? 4 ? BFFBB950 ? opimai_real()+212 call sou2o() BFFBB934 ? 3C ? 4 ? BFFBB950 ? main()+111 call opimai_real() 2 ? BFFBB980 ? __libc_start_main() call 00000000 2 ? BFFBBA44 ? BFFBBA50 ? +220 47D9A828 ? 0 ? 1 ? --------------------- Binary Stack Dump ---------------------
数据库在open的时候,需要去修改undo$对象的状态,从2该为3(offline->online)这个时候需要使用到系统回滚段,但是在使用系统回滚段的时候,使用uba=0×00400012的时候发生异常,导致数据库不能正常open,从而出现了ORA-00600[4194]的错误.而出现这个故障的原因,很可能是由于file 1 block 18块的异常导致.我们需要做的,就是让数据库启动的时候不使用file 1 block 18的block,而让数据库去另外的分配一个undo块.
bbed清除rollback分配块信息
[oracle@xifenfei ~]$ bbed listfile=list mode=edit password=blockedit BBED: Release 2.0.0.0.0 - Limited Production on Sat Nov 5 01:11:49 2011 Copyright (c) 1982, 2005, Oracle. All rights reserved. ************* !!! For Oracle Internal Use only !!! *************** BBED> set file 1 block 9 FILE# 1 BLOCK# 9 BBED> map File: /u01/oracle/oradata/XFF/system01.dbf (1) Block: 9 Dba:0x00400009 ------------------------------------------------------------ Unlimited Undo Segment Header struct kcbh, 20 bytes @0 struct ktech, 72 bytes @20 struct ktemh, 16 bytes @92 struct ktetb[6], 48 bytes @108 struct ktuxc, 104 bytes @4148 struct ktuxe[255], 10200 bytes @4252 ub4 tailchk @8188 BBED> p ktuxc struct ktuxc, 104 bytes @4148 struct ktuxcscn, 8 bytes @4148 ub4 kscnbas @4148 0x0006c75b ub2 kscnwrp @4152 0x0000 struct ktuxcuba, 8 bytes @4156 ub4 kubadba @4156 0x00400012 ub2 kubaseq @4160 0x0037 ub1 kubarec @4162 0x1f sb2 ktuxcflg @4164 1 (KTUXCFSK) ub2 ktuxcseq @4166 0x0037 sb2 ktuxcnfb @4168 1 ub4 ktuxcinc @4172 0x00000000 sb2 ktuxcchd @4176 34 sb2 ktuxcctl @4178 32 ub2 ktuxcmgc @4180 0x8002 ub4 ktuxcopt @4188 0x7ffffffe struct ktuxcfbp[0], 12 bytes @4192 struct ktufbuba, 8 bytes @4192 ub4 kubadba @4192 0x00400012 ub2 kubaseq @4196 0x0037 ub1 kubarec @4198 0x05 sb2 ktufbext @4200 1 sb2 ktufbspc @4202 7200 struct ktuxcfbp[1], 12 bytes @4204 struct ktufbuba, 8 bytes @4204 ub4 kubadba @4204 0x00000000 ub2 kubaseq @4208 0x0035 ub1 kubarec @4210 0x2a sb2 ktufbext @4212 5 sb2 ktufbspc @4214 3446 struct ktuxcfbp[2], 12 bytes @4216 struct ktufbuba, 8 bytes @4216 ub4 kubadba @4216 0x00000000 ub2 kubaseq @4220 0x0035 ub1 kubarec @4222 0x37 sb2 ktufbext @4224 5 sb2 ktufbspc @4226 1336 struct ktuxcfbp[3], 12 bytes @4228 struct ktufbuba, 8 bytes @4228 ub4 kubadba @4228 0x00000000 ub2 kubaseq @4232 0x0000 ub1 kubarec @4234 0x00 sb2 ktufbext @4236 0 sb2 ktufbspc @4238 0 struct ktuxcfbp[4], 12 bytes @4240 struct ktufbuba, 8 bytes @4240 ub4 kubadba @4240 0x00000000 ub2 kubaseq @4244 0x0000 ub1 kubarec @4246 0x00 sb2 ktufbext @4248 0 sb2 ktufbspc @4250 0 BBED> set count 16 COUNT 16 ######################################################## 使用bbed修改相关参数 ########################################################
启动数据库
SQL> startup ORACLE instance started. Total System Global Area 318767104 bytes Fixed Size 1219160 bytes Variable Size 96470440 bytes Database Buffers 213909504 bytes Redo Buffers 7168000 bytes Database mounted. Database opened. SQL> select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.0.1.0 - Prod PL/SQL Release 10.2.0.1.0 - Production CORE 10.2.0.1.0 Production TNS for Linux: Version 10.2.0.1.0 - Production NLSRTL Version 10.2.0.1.0 - Production