oracle BBED 直接修改数据库block块

 

[b]bbed就是英文block browse block edit的缩写,用来直接查看和修改数据文件数据的一个工具。[/b]

 

新建一个表,插入5条测试数据:

 

create table chenlintest (id number(5) , name varchar(10))  tablespace users;

SQL> insert into chenlintest values(1,'aa');

1 row created.

SQL> insert into chenlintest values (888 ,'chenlin') ;

1 row created.

SQL> insert into chenlintest values (999 ,'china') ;

1 row created.

SQL> insert into chenlintest values (999 ,'usa') ;

1 row created.

SQL> insert into chenlintest values (1001 ,'sydney') ;

1 row created.

Commit complete.

 

SQL> select * from chenlintest ;

        ID NAME

---------- ----------

         1 aa

       999 usa

      1001 sydney

       888 chenlin

       999 china

 

 

SQL> SELECT 

         dbms_rowid.rowid_relative_fno(rowid) REL_FNO,

         dbms_rowid.rowid_block_number(rowid) BLOCKNO,

         dbms_rowid.rowid_row_number(rowid) ROWNO,

         id,namefrom chenlintest;

 

   REL_FNO    BLOCKNO      ROWNO         ID NAME

---------- ---------- ---------- ---------- ----------

        4     234300          0          1 aa

         4     234300          1        999 usa

         4     234300          2       1001 sydney

         4     234300          3        888 chenlin

         4     234300          4        999 china

 

 

通过上面的sql语句可以看出,chenlintest这个表的所有数据都在第4号文件的第234300个block块上。

 

现在我们尝试去修改 aa ,也就是第一行。

 

设置bbed 的 2个配置文件,

[b]一个是 file.txt文件[/b]:

这个文件对应的3个列为,file_id,path,block_size,可以使用SQL生成:

select file#||' '||name||' '||bytes from v$datafile ;

 

[oracle@dell1 home]$ /home/oracle> cat file.txt 

 

1 /opt/oracle/oradata/ge01/system01.dbf 870318080

2 /opt/oracle/oradata/ge01/users_cms.dbf 524288000

3 /opt/oracle/oradata/ge01/sysaux01.dbf 1866465280

4 /opt/oracle/oradata/ge01/users01.dbf 18971361280

5 /opt/oracle/oradata/ge01/users02.dbf 1073741824

6 /opt/oracle/oradata/ge01/perstat.dbf 209715200

7 /opt/oracle/oradata/ge01/undotbs02.dbf 1073741824

8 /opt/oracle/oradata/ge01/ttuser.dbf 41943040

9 /opt/oracle/oradata/ge01/idx_2k 20971520

 

[b]

一个是bbed.txt:

 

这个文件是bbed的配置文件,配置了blocksize,listfile,mode 三个参数,我们在启动的时候,使用这个文件把bbed拉起来[/b]。

 

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE

----------------------------- ----------- -------------

db_block_size                        integer     8192

SQL> 

 

[oracle@dell1 home]$ cat bbed.txt 

blocksize=8192

listfile=/home/oracle/file.txt

mode=edit 

 

/*

mode=edit  默认是borwser 浏览模式 

可以使用 set mode edit 来切换

*/

 

-- bbed的安装

 

cd $ORACLE_HOME/rdbms/lib

make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

*/

-- 进入bbed

[oracle@dell1 home]$./bbed parfile=/home/oracle/bbed.txt  或者直接是 ./bbed

[oracle@dell1 lib]$ pwd

/opt/oracle/product/10g/rdbms/lib

[oracle@dell1 lib]$ ll | grep bbed

-rwxr-xr-x 1 oracle oinstall  536154 May 14 14:47 bbed

 

[oracle@dell1 lib]$ 

[oracle@dell1 lib]$ ./bbed

Password: blockedit

BBED: Release 2.0.0.0.0 - Limited Production on Mon May 14 17:45:20 2012

