千家信息网

怎么计算出正确的checksum值?

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,1)创建一个测试表SQL> create table test (id int, name varchar2(10));Table created.SQL> insert into test valu
千家信息网最后更新 2026年10月31日怎么计算出正确的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

数据 数据库 如法炮制 也就是 再次 原理 命令 工具 文件 日志 查询表 步骤 空间 算法 编辑器 错误 如法 实验 提示 查询 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 科技互联网企业 厦门中拓互联网络科技有限公司 没上市的科技互联网公司 互联网金融与金融科技 互联网科技的发展 安徽鑫晟辉互联网科技 百单互联网科技有限公司 互联网科技上市公司 新浪科技互联网 科技类的互联网平台 成都仁贤领冠互联网科技有限公司 新兴科技互联网创新大赛颁奖典礼 消费医药和互联网科技 乌苏新华互联网科技做什么的 深圳艾果互联网通讯科技 北京市互联网新科技 九思连强互联网电子科技有限公司 广东鹅鹅鹅互联网科技有限公司 上海同邻互联网科技有限公司规模 亚光科技低轨卫星互联网 互联网的科技创新 互联网科技媒体 猫创互联网科技 互联网前沿科技 彤创互联网科技有限公司 移动互联网科技公司 阿里互联网科技企业 工业互联网等科技实现智能化赋能 广东鹅鹅鹅互联网科技有限公司 北京军民互联网科技公司
0