目的:利用oracle的内部工具bbed来破坏数据块
【说明】
由于linux下利用vi编辑器破坏数据块不总是很有效,用UE(ultraedit)远程ftp破坏数据块又很麻烦,利用一款oracle内部的数据库工具BBED(Block Browser and Edit),修改起来精确无误。
步骤如下:
1. BBED 的安装
进入到 $ORACLE_HOME/rdbms/lib目录下,执行下面的命令:
复制代码
2.确认在该目录下,是否生成了bbed文件:
复制代码
3.在lib目录下,创建一个后缀名为.par的参数文件,在应用BBED工具时,一般会用到这个参数
复制代码
【说明】
1).par的参数文件名字可以随便取的
2)文件内容中的listfile后面指定的文件名字、文件的位置也是随便的指定的
4.进入到sqlplus,执行一个如下的查询操作:
复制代码
将以下的内容加入到listfile后面指定的文件中即/u01/oradata/radius/fileunix_gbminer.log
复制代码
5.创建测试表进行测试(在测试之前用RMAN对数据库进行备份或者说对操作的表空间的数据文件进行备份)
1)创建一张表
复制代码
2)向表中插入数据并提交
复制代码
3)对表进行分析,并且查看test表所占用的块的个数及每个块中包含的记录的个数
复制代码
分析test表,查询到test表占用了5个数据库块,1 2 3三行记录在第406块内,4 5 6 三行记录在第407块内,基本上是一个块存有三行记录
查看test表的头块:
复制代码
test表的头块是403
4)登陆BBED
复制代码
【说明】
密码是:blockedit
5)通过set 命令指定数据块
复制代码
set dba 4,407 这里的4指的是4号文件,就是user01.dbf文件,407指的是包含4 5 6三行数据的数据块
使用find命令查看记录的偏移量
复制代码
这里的偏移量指的是块里面的字节号,一个块有8192个字节,就有8192个偏移量
【说明】
发现偏移量是2170 到2681 就是从第2170字节开始到2681字节
可以在BBED中dump这些字节,看一下内容:
复制代码
dump了从2170字节之后的64个字节,发现zhang 6 是第4行数据
因为上面显示的是16进制的,所以两位数代表一个字节,7a就是第2170字节,68就是第2171个字节,以此类推。20代表空格的意思。
因为:
之后全是空格,因为char类型的是用空格填满列定义的字节数。
用find命令,查找下一个包含zhang的信息
复制代码
这是第五行数据
我们知道这个块的块头是 第 403块,可以dump一下:
复制代码
破坏这个块即对这个块进行修改:
复制代码
破坏成功,切换到OS即操作系统利用DBV工具,查看受损的数据块
复制代码
通过返回的结果可以知道:4号文件的第403个数据块损坏
Corrupt block relative dba: 0x01000193 (file 4, block 403)
切换到RMAN进行该数据块的恢复:
复制代码
再用DBV工具检查下数据文件:
复制代码
【说明】
RMAN恢复损坏的数据块成功!
--END--
【说明】
由于linux下利用vi编辑器破坏数据块不总是很有效,用UE(ultraedit)远程ftp破坏数据块又很麻烦,利用一款oracle内部的数据库工具BBED(Block Browser and Edit),修改起来精确无误。
步骤如下:
1. BBED 的安装
进入到 $ORACLE_HOME/rdbms/lib目录下,执行下面的命令:
- [oracle@10gr2 lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed
- Linking BBED utility (bbed)
- rm -f /u01/app/oracle/product/10.2.0/db_1/rdbms/lib/bbed
- 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
- [oracle@10gr2 lib]$ pwd
- /u01/app/oracle/product/10.2.0/db_1/rdbms/lib
- [oracle@10gr2 lib]$
- [oracle@10gr2 lib]$ ls -l bbed
- -rwxr-xr-x 1 oracle oinstall 548768 Sep 3 15:20 bbed
- [oracle@10gr2 lib]$ cat bbed_gbminer.par
- blocksize=8192
- listfile=/u01/oradata/radius/fileunix_gbminer.log
- mode=edit
1).par的参数文件名字可以随便取的
2)文件内容中的listfile后面指定的文件名字、文件的位置也是随便的指定的
4.进入到sqlplus,执行一个如下的查询操作:
- SQL> select file#||' '||name||' '||bytes as "Parameter"from v$datafile;
- Parameter
- ------------------------------------------------
- 1 /u01/oradata/radius/system01.dbf 503316480
- 2 /u01/oradata/radius/undotbs01.dbf 26214400
- 3 /u01/oradata/radius/sysaux01.dbf 251658240
- 4 /u01/oradata/radius/users01.dbf 5242880
- 5 /u01/oradata/radius/example01.dbf 104857600
- [oracle@10gr2 radius]$ cat fileunix_gbminer.log
- 1 /u01/oradata/radius/system01.dbf 503316480
- 2 /u01/oradata/radius/undotbs01.dbf 26214400
- 3 /u01/oradata/radius/sysaux01.dbf 251658240
- 4 /u01/oradata/radius/users01.dbf 5242880
- 5 /u01/oradata/radius/example01.dbf 104857600
1)创建一张表
- <p>SQL> create table test(id number,name char(2000)) tablespace users;</p><p>Table created.</p>
- SQL> insert into test values(1,'zhang 1');
- 1 row created.
- SQL> insert into test values(2,'zhang 2');
- 1 row created.
- SQL> insert into test values(3,'zhang 3');
- 1 row created.
- SQL> insert into test values(4,'zhang 4');
- 1 row created.
- SQL> insert into test values(5,'zhang 5');
- 1 row created.
- SQL> insert into test values(6,'zhang 6');
- 1 row created.
- SQL> insert into test values(7,'zhang 7');
- 1 row created.
- SQL> insert into test values(8,'zhang 8');
- 1 row created.
- SQL> insert into test values(9,'zhang 9');
- 1 row created.
- SQL> insert into test values(10,'zhang 10');
- 1 row created.
- SQL> commit;
- Commit complete.
- SQL> analyze table test compute statistics;
- Table analyzed.
- SQL> select blocks from user_tables where table_name = 'TEST';
- BLOCKS
- ----------
- 5
- 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;
- R_FNO B_NO ID
- ---------- ---------- ----------
- 4 404 10
- 4 406 1
- 4 406 2
- 4 406 3
- 4 407 4
- 4 407 6
- 4 407 5
- 4 408 8
- 4 408 7
- 4 408 9
- 10 rows selected.
查看test表的头块:
- SQL> select segment_name,header_block from dba_segments where segmenT_name = 'TEST';
- SEGMENT_NAME HEADER_BLOCK
- -------------------- ------------
- TEST 403
4)登陆BBED
- [oracle@10gr2 lib]$ ./bbed parfile=bbed_gbminer.par
- Password:
- BBED: Release 2.0.0.0.0 - Limited Production on Wed Sep 3 17:41:26 2014
- Copyright (c) 1982, 2007, Oracle. All rights reserved.
- ************* !!! For Oracle Internal Use only !!! ***************
- BBED>
密码是:blockedit
5)通过set 命令指定数据块
- BBED> set dba 4,407
- DBA 0x01000197 (16777623 4,407)
- BBED> show
- FILE# 4
- BLOCK# 407
- OFFSET 0
- DBA 0x01000197 (16777623 4,407)
- FILENAME /u01/oradata/radius/users01.dbf
- BIFILE bifile.bbd
- LISTFILE /u01/oradata/radius/fileunix_gbminer.log
- BLOCKSIZE 8192
- MODE Edit
- EDIT Unrecoverable
- IBASE Dec
- OBASE Dec
- WIDTH 80
- COUNT 512
- LOGFILE log.bbd
- SPOOL No
使用find命令查看记录的偏移量
- BBED> find /c zhang
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 407 Offsets: 2170 to 2681 Dba:0x01000197
- ------------------------------------------------------------------------
- 7a68616e 67203620 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- <32 bytes per line>
【说明】
发现偏移量是2170 到2681 就是从第2170字节开始到2681字节
可以在BBED中dump这些字节,看一下内容:
- BBED> dump /v dba 4,407 offset 2170 count 64
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 407 Offsets: 2170 to 2233 Dba:0x01000197
- -------------------------------------------------------
- 7a68616e 67203620 20202020 20202020 l zhang 6
- 20202020 20202020 20202020 20202020 l
- 20202020 20202020 20202020 20202020 l
- 20202020 20202020 20202020 20202020 l
- <16 bytes per line>
因为上面显示的是16进制的,所以两位数代表一个字节,7a就是第2170字节,68就是第2171个字节,以此类推。20代表空格的意思。
因为:
7a 68 616e 67 20 36
Z h a n g 6
之后全是空格,因为char类型的是用空格填满列定义的字节数。
用find命令,查找下一个包含zhang的信息
- BBED> find
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 407 Offsets: 4179 to 4242 Dba:0x01000197
- ------------------------------------------------------------------------
- 7a68616e 67203520 20202020 20202020 20202020 20202020 20202020 20202020
- 20202020 20202020 20202020 20202020 20202020 20202020 20202020 20202020
- <32 bytes per line>
- BBED> dump /v dba 4,407 offset 4179 count 64
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 407 Offsets: 4179 to 4242 Dba:0x01000197
- -------------------------------------------------------
- 7a68616e 67203520 20202020 20202020 l zhang 5
- 20202020 20202020 20202020 20202020 l
- 20202020 20202020 20202020 20202020 l
- 20202020 20202020 20202020 20202020 l
- <16 bytes per line>
我们知道这个块的块头是 第 403块,可以dump一下:
- BBED> set dba 4,403
- DBA 0x01000193 (16777619 4,403)
- BBED> show
- FILE# 4
- BLOCK# 403
- OFFSET 6188
- DBA 0x01000193 (16777619 4,403)
- FILENAME /u01/oradata/radius/users01.dbf
- BIFILE bifile.bbd
- LISTFILE /u01/oradata/radius/fileunix_gbminer.log
- BLOCKSIZE 8192
- MODE Edit
- EDIT Unrecoverable
- IBASE Dec
- OBASE Dec
- WIDTH 80
- COUNT 64
- LOGFILE log.bbd
- SPOOL No
- BBED> dump /v dba 4,403 offset 1 count 64
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 403 Offsets: 1 to 64 Dba:0x01000193
- -------------------------------------------------------
- a2000093 01000176 cb090000 00020447 l ?.....v?.....G
- 65000000 00000000 00000000 00000000 l e...............
- 00000001 00000008 0000009c 0a000000 l ................
- 00000008 00000008 00000099 01000100 l ................
- <16 bytes per line>
- <p>BBED> modify /c 12345 dba 4,403 offset 1;
- Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 403 Offsets: 1 to 64 Dba:0x01000193
- ------------------------------------------------------------------------
- 31323334 35000176 cb090000 00020447 65000000 00000000 00000000 00000000
- 00000001 00000008 0000009c 0a000000 00000008 00000008 00000099 01000100
- <32 bytes per line></p><p>BBED> dump /v dba 4,403 offset 1 count 64
- File: /u01/oradata/radius/users01.dbf (4)
- Block: 403 Offsets: 1 to 64 Dba:0x01000193
- -------------------------------------------------------
- 31323334 35000176 cb090000 00020447 l 12345..v?.....G
- 65000000 00000000 00000000 00000000 l e...............
- 00000001 00000008 0000009c 0a000000 l ................
- 00000008 00000008 00000099 01000100 l ................</p><p> <16 bytes per line></p>
- [oracle@10gr2 radius]$ dbv file=users01.dbf blocksize=8192
- DBVERIFY: Release 10.2.0.4.0 - Production on Wed Sep 3 18:32:20 2014
- Copyright (c) 1982, 2007, Oracle. All rights reserved.
- DBVERIFY - Verification starting : FILE = users01.dbf
- Page 403 is marked corrupt
- Corrupt block relative dba: 0x01000193 (file 4, block 403)
- Bad header found during dbv:
- Data in bad block:
- type: 35 format: 1 rdba: 0x01003534
- last change scn: 0x0000.0009cb76 seq: 0x2 flg: 0x04
- spare1: 0x32 spare2: 0x33 spare3: 0x0
- consistency value in tail: 0xcb762302
- check value in block header: 0x6547
- computed block checksum: 0x9495
- DBVERIFY - Verification complete
- Total Pages Examined : 640
- Total Pages Processed (Data) : 58
- Total Pages Failing (Data) : 0
- Total Pages Processed (Index): 63
- Total Pages Failing (Index): 0
- Total Pages Processed (Other): 494
- Total Pages Processed (Seg) : 0
- Total Pages Failing (Seg) : 0
- Total Pages Empty : 24
- Total Pages Marked Corrupt : 1
- Total Pages Influx : 0
- Highest block SCN : 641927 (0.641927)
Corrupt block relative dba: 0x01000193 (file 4, block 403)
切换到RMAN进行该数据块的恢复:
- RMAN> blockrecover datafile 4 block 403;
- Starting blockrecover at 03-SEP-14
- using target database control file instead of recovery catalog
- allocated channel: ORA_DISK_1
- channel ORA_DISK_1: sid=142 devtype=DISK
- channel ORA_DISK_1: restoring block(s)
- channel ORA_DISK_1: specifying block(s) to restore from backup set
- restoring blocks of datafile 00004
- channel ORA_DISK_1: reading from backup piece /u01/backup/backup_full/full_RADIUS_20140903_1_1
- channel ORA_DISK_1: restored block(s) from backup piece 1
- piece handle=/u01/backup/backup_full/full_RADIUS_20140903_1_1 tag=TAG20140903T151235
- channel ORA_DISK_1: block restore complete, elapsed time: 00:00:01
- starting media recovery
- media recovery complete, elapsed time: 00:00:03
- Finished blockrecover at 03-SEP-14
- [oracle@10gr2 radius]$ dbv file=users01.dbf blocksize=8192
- DBVERIFY: Release 10.2.0.4.0 - Production on Wed Sep 3 18:35:46 2014
- Copyright (c) 1982, 2007, Oracle. All rights reserved.
- DBVERIFY - Verification starting : FILE = users01.dbf
- DBVERIFY - Verification complete
- Total Pages Examined : 640
- Total Pages Processed (Data) : 58
- Total Pages Failing (Data) : 0
- Total Pages Processed (Index): 63
- Total Pages Failing (Index): 0
- Total Pages Processed (Other): 495
- Total Pages Processed (Seg) : 0
- Total Pages Failing (Seg) : 0
- Total Pages Empty : 24
- Total Pages Marked Corrupt : 0
- Total Pages Influx : 0
- Highest block SCN : 641927 (0.641927)
RMAN恢复损坏的数据块成功!
--END--