Copyright (c) 1982, 2005, Oracle.  All rights reserved.

************* !!! For Oracle Internal Use only !!! ***************

 

BBED>  help all   查看所有命令帮助

[b]最常用的有show , map , dump  ,set dba , set file ,set  block  等 

下面是几个常用的:

set 设定当前的环境

show 查看当前的环境参数,跟sqlplus的同名命令类似。

dump 列出指定block的内容

find 在指定的block中查找指定的字符串,结果是显示出字符串,及其偏移量--offset,偏移量就是在block中的字节数

modify 修改指定block的指定偏移量的值,可以在线修改。

copy 把一个block的内容copy到另一个block中

verify 检查当前环境是否有坏块

sum 计算block的checksum,modify之后block就被标识为坏块,current checksum与reqired checksum不一致,sum命令可以计算出新的checksum并应用到当前块。

undo 回滚当前的修改操作,如果手误做错了,undo一下就ok了,回到原来的状态。

revert 回滚所有之前的修改操作,意思就是 undo all[/b]

 

BBED> show

 

        FILE#           0

        BLOCK#          1

        OFFSET          0

        DBA             0x00000000 (0 0,1)

        FILENAME       

        BIFILE          bifile.bbd

        LISTFILE       

        BLOCKSIZE       8192

        MODE            Browse

        EDIT            Unrecoverable

        IBASE           Dec

        OBASE           Dec

        WIDTH           80

        COUNT           512

        LOGFILE         log.bbd

        SPOOL           No

 

BBED> set file 4 

 

BBED-00312: no LISTFILE specified  /*  LISTFILE为空,说明我们刚刚新建的 file.txt未正确引入进来 */

 

BBED> set list '/home/oracle/file.txt'

      LISTFILE   /home/oracle/file.txt

 

BBED> info

 File#  Name                                                        Size(blks)

 -----  ----                                                        ----------

     1  /opt/oracle/oradata/ge01/system01.dbf                           106240

     2  /opt/oracle/oradata/ge01/users_cms.dbf                           64000

     3  /opt/oracle/oradata/ge01/sysaux01.dbf                           227840

     4  /opt/oracle/oradata/ge01/users01.dbf                            524287

     5  /opt/oracle/oradata/ge01/users02.dbf                            131072

     6  /opt/oracle/oradata/ge01/perstat.dbf                             25600

     7  /opt/oracle/oradata/ge01/undotbs02.dbf                          131072

     8  /opt/oracle/oradata/ge01/ttuser.dbf                               5120

     9  /opt/oracle/oradata/ge01/idx_2k                                   2560

 

BBED> set file 4

        FILE#           4

--4号文件为 /opt/oracle/oradata/ge01/users01.dbf 

 

BBED> set block 234300

        BLOCK#          234300

 

BBED> set block +10

        BLOCK#          234310

 

BBED> set block -10

        BLOCK#          234300

 

--偏移量是相对某个block里的偏移量,可以用+和-进行操作

 

 

还有很多种,不多写了,参见:[url]http://blog.csdn.net/tianlesoftware/article/details/5006580[/url]

 

BBED> map

 File: /opt/oracle/oradata/ge01/users01.dbf (4)

 Block: 234300                                Dba:0x0103933c

------------------------------------------------------------

 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[5]                                @118     

 ub1 freespace[7980]                        @128     

 ub1 rowdata[80]                            @8108    

 ub4 tailchk                                @8188 

 

 

 通过map之后,可以看出真正block的结构体系, 块中的存储是由下往上存储的,( @ 表示偏移量 ),

 

 freespace 在真正的行数据 rowdata 之上,这个@8108开始,到@8188 ,后面放的是数据内容。

 

 我们上面说过的,要改的aa数据就在这2个偏移量中。

 

BBED> set offset 8108

        OFFSET          8108

