模拟数据块不一致(DDED的使用)

已有 1013 次阅读2013-1-2 16:54 |个人分类:block| , 工具, Browser, Oracle, 最好

模拟数据块不一致(1)

本节中将利用BBED(Block Browser and Editor)这个工具直接修改数据块内容,从而模拟数据块的不一致。这个工具是Oracle自带的一个工具,它可以编辑Oracle数据块的内容,因此 虽然功能很强大,但是也比较危险。这个工具只供Oracle Internal使用,Oracle不提供任何文档。目前网上可见的最好文档是由Graham Thornton编写的。

再次强调一下,这个工具虽然功能强大,但也是一个很危险的工具。所以,以下操作练习一定要在测试库进行。

(1)编译BBED:

  1. [oracle@dbs ~]$ cd $ORACLE_HOME/rdbms/lib  
  2. [oracle@dbs ~]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
    $ORACLE_HOME/rdbms/lib/bbed 

确认在目录下产生了BBED二进制文件:

  1. [oracle@dbs ~]$ ll bbed  
  2. rwxr-xr-x  1 oracle DBA  544001  6月 24 09:35 bbed 

(2)感受BBED。BBED是个交互式工具,使用时需要提供密码,这个密码并不是数据库密码,缺省密码是blockedit。

  1. [oracle@dbs lib]$ ./bbed  
  2. Password: blockedit  
  3.  
  4. BBED: Release 2.0.0.0.0 - Limited Production
    on Tue Apr 29 08:44:28 2008  
  5.  
  6. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  7.  
  8. ************* !!! For Oracle Internal 
    Use only !!! ***************  
  9. BBED> help 

(3)创建测试表test,插入两条测试数据:

  1. SQL> create table test (id number,name varchar2(100));  
  2.  
  3. SQL> insert into test values(10,'zhang');  
  4.  
  5. SQL> insert into test values (20,'xiao');  
  6.  
  7. SQL> commit; 

(4)根据记录的ROWID确认记录所在的数据文件、数据块,这要用到dbms_rowid包:

  1. SQL>set serveroutput on  
  2.  
  3. SQL>DECLARE  
  4.  ridtyp NUMBER;  
  5.  objnum NUMBER;  
  6.  relfno NUMBER;  
  7.  blno   NUMBER;  
  8.  rowno NUMBER;  
  9.  rid    ROWID;  
  10. BEGIN  
  11.  SELECT rowid  
  12.  INTO rid  
  13.  FROM test where id=10;  
  14. dbms_rowid.rowid_info(rid,ridtyp,objnum,
    relfno,blno,rowno,'SMALLFILE');  
  15. dbms_output.put_line('Row Typ-' || TO_CHAR(ridtyp));  
  16. dbms_output.put_line('Obj No-' || TO_CHAR(objnum));  
  17. dbms_output.put_line('RFNO-' || TO_CHAR(relfno));  
  18. dbms_output.put_line('Block No-' || TO_CHAR(blno));  
  19. dbms_output.put_line('Row No-' || TO_CHAR(rowno));  
  20. END;  

脚本输出如下,提示刚才创建的测试数据在数据文件1的28618号数据块上:

  1. Row Typ-1  
  2. Obj No-10235  
  3. RFNO-1  
  4. Block No- 28618  
  5. Row No-0 

(5)使用BBED工具编辑这个数据块。准备BBED的参数文件:

  1. [oracle@dbs bbed]cat bbed.par  
  2. blocksize=8192 
  3. listlistfile=list  
  4. mode=edit 
  5.  
  6. [oracle@dbs bbed]$ bbed parfile=bbed.par  
  7. Password: blockedit 

输入密码,缺省是blockedit,密码通过后,进入BBED交互式环境。

  1. BBED: Release 2.0.0.0.0 - Limited Production
    on Tue Apr 29 10:24:39 2008  
  2.  
  3. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  4.  
  5. ************* !!! For Oracle
    Internal Use only !!! *************** 

使用set命令定位到想要修改的数据块:

  1. BBED> set dba 1,28618  
  2.         DBA                  0x00406fca (4222922 1,28618) 

可以先查看一下,确定这个数据块确实包含该记录:

  1. BED> find /c zhang   --确认这个记录在这个数据块中。  
  2.  File: /backup/test/test/system01.dbf (1)  
  3.  Block: 28618                      Offsets:
    8183 to 8191         Dba:0x00406fca  
  4. -------------------------------------------------------  
  5.  7a68616e 67010642 a3  
  6.  <32 bytes per line> 

上面输出提示记录相对数据块头的偏移量是8183。

使用dump命令打印出8183开始的内容,输出内容中确实是zhang:

  1. BBED> dump /v dba 1,28618 offset 8183 count 32  
  2.  File: /backup/test/test/system01.dbf (1)  
  3.  Block: 28618        Offsets: 8183 to 8191  Dba:0x00406fca  
  4. --------------------------------------------  
  5.  7a68616e 67010642 a3                l zhang..B.  
  6.  
  7.  <16 bytes per line> 

