模拟数据块不一致(1)
本节中将利用BBED(Block Browser and
Editor)这个工具直接修改数据块内容,从而模拟数据块的不一致。这个工具是Oracle自带的一个工具,它可以编辑Oracle数据块的内容,因此
虽然功能很强大,但是也比较危险。这个工具只供Oracle
Internal使用,Oracle不提供任何文档。目前网上可见的最好文档是由Graham Thornton编写的。
再次强调一下,这个工具虽然功能强大,但也是一个很危险的工具。所以,以下操作练习一定要在测试库进行。
(1)编译BBED:
- [oracle@dbs ~]$ cd $ORACLE_HOME/rdbms/lib
- [oracle@dbs ~]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
$ORACLE_HOME/rdbms/lib/bbed
确认在目录下产生了BBED二进制文件:
- [oracle@dbs ~]$ ll bbed
- rwxr-xr-x 1 oracle DBA 544001 6月 24 09:35 bbed
(2)感受BBED。BBED是个交互式工具,使用时需要提供密码,这个密码并不是数据库密码,缺省密码是blockedit。
- [oracle@dbs lib]$ ./bbed
- Password: blockedit
-
- BBED: Release 2.0.0.0.0 - Limited Production
on Tue Apr 29 08:44:28 2008 -
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
-
- ************* !!! For Oracle Internal
Use only !!! *************** - BBED> help
(3)创建测试表test,插入两条测试数据:
- SQL> create table test (id number,name varchar2(100));
-
- SQL> insert into test values(10,'zhang');
-
- SQL> insert into test values (20,'xiao');
-
- SQL> commit;
(4)根据记录的ROWID确认记录所在的数据文件、数据块,这要用到dbms_rowid包:
- SQL>set serveroutput on
-
- SQL>DECLARE
- ridtyp NUMBER;
- objnum NUMBER;
- relfno NUMBER;
- blno NUMBER;
- rowno NUMBER;
- rid ROWID;
- BEGIN
- SELECT rowid
- INTO rid
- FROM test where id=10;
- dbms_rowid.rowid_info(rid,ridtyp,objnum,
relfno,blno,rowno,'SMALLFILE'); - dbms_output.put_line('Row Typ-' || TO_CHAR(ridtyp));
- dbms_output.put_line('Obj No-' || TO_CHAR(objnum));
- dbms_output.put_line('RFNO-' || TO_CHAR(relfno));
- dbms_output.put_line('Block No-' || TO_CHAR(blno));
- dbms_output.put_line('Row No-' || TO_CHAR(rowno));
- END;
- /
脚本输出如下,提示刚才创建的测试数据在数据文件1的28618号数据块上:
- Row Typ-1
- Obj No-10235
- RFNO-1
- Block No- 28618
- Row No-0
(5)使用BBED工具编辑这个数据块。准备BBED的参数文件:
- [oracle@dbs bbed]cat bbed.par
- blocksize=8192
- listlistfile=list
- mode=edit
-
- [oracle@dbs bbed]$ bbed parfile=bbed.par
- Password: blockedit
输入密码,缺省是blockedit,密码通过后,进入BBED交互式环境。
- BBED: Release 2.0.0.0.0 - Limited Production
on Tue Apr 29 10:24:39 2008 -
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
-
- ************* !!! For Oracle
Internal Use only !!! ***************
使用set命令定位到想要修改的数据块:
- BBED> set dba 1,28618
- DBA 0x00406fca (4222922 1,28618)
可以先查看一下,确定这个数据块确实包含该记录:
- BED> find /c zhang --确认这个记录在这个数据块中。
- File: /backup/test/test/system01.dbf (1)
- Block: 28618 Offsets:
8183 to 8191 Dba:0x00406fca - -------------------------------------------------------
- 7a68616e 67010642 a3
- <32 bytes per line>
上面输出提示记录相对数据块头的偏移量是8183。
使用dump命令打印出8183开始的内容,输出内容中确实是zhang:
- BBED> dump /v dba 1,28618 offset 8183 count 32
- File: /backup/test/test/system01.dbf (1)
- Block: 28618 Offsets: 8183 to 8191 Dba:0x00406fca
- --------------------------------------------
- 7a68616e 67010642 a3 l zhang..B.
-
- <16 bytes per line>
使用modify命令修改内容,这里的目的是破坏原来数据内容,所以修改成什么内容并不重要。
- BBED> modify 100 dba 1,28618
- Warning: contents of previous BIFILE will be
lost. Proceed? (Y/N) y - File: /backup/test/test/system01.dbf (1)
- Block: 28618 Offsets:
0 to 511 Dba:0x00406fca - ---------------------------------------------------------
- 64a20000 ca6f4000 42a30200 00000106 09340000
01000000 fb270000 3ca30200 - 00000000 02000300 00000000 01000e00 52000000
7b3b8000 18000500 01200000 - ……
最后退出BBED环境。
- BBED> exit
(6)先使用DBV检查数据文件,检查结果显示有一个损坏的数据块:
- [oracle@dbs bbed]$ dbv file=/backup/test/test/system01.dbf
-
- DBVERIFY: Release 10.2.0.1.0 - Production on
Tue Apr 29 10:37:41 2008 -
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
-
- DBVERIFY - Verification starting : FILE =
/backup/test/test/system01.dbf - Page 28618 is marked corrupt
- Corrupt block relative dba: 0x00406fca (file 1, block 28618)
- Bad check value found during dbv:
- Data in bad block:
- type: 6 format: 2 rdba: 0x00406fca
- last change scn: 0x0000.0002a341 seq: 0x1 flg: 0x04
- spare1: 0x0 spare2: 0x0 spare3: 0x0
- consistency value in tail: 0xa3410601
- check value in block header: 0x3675
- computed block checksum: 0x1e00
-
-
-
- DBVERIFY - Verification complete
-
- Total Pages Examined : 38400
- Total Pages Processed (Data) : 11263
- Total Pages Failing (Data) : 0
- Total Pages Processed (Index): 3243
- Total Pages Failing (Index): 0
- Total Pages Processed (Other): 1768
- Total Pages Processed (Seg) : 0
- Total Pages Failing (Seg) : 0
- Total Pages Empty : 22125
- Total Pages Marked Corrupt : 1
- Total Pages Influx : 0
- Highest block SCN : 173409 (0.173409)
(7)用RMAN工具检查数据文件:
- RMAN> backup check logical validate database;
-
- Starting backup at 29-APR-08
- using target database control file instead of recovery catalog
- allocated channel: ORA_DISK_1
- channel ORA_DISK_1: sid=143 devtype=DISK
- channel ORA_DISK_1: starting datafile copy
- input datafile fno=00001 name=/backup/test/test/system01.dbf
- channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03
- channel ORA_DISK_1: starting datafile copy
- input datafile fno=00002 name=/backup/test/test/undotbs01.dbf
- channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
- channel ORA_DISK_1: starting datafile copy
- input datafile fno=00003 name=/backup/test/test/sysaux01.dbf
- channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
- channel ORA_DISK_1: starting datafile copy
- input datafile fno=00004 name=/backup/test/test/users01.dbf
- channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01
- Finished backup at 29-APR-08
-
- RMAN> exit
RMAN的检查结果需要从视图中查看:
- SQL> select FILE#,block#,blocks from v$database_block_corruption;
-
- FILE# BLOCK# BLOCKS
- ------ ------ -------
- 1 28618 1
(8)演示ORA-1578错误。现在如果对表test进行全表扫描,就会抛出ORA-1578错误,参数(file# 1,block# 28618)和上面RMAN检查结果一致。
- SQL> select * from test;
- select * from test
- *
- ERROR at line 1:
- ORA-01578: ORACLE data block corrupted
(file # 1, block # 28618) - ORA-01110: data file 1: '/backup/test/test/system01.dbf'