BBED> dump /v  --查看offset 为8180 -8192的数据值

 

 File: /opt/oracle/oradata/ge01/users01.dbf (4)

 Block: 234300  Offsets: 8108 to 8191  Dba:0x0103933c

-------------------------------------------------------

 2c020203 c20b0206 7379646e 65792c02 l ,.......sydney,.

 0203c20a 64037573 612c0202 03c20a64 l ....d.usa,.....d

 05636869 6e612c00 0203c209 59076368 l .china,.....Y.ch

 656e6c69 6e3c0202 02c10402 63633c02 l enlin<......cc<.

 0202c103 0262622c 000202c1 02026161 l .....bb,......aa

 04066fe1                            l ..o.

 <16 bytes per line>

 

 

[oracle@dell1 home]$ select dump('aa',1016) from dual;

 

 DUMP('AA',1016)

-----------------------------------------------------------------------------

 Typ=96 Len=2 CharacterSet=US7ASCII: 61,61

 

 

可以使用fild查找:

在find之前先设置想要查找的 file 和 block,默认是十进制的ascii编码,/x 表示16进制,find的结果显示出offset,即字符出现的位置。

 

通过find查找,“aa”的位置,我们发现6161就是 aa

 

如果还不确认,可以通过dump来实现 

 

第一种find方法:

 

BBED> find   /x 6161 curr 

 

 File: /opt/oracle/oradata/ge01/users01.dbf (4)

 Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

------------------------------------------------------------------------

 61610406 6fe1 

 <32 bytes per line>

 

第二种find方法:

BBED> 

BBED>  find /c aa 

 File: /opt/oracle/oradata/ge01/users01.dbf (4)

 Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

------------------------------------------------------------------------

 61610406 6fe1 

 <32 bytes per line>

 

 

 通过这2种方法,找到并确认 aa 在 8186 和 8191之间,下面试试修改他,把 aa 改成 bb

 

BBED> modify /c abcdefg

BBED-00215: editing not allowed in BROWSE mode

BBED> set mode edit

        MODE            Edit

 

BBED> modify /c bb  ([b]注意长度,不能超过建表时候设置的长度,否则会出错[/b])

 

Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y

 File: /opt/oracle/oradata/ge01/users01.dbf (4)

 Block: 234300           Offsets: 8186 to 8191           Dba:0x0103933c

------------------------------------------------------------------------

 61626364 6566 

 <32 bytes per line>

--让 oracle进行checksum操作

BBED>  sum dba 4,234300 

Check value for File 4, Block 234300:

current = 0xd268, required = 0x3405

--直接应用

BBED>  sum dba 4,234300 apply ;

Check value for File 4, Block 234300:

current = 0x3405, required = 0x3405

 

--验证是否修改成功

 

BBED> verify

DBVERIFY - Verification starting

FILE = /opt/oracle/oradata/ge01/users01.dbf

BLOCK = 234300

 

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

[b]Total Blocks Marked Corrupt   : 0[/b]

Total Blocks Influx           : 0

 

/*

Total Blocks Marked Corrupt   : 0,表示木有错误

在实际工作当中,如果发现修改错误了,则可以通过undo,revert进行回滚操作。

在上面最常用的基本命令里面讲过了, 请注意undo和 revert的区别。

*/ 

 

SQL> select * from chenlintest ;

         ID NAME

---------- ----------

         1 aa

       999 usa

      1001 sydney

       888 chenlin

       999 china

 

 

--发现没有变化,考虑是否需要清空buffer cache

 

SQL> alter system flush buffer_cache;

 

System altered.

 

SQL> select * from chenlintest ;

        ID NAME

---------- ----------

         1 bb

       999 usa

      1001 sydney

       888 chenlin

       999 china

 

打完收工,下一次继续写当数据库,由于某个数据文件不一致,启动不来的时,改怎么样去修改datafile header的 SCN 号。使其和控制文件的SCN号一致!

 
posted @ 2013-03-25 21:37  wilson.han  阅读(402)  评论(0编辑  收藏  举报