怎么计算出正确的checksum值?
1)创建一个测试表
SQL> create table test (id int, namevarchar2(10));
Table created.
SQL> insert into test values(1,'AAAAA');
1 row created.
SQL> commit;
Commit complete.
SQL> selectdbms_rowid.ROWID_RELATIVE_FNO(rowid) file#,dbms_rowid.ROWID_BLOCK_NUMBER(rowid)blk# from test;
FILE# BLK#
---------- ----------
4 284
通过BBED查看当前的CHECKSUM值
[oracle@Mysql ~]$ bbed
BBED: Release 2.0.0.0.0 - Limited Productionon Fri May 25 00:54:11 2018
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved.
************* !!! For Oracle Internal Useonly !!! ***************
BBED> set file 4 block 284
FILE# 4
BLOCK# 284
BBED> sum
Check value for File 4, Block 284:
current = 0xf9ff, required = 0xf9ff
把284号数据块dump出来。
[oracle@Mysql ~]$ ddif=/u01/app/oracle/oradata/dsidb/users01.dbf of=/tmp/test.dd count=1 skip=284bs=8192
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.000435816 s,18.8 MB/s
我们使用UE编辑器打开test.dd数据块
然后把C1 02改成C1 03
然后把test.dd数据块copy回去
[oracle@Mysql tmp]$ dd if=/tmp/test.ddof=/u01/app/oracle/oradata/dsidb/users01.dbf count=1 seek=284 bs=8192conv=notrunc
1+0 records in
1+0 records out
8192 bytes (8.2 kB) copied, 0.000339993 s,24.1 MB/s
然后重启一下数据库
SQL> startup force;
ORACLE instance started.
Total System Global Area 588746752 bytes
Fixed Size 2230592 bytes
Variable Size 201328320 bytes
Database Buffers 377487360 bytes
Redo Buffers 7700480 bytes
Database mounted.
Database opened.
SQL> conn scott/oracle
Connected.
SQL> select * from test;
select * from test
*
ERROR at line 1:
ORA-01578: ORACLE data block corrupted(file # 4, block # 284)
ORA-01110: data file 4:'/u01/app/oracle/oradata/dsidb/users01.dbf'
可以看到数据库查询表test报错,我们再看一下数据库日志。
2018-05-25 01:16:29.248000 +08:00
Errors in file/u01/app/oracle/diag/rdbms/dsidb/dsidb/trace/dsidb_ora_10666.trc (incident=102183):
ORA-01578: ORACLE data block corrupted(file # 4, block # 284)
ORA-01110: data file 4:'/u01/app/oracle/oradata/dsidb/users01.dbf'
Incident details in: /u01/app/oracle/diag/rdbms/dsidb/dsidb/incident/incdir_102183/dsidb_ora_10666_i102183.trc
Sweep [inc][102182]: completed
Hex dump of (file 4, block 284) in tracefile/u01/app/oracle/diag/rdbms/dsidb/dsidb/incident/incdir_102182/dsidb_m000_10668_i102182_a.trc
Corrupt block relative dba: 0x0100011c(file 4, block 284)
Bad check value found during validation
Data in bad block:
type: 6 format: 2 rdba: 0x0100011c
lastchange scn: 0x0000.003ffe2d seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xfe2d0601
check value in block header: 0xf9ff
computed block checksum: 0x100
可以看到文件头上的check value值为0xf9ff,计算的check sum值为0x100
然后我们再使用BBED去sum一下这个数据块,可以看到,当前check value的值为f9ff,而需要的值为f8ff
[oracle@Mysql ~]$ bbed
BBED: Release 2.0.0.0.0 - LimitedProduction on Fri May 25 01:18:44 2018
Copyright (c) 1982, 2011, Oracle and/or itsaffiliates. All rights reserved.
************* !!! For Oracle Internal Useonly !!! ***************
BBED> set file 4 block 284
FILE# 4
BLOCK# 284
BBED> sum
Check value for File 4, Block 284:
current = 0xf9ff,required = 0xf8ff
我们根据 0xf9ff与0x100计算一下当前block正常的checksum值应该是多少。
F9FF= 1111 1001 1111 1111
100=0000 0001 0000 0000
根据异或算法原理,这里很容易可以看出oracle计算出来的正确的checksum值应该是: 1111 1000 1111 1111, 也就是f8ff
好了,我们这里如法炮制再改一次上述block的checksum值,即将上述block的checksum值改为f8 ff
我们先verify一下
BBED> verify
DBVERIFY - Verification starting
FILE =/u01/app/oracle/oradata/dsidb/users01.dbf
BLOCK = 284
Block 284 is corrupt
Corrupt block relative dba: 0x0100011c(file 0, block 284)
Bad check value found during verification
Data in bad block:
type: 6 format: 2 rdba: 0x0100011c
lastchange scn: 0x0000.003ffe2d seq: 0x1 flg: 0x06
spare1: 0x0 spare2: 0x0 spare3: 0x0
consistency value in tail: 0xfe2d0601
check value in block header: 0xf9ff
computed block checksum: 0x100
DBVERIFY - Verification complete
Total Blocks Examined : 1
Total Blocks Processed (Data) : 0
Total Blocks Failing (Data) : 0
Total Blocks Processed (Index): 0
Total Blocks Failing (Index): 0
Total Blocks Empty : 0
Total Blocks MarkedCorrupt : 1
Total Blocks Influx : 0
BBED> sum
Check value for File 4, Block 284:
current = 0xf9ff, required = 0xf8ff
BBED> sum
Check value for File 4, Block 284:
current = 0xf9ff, required = 0xf8ff
BBED> modify /x 0xf8ff offset 16
Warning: contents of previous BIFILE willbe lost. Proceed? (Y/N) y
File:/u01/app/oracle/oradata/dsidb/users01.dbf (4)
Block: 284 Offsets: 16 to527 Dba:0x0100011c
------------------------------------------------------------------------
f8ff0000 01000000 fa2a0100 2cfe3f00 0000000002003200 18010001 1d000900
a0000000 ba040002 4d001100 01200000 2dfe3f0000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000010100 ffff1400 8c1f781f
781f0000 01008c1f ffff3200 a0046e04 6e0400001000c01d 961c7b1b b9190418
50167a14 9812f110 4b0f830d ba0bde09 29087606a0040000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
00000000 00000000 00000000 00000000 0000000000000000 00000000 00000000
<32 bytes per line>
BBED> sum apply
Check value for File 4, Block 284:
current = 0xf8ff, required = 0xf8ff
然后再次verify,可以看到,已经不报坏块了。
BBED> verify
DBVERIFY - Verification starting
FILE =/u01/app/oracle/oradata/dsidb/users01.dbf
BLOCK = 284
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
BBED> sum
Check value for File 4, Block 284:
current = 0xf8ff, required = 0xf8ff
数据也可以正常返回了。
SQL> select * from test;
ID NAME
---------- ----------
2 AAAAA
2.重现数据块内空间计算错误?(详细的实验操作步骤,BBED工具verify如下命令提示)
BBED>verify
kdbchk:the amount of space used is notequal to block size
Total Blocks Failing(Data)
SQL> create table t2 (id int,namevarchar2(10));
Table created.
SQL> insert into t2 values(1,'AAAAA');
1 row created.
SQL> commit;
Commit complete.
SQL> alter system flush buffer_cache;
System altered.
SQL> selectdbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid)blk# from t2;
FILE# BLK#
---------- ----------
4 220
SQL> delete from t2;
1 row deleted.
SQL> alter system flush buffer_cache;
System altered.
BBED> set file 4 block 220
FILE# 4
BLOCK# 220
BBED> map
File:/u01/app/oracle/oradata/dsidb/users01.dbf (4)
Block: 220Dba:0x010000dc
------------------------------------------------------------
KTBData Block (Table/Cluster)
struct kcbh, 20 bytes @0
struct ktbbh, 72 bytes @20
struct kdbh, 14 bytes @100
struct kdbt[1], 4 bytes @114
sb2kdbr[1]@118
ub1freespace[8055]@120
ub1rowdata[13]@8175
ub4tailchk@8188
BBED> p rowdata
ub1 rowdata[0] @8175 0x3c
ub1 rowdata[1] @8176 0x02
ub1 rowdata[2] @8177 0x02
ub1 rowdata[3] @8178 0x02
ub1 rowdata[4] @8179 0xc1
ub1 rowdata[5] @8180 0x02
ub1 rowdata[6] @81810x06
ub1 rowdata[7] @8182 0x41
ub1 rowdata[8] @8183 0x41
ub1 rowdata[9] @8184 0x41
ub1 rowdata[10] @8185 0x41
ub1 rowdata[11] @8186 0x41
ub1 rowdata[12] @8187 0x0a
BBED> modify /x 2c offset 8175
File:/u01/app/oracle/oradata/dsidb/users01.dbf (4)
Block: 220 Offsets: 8175 to 8191 Dba:0x010000dc
------------------------------------------------------------------------
2c020202 c1020641 41414141 0a010621 59
<32 bytes per line>
BBED> sum apply
Check value for File 4, Block 220:
current = 0x1f3f, required = 0x1f3f
BBED> verify
DBVERIFY - Verification starting
FILE =/u01/app/oracle/oradata/dsidb/users01.dbf
BLOCK = 220
Block Checking: DBA = 16777436, Block Type= KTB-managed data block
data header at 0x24d9064
kdbchk: the amount ofspace used is not equal to block size
used=33 fsc=11 avsp=8055 dtl=8088
Block 220 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 1
sb2 kdbhfrre@104 -1
sb2 kdbhfsbo @106 20
sb2 kdbhfseo@108 8075
sb2 kdbhavsp@110 8055
sb2 kdbhtosp@112 8068
声明:本站所有文章资源内容,如无特殊说明或标注,均为采集网络资源。如若本站内容侵犯了原著者的合法权益,可联系本站删除。