怎么计算出正确的checksum值?
1)创建一个测试表
公司主营业务:成都网站设计、成都网站建设、移动网站开发等业务。帮助企业客户真正实现互联网宣传,提高企业的竞争能力。成都创新互联是一支青春激扬、勤奋敬业、活力青春激扬、勤奋敬业、活力澎湃、和谐高效的团队。公司秉承以“开放、自由、严谨、自律”为核心的企业文化,感谢他们对我们的高要求,感谢他们从不同领域给我们带来的挑战,让我们激情的团队有机会用头脑与智慧不断的给客户带来惊喜。成都创新互联推出防城港免费做网站回馈大家。
SQL> create table test (id int, name varchar2(10));
Table created.
SQL> insert into test values(1,'AAAAA');
1 row created.
SQL> commit;
Commit complete.
SQL> select dbms_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 Production on Fri May 25 00:54:11 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
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 ~]$ dd if=/u01/app/oracle/oradata/dsidb/users01.dbf of=/tmp/test.dd count=1 skip=284 bs=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.dd of=/u01/app/oracle/oradata/dsidb/users01.dbf count=1 seek=284 bs=8192 conv=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 trace file /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
last change 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 - Limited Production on Fri May 25 01:18:44 2018
Copyright (c) 1982, 2011, Oracle and/or its affiliates. All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
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
last change 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 Marked Corrupt : 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 will be lost. Proceed? (Y/N) y
File: /u01/app/oracle/oradata/dsidb/users01.dbf (4)
Block: 284 Offsets: 16 to 527 Dba:0x0100011c
------------------------------------------------------------------------
f8ff0000 01000000 fa2a0100 2cfe3f00 00000000 02003200 18010001 1d000900
a0000000 ba040002 4d001100 01200000 2dfe3f00 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00010100 ffff1400 8c1f781f
781f0000 01008c1f ffff3200 a0046e04 6e040000 1000c01d 961c7b1b b9190418
50167a14 9812f110 4b0f830d ba0bde09 29087606 a0040000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 00000000 00000000 00000000 00000000 00000000
00000000 00000000 00000000 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 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 not equal to block size
Total Blocks Failing(Data)
SQL> create table t2 (id int,name varchar2(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> select dbms_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: 220 Dba:0x010000dc
------------------------------------------------------------
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[1] @118
ub1 freespace[8055] @120
ub1 rowdata[13] @8175
ub4 tailchk @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] @8181 0x06
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 of space 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
新闻名称:怎么计算出正确的checksum值?
网页网址:http://pwwzsj.com/article/ihhdsg.html