使用modify命令修改内容,这里的目的是破坏原来数据内容,所以修改成什么内容并不重要。

  1. BBED> modify 100 dba 1,28618  
  2. Warning: contents of previous BIFILE will be 
    lost. Proceed? (Y/N) y  
  3.  File: /backup/test/test/system01.dbf (1)  
  4.  Block: 28618                     Offsets:   
    0 to  511           Dba:0x00406fca  
  5. ---------------------------------------------------------  
  6.  64a20000 ca6f4000 42a30200 00000106 09340000 
    01000000 fb270000 3ca30200  
  7.  00000000 02000300 00000000 01000e00 52000000 
    7b3b8000 18000500 01200000  
  8. …… 

最后退出BBED环境。

  1. BBED> exit 

(6)先使用DBV检查数据文件,检查结果显示有一个损坏的数据块:

  1. [oracle@dbs bbed]$ dbv file=/backup/test/test/system01.dbf  
  2.  
  3. DBVERIFY: Release 10.2.0.1.0 - Production on 
    Tue Apr 29 10:37:41 2008  
  4.  
  5. Copyright (c) 1982, 2005, Oracle.  All rights reserved.  
  6.  
  7. DBVERIFY - Verification starting : FILE =
    /backup/test/test/system01.dbf  
  8. Page 28618 is marked corrupt  
  9. Corrupt block relative dba: 0x00406fca (file 1, block 28618)  
  10. Bad check value found during dbv:  
  11. Data in bad block:  
  12.  type: 6 format: 2 rdba: 0x00406fca  
  13.  last change scn: 0x0000.0002a341 seq: 0x1 flg: 0x04  
  14.  spare1: 0x0 spare2: 0x0 spare3: 0x0  
  15.  consistency value in tail: 0xa3410601  
  16.  check value in block header: 0x3675  
  17.  computed block checksum: 0x1e00  
  18.  
  19.  
  20.  
  21. DBVERIFY - Verification complete  
  22.  
  23. Total Pages Examined         : 38400  
  24. Total Pages Processed (Data) : 11263  
  25. Total Pages Failing   (Data) : 0  
  26. Total Pages Processed (Index): 3243  
  27. Total Pages Failing   (Index): 0  
  28. Total Pages Processed (Other): 1768  
  29. Total Pages Processed (Seg)  : 0  
  30. Total Pages Failing   (Seg)  : 0  
  31. Total Pages Empty            : 22125  
  32. Total Pages Marked Corrupt   : 1  
  33. Total Pages Influx           : 0  
  34. Highest block SCN            : 173409 (0.173409) 

(7)用RMAN工具检查数据文件:

  1. RMAN> backup check logical validate database;  
  2.  
  3. Starting backup at 29-APR-08  
  4. using target database control file instead of recovery catalog  
  5. allocated channel: ORA_DISK_1  
  6. channel ORA_DISK_1: sid=143 devtype=DISK 
  7. channel ORA_DISK_1: starting datafile copy  
  8. input datafile fno=00001 name=/backup/test/test/system01.dbf  
  9. channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:03  
  10. channel ORA_DISK_1: starting datafile copy  
  11. input datafile fno=00002 name=/backup/test/test/undotbs01.dbf  
  12. channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01  
  13. channel ORA_DISK_1: starting datafile copy  
  14. input datafile fno=00003 name=/backup/test/test/sysaux01.dbf  
  15. channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01  
  16. channel ORA_DISK_1: starting datafile copy  
  17. input datafile fno=00004 name=/backup/test/test/users01.dbf  
  18. channel ORA_DISK_1: datafile copy complete, elapsed time: 00:00:01  
  19. Finished backup at 29-APR-08  
  20.  
  21. RMAN> exit 

RMAN的检查结果需要从视图中查看:

  1. SQL> select FILE#,block#,blocks from v$database_block_corruption;  
  2.  
  3. FILE#  BLOCK#  BLOCKS  
  4. ------ ------  -------  
  5. 1      28618   1 

(8)演示ORA-1578错误。现在如果对表test进行全表扫描,就会抛出ORA-1578错误,参数(file# 1,block# 28618)和上面RMAN检查结果一致。

  1. SQL> select * from test;  
  2. select * from test  
  3.          *  
  4. ERROR at line 1:  
  5. ORA-01578: ORACLE data block corrupted 
    (file # 1, block # 28618)  
  6. ORA-01110: data file 1: '/backup/test/test/system01.dbf' 

路过

鸡蛋

鲜花

握手

雷人

评论 (0 个评论)

facelist

您需要登录后才可以评论 登录 | 加入社区

他的关注

意见
反馈