问题12:如何利用oracle bbed 来模拟破坏数据块,并且用RMAN进行恢复?

来源:互联网 发布:在线支付php源码 编辑:程序博客网 时间:2024/05/22 17:20
目的:利用oracle的内部工具bbed来破坏数据块

【说明】
由于linux下利用vi编辑器破坏数据块不总是很有效,用UE(ultraedit)远程ftp破坏数据块又很麻烦,利用一款oracle内部的数据库工具BBED(Block Browser and Edit),修改起来精确无误。

步骤如下:

1. BBED 的安装
进入到 $ORACLE_HOME/rdbms/lib目录下,执行下面的命令:

  1. [oracle@10gr2 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

  2. Linking BBED utility (bbed)
  3. rm -f /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed
  4. gcc -o /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed -L/u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ -L/u01/app/oracle/product/10.2.0/db_1/lib/ -L/u01/app/oracle/product/10.2.0/db_1/lib/stubs/ /u01/app/oracle/product/10.2.0/db_1/lib/s0main.o /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/ssbbded.o /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/sbbdpt.o `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/defopt.o -ldbtools10 -lclntsh `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lmm -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lnro10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/ldflags` -lnsslb10 -lncrypt10 -lnsgr10 -lnzjs10 -ln10 -lnnz10 -lnl10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 -lclient10 -lnnetd10 -lvsn10 -lcommon10 -lgeneric10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lcore10 -lsnls10 -lnls10 -lxml10 -lcore10 -lunls10 -lsnls10 -lnls10 -lcore10 -lnls10 `cat /u01/app/oracle/product/10.2.0/db_1/lib/sysliblist` -Wl,-rpath,/u01/app/oracle/product/10.2.0/db_1/lib -lm `cat /u01/app/oracle/product/10.2.0/db_1/lib/sysliblist` -ldl -lm -L/u01/app/oracle/product/10.2.0/db_1/lib
复制代码
2.确认在该目录下,是否生成了bbed文件:
  1. [oracle@10gr2 lib]$ pwd
  2. /u01/app/oracle/product/10.2.0/db_1/rdbms/lib
  3. [oracle@10gr2 lib]$
  4. [oracle@10gr2 lib]$ ls -l bbed
  5. -rwxr-xr-x 1 oracle oinstall 548768 Sep 3 15:20 bbed
复制代码
3.在lib目录下,创建一个后缀名为.par的参数文件,在应用BBED工具时,一般会用到这个参数
  1. [oracle@10gr2 lib]$ cat bbed_gbminer.par
  2. blocksize=8192
  3. listfile=/u01/oradata/radius/fileunix_gbminer.log
  4. mode=edit
复制代码
【说明】
1).par的参数文件名字可以随便取的
2)文件内容中的listfile后面指定的文件名字、文件的位置也是随便的指定的
4.进入到sqlplus,执行一个如下的查询操作:
  1. SQL> select file#||' '||name||' '||bytes as "Parameter"from v$datafile;

  2. Parameter
  3. ------------------------------------------------
  4. 1 /u01/oradata/radius/system01.dbf 503316480
  5. 2 /u01/oradata/radius/undotbs01.dbf 26214400
  6. 3 /u01/oradata/radius/sysaux01.dbf 251658240
  7. 4 /u01/oradata/radius/users01.dbf 5242880
  8. 5 /u01/oradata/radius/example01.dbf 104857600
复制代码
将以下的内容加入到listfile后面指定的文件中即/u01/oradata/radius/fileunix_gbminer.log
  1. [oracle@10gr2 radius]$ cat fileunix_gbminer.log
  2. 1 /u01/oradata/radius/system01.dbf 503316480
  3. 2 /u01/oradata/radius/undotbs01.dbf 26214400
  4. 3 /u01/oradata/radius/sysaux01.dbf 251658240
  5. 4 /u01/oradata/radius/users01.dbf 5242880
  6. 5 /u01/oradata/radius/example01.dbf 104857600
复制代码
5.创建测试表进行测试(在测试之前用RMAN对数据库进行备份或者说对操作的表空间的数据文件进行备份)
1)创建一张表
  1. <p>SQL> create table test(id number,name char(2000)) tablespace users;</p><p>Table created.</p>
复制代码
2)向表中插入数据并提交
  1. SQL> insert into test values(1,'zhang 1');

  2. 1 row created.

  3. SQL> insert into test values(2,'zhang 2');

  4. 1 row created.

  5. SQL> insert into test values(3,'zhang 3');

  6. 1 row created.

  7. SQL> insert into test values(4,'zhang 4');

  8. 1 row created.

  9. SQL> insert into test values(5,'zhang 5');

  10. 1 row created.

  11. SQL> insert into test values(6,'zhang 6');

  12. 1 row created.

  13. SQL> insert into test values(7,'zhang 7');

  14. 1 row created.

  15. SQL> insert into test values(8,'zhang 8');

  16. 1 row created.

  17. SQL> insert into test values(9,'zhang 9');

  18. 1 row created.

  19. SQL> insert into test values(10,'zhang 10');

  20. 1 row created.

  21. SQL> commit;

  22. Commit complete.
复制代码
3)对表进行分析,并且查看test表所占用的块的个数及每个块中包含的记录的个数
  1. SQL> analyze table test compute statistics;

  2. Table analyzed.

  3. SQL> select blocks from user_tables where table_name = 'TEST';

  4. BLOCKS
  5. ----------
  6. 5

  7. SQL> select dbms_rowid.rowid_relative_fno(rowid) R_FNO,dbms_rowid.rowid_block_number(rowid) b_no,id from test order by 1,2;

  8. R_FNO B_NO ID
  9. ---------- ---------- ----------
  10. 4 404 10
  11. 4 406 1
  12. 4 406 2
  13. 4 406 3
  14. 4 407 4
  15. 4 407 6
  16. 4 407 5
  17. 4 408 8
  18. 4 408 7
  19. 4 408 9

  20. 10 rows selected.
复制代码
分析test表,查询到test表占用了5个数据库块,1 2 3三行记录在第406块内,4 5 6 三行记录在第407块内,基本上是一个块存有三行记录
查看test表的头块:
  1. SQL> select segment_name,header_block from dba_segments where segmenT_name = 'TEST';

  2. SEGMENT_NAME HEADER_BLOCK
  3. -------------------- ------------
  4. TEST 403
复制代码
test表的头块是403
4)登陆BBED
  1. [oracle@10gr2 lib]$ ./bbed parfile=bbed_gbminer.par
  2. Password:

  3. BBED: Release 2.0.0.0.0 - Limited Production on Wed Sep 3 17:41:26 2014

  4. Copyright (c) 1982, 2007, Oracle. All rights reserved.

  5. ************* !!! For Oracle Internal Use only !!! ***************

  6. BBED>
复制代码
【说明】
密码是:blockedit
5)通过set 命令指定数据块
  1. BBED> set dba 4,407
  2. DBA 0x01000197 (16777623 4,407)

  3. BBED> show
  4. FILE# 4
  5. BLOCK# 407
  6. OFFSET 0
  7. DBA 0x01000197 (16777623 4,407)
  8. FILENAME /u01/oradata/radius/users01.dbf
  9. BIFILE bifile.bbd
  10. LISTFILE /u01/oradata/radius/fileunix_gbminer.log
  11. BLOCKSIZE 8192
  12. MODE Edit
  13. EDIT Unrecoverable
  14. IBASE Dec
  15. OBASE Dec
  16. WIDTH 80
  17. COUNT 512
  18. LOGFILE log.bbd
  19. SPOOL No
复制代码
set dba 4,407 这里的4指的是4号文件,就是user01.dbf文件,407指的是包含4 5 6三行数据的数据块
使用find命令查看记录的偏移量
  1. BBED> find /c zhang
  2. File: /u01/oradata/radius/users01.dbf (4)
  3. Block: 407 Offsets: 2170 to 2681 Dba:0x01000197
  4. ------------------------------------------------------------------------
  5. 7a68616e 67203620 20202020 20202020 20202020 20202020 20202020 20202020
  6. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  7. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  8. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  9. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  10. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  11. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  12. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  13. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  14. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  15. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  16. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  17. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  18. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  19. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
  20. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020

  21. <32 bytes per line>
复制代码
这里的偏移量指的是块里面的字节号,一个块有8192个字节,就有8192个偏移量
【说明】
发现偏移量是2170 到2681 就是从第2170字节开始到2681字节
可以在BBED中dump这些字节,看一下内容:
  1. BBED> dump /v dba 4,407 offset 2170 count 64
  2. File: /u01/oradata/radius/users01.dbf (4)
  3. Block: 407 Offsets: 2170 to 2233 Dba:0x01000197
  4. -------------------------------------------------------
  5. 7a68616e 67203620 20202020 20202020 l zhang 6
  6. 20202020 20202020 20202020 20202020 l
  7. 20202020 20202020 20202020 20202020 l
  8. 20202020 20202020 20202020 20202020 l

  9. <16 bytes per line>
复制代码
dump了从2170字节之后的64个字节,发现zhang 6 是第4行数据
因为上面显示的是16进制的,所以两位数代表一个字节,7a就是第2170字节,68就是第2171个字节,以此类推。20代表空格的意思。

因为:
7a 68 616e 67 20 36
Z h a n g 6
之后全是空格,因为char类型的是用空格填满列定义的字节数
用find命令,查找下一个包含zhang的信息
  1. BBED> find
  2. File: /u01/oradata/radius/users01.dbf (4)
  3. Block: 407 Offsets: 4179 to 4242 Dba:0x01000197
  4. ------------------------------------------------------------------------
  5. 7a68616e 67203520 20202020 20202020 20202020 20202020 20202020 20202020
  6. 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020

  7. <32 bytes per line>

  8. BBED> dump /v dba 4,407 offset 4179 count 64
  9. File: /u01/oradata/radius/users01.dbf (4)
  10. Block: 407 Offsets: 4179 to 4242 Dba:0x01000197
  11. -------------------------------------------------------
  12. 7a68616e 67203520 20202020 20202020 l zhang 5
  13. 20202020 20202020 20202020 20202020 l
  14. 20202020 20202020 20202020 20202020 l
  15. 20202020 20202020 20202020 20202020 l

  16. <16 bytes per line>
复制代码
这是第五行数据
我们知道这个块的块头是 第 403块,可以dump一下:
  1. BBED> set dba 4,403
  2. DBA 0x01000193 (16777619 4,403)

  3. BBED> show
  4. FILE# 4
  5. BLOCK# 403
  6. OFFSET 6188
  7. DBA 0x01000193 (16777619 4,403)
  8. FILENAME /u01/oradata/radius/users01.dbf
  9. BIFILE bifile.bbd
  10. LISTFILE /u01/oradata/radius/fileunix_gbminer.log
  11. BLOCKSIZE 8192
  12. MODE Edit
  13. EDIT Unrecoverable
  14. IBASE Dec
  15. OBASE Dec
  16. WIDTH 80
  17. COUNT 64
  18. LOGFILE log.bbd
  19. SPOOL No

  20. BBED> dump /v dba 4,403 offset 1 count 64
  21. File: /u01/oradata/radius/users01.dbf (4)
  22. Block: 403 Offsets: 1 to 64 Dba:0x01000193
  23. -------------------------------------------------------
  24. a2000093 01000176 cb090000 00020447 l ?.....v?.....G
  25. 65000000 00000000 00000000 00000000 l e...............
  26. 00000001 00000008 0000009c 0a000000 l ................
  27. 00000008 00000008 00000099 01000100 l ................

  28. <16 bytes per line>
复制代码
破坏这个块即对这个块进行修改:
  1. <p>BBED> modify /c 12345 dba 4,403 offset 1;
  2. Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
  3. File: /u01/oradata/radius/users01.dbf (4)
  4. Block: 403 Offsets: 1 to 64 Dba:0x01000193
  5. ------------------------------------------------------------------------
  6. 31323334 35000176 cb090000 00020447 65000000 00000000 00000000 00000000
  7. 00000001 00000008 0000009c 0a000000 00000008 00000008 00000099 01000100

  8. <32 bytes per line></p><p>BBED> dump /v dba 4,403 offset 1 count 64
  9. File: /u01/oradata/radius/users01.dbf (4)
  10. Block: 403 Offsets: 1 to 64 Dba:0x01000193
  11. -------------------------------------------------------
  12. 31323334 35000176 cb090000 00020447 l 12345..v?.....G
  13. 65000000 00000000 00000000 00000000 l e...............
  14. 00000001 00000008 0000009c 0a000000 l ................
  15. 00000008 00000008 00000099 01000100 l ................</p><p> <16 bytes per line></p>
复制代码
破坏成功,切换到OS即操作系统利用DBV工具,查看受损的数据块
  1. [oracle@10gr2 radius]$ dbv file=users01.dbf blocksize=8192

  2. DBVERIFY: Release 10.2.0.4.0 - Production on Wed Sep 3 18:32:20 2014

  3. Copyright (c) 1982, 2007, Oracle. All rights reserved.

  4. DBVERIFY - Verification starting : FILE = users01.dbf
  5. Page 403 is marked corrupt
  6. Corrupt block relative dba: 0x01000193 (file 4, block 403)
  7. Bad header found during dbv:
  8. Data in bad block:
  9. type: 35 format: 1 rdba: 0x01003534
  10. last change scn: 0x0000.0009cb76 seq: 0x2 flg: 0x04
  11. spare1: 0x32 spare2: 0x33 spare3: 0x0
  12. consistency value in tail: 0xcb762302
  13. check value in block header: 0x6547
  14. computed block checksum: 0x9495



  15. DBVERIFY - Verification complete

  16. Total Pages Examined : 640
  17. Total Pages Processed (Data) : 58
  18. Total Pages Failing (Data) : 0
  19. Total Pages Processed (Index): 63
  20. Total Pages Failing (Index): 0
  21. Total Pages Processed (Other): 494
  22. Total Pages Processed (Seg) : 0
  23. Total Pages Failing (Seg) : 0
  24. Total Pages Empty : 24
  25. Total Pages Marked Corrupt : 1
  26. Total Pages Influx : 0
  27. Highest block SCN : 641927 (0.641927)
复制代码
通过返回的结果可以知道:4号文件的第403个数据块损坏
Corrupt block relative dba: 0x01000193 (file 4, block 403)

切换到RMAN进行该数据块的恢复:

  1. RMAN> blockrecover datafile 4 block 403;

  2. Starting blockrecover at 03-SEP-14
  3. using target database control file instead of recovery catalog
  4. allocated channel: ORA_DISK_1
  5. channel ORA_DISK_1: sid=142 devtype=DISK

  6. channel ORA_DISK_1: restoring block(s)
  7. channel ORA_DISK_1: specifying block(s) to restore from backup set
  8. restoring blocks of datafile 00004
  9. channel ORA_DISK_1: reading from backup piece /u01/backup/backup_full/full_RADIUS_20140903_1_1
  10. channel ORA_DISK_1: restored block(s) from backup piece 1
  11. piece handle=/u01/backup/backup_full/full_RADIUS_20140903_1_1 tag=TAG20140903T151235
  12. channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01

  13. starting media recovery
  14. media recovery complete, elapsed time: 00:00:03

  15. Finished blockrecover at 03-SEP-14
复制代码
再用DBV工具检查下数据文件:
  1. [oracle@10gr2 radius]$ dbv file=users01.dbf blocksize=8192

  2. DBVERIFY: Release 10.2.0.4.0 - Production on Wed Sep 3 18:35:46 2014

  3. Copyright (c) 1982, 2007, Oracle. All rights reserved.

  4. DBVERIFY - Verification starting : FILE = users01.dbf


  5. DBVERIFY - Verification complete

  6. Total Pages Examined : 640
  7. Total Pages Processed (Data) : 58
  8. Total Pages Failing (Data) : 0
  9. Total Pages Processed (Index): 63
  10. Total Pages Failing (Index): 0
  11. Total Pages Processed (Other): 495
  12. Total Pages Processed (Seg) : 0
  13. Total Pages Failing (Seg) : 0
  14. Total Pages Empty : 24
  15. Total Pages Marked Corrupt : 0
  16. Total Pages Influx : 0
  17. Highest block SCN : 641927 (0.641927)
复制代码
【说明】
RMAN恢复损坏的数据块成功!


--END--
0 0