1)創(chuàng)建一個測試表
公司主營業(yè)務(wù):成都網(wǎng)站設(shè)計、成都網(wǎng)站建設(shè)、移動網(wǎng)站開發(fā)等業(yè)務(wù)。幫助企業(yè)客戶真正實現(xiàn)互聯(lián)網(wǎng)宣傳,提高企業(yè)的競爭能力。成都創(chuàng)新互聯(lián)是一支青春激揚、勤奮敬業(yè)、活力青春激揚、勤奮敬業(yè)、活力澎湃、和諧高效的團隊。公司秉承以“開放、自由、嚴謹、自律”為核心的企業(yè)文化,感謝他們對我們的高要求,感謝他們從不同領(lǐng)域給我們帶來的挑戰(zhàn),讓我們激情的團隊有機會用頭腦與智慧不斷的給客戶帶來驚喜。成都創(chuàng)新互聯(lián)推出防城港免費做網(wǎng)站回饋大家。
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號數(shù)據(jù)塊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數(shù)據(jù)塊
然后把C1 02改成C1 03
然后把test.dd數(shù)據(jù)塊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
然后重啟一下數(shù)據(jù)庫
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'
可以看到數(shù)據(jù)庫查詢表test報錯,我們再看一下數(shù)據(jù)庫日志。
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一下這個數(shù)據(jù)塊,可以看到,當前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
我們根據(jù) 0xf9ff與0x100計算一下當前block正常的checksum值應(yīng)該是多少。
F9FF= 1111 1001 1111 1111
100= 0000 0001 0000 0000
根據(jù)異或算法原理,這里很容易可以看出oracle計算出來的正確的checksum值應(yīng)該是: 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,可以看到,已經(jīng)不報壞塊了。
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
數(shù)據(jù)也可以正常返回了。
SQL> select * from test;
ID NAME
---------- ----------
2 AAAAA
2.重現(xiàn)數(shù)據(jù)塊內(nèi)空間計算錯誤?(詳細的實驗操作步驟,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