oracle BBED 直接修改数据库block块

--将lib中bbedus.msb和bbedus.msg 放在$ORACLE_HOME/rdbms/mesg下

--将lib中sbbdpt.o和ssbbded.o 放在$ORACLE_HOME/rdbms/lib下

--在$ORACLE_HOME/rdbms/lib下执行:[[email protected] lib]$ make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed

执行后会在lib下生成一个bbed可执行文件

默认密码;

blockedit

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

新建一个表,插入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,

user_id,username from t

where rownum <6;

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个配置文件,

一个是 file.txt文件:

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

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

[[email protected] 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

一个是bbed.txt:

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

SQL> show parameter db_block_size

NAME                                 TYPE        VALUE

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

db_block_size                        integer     8192

SQL>

[[email protected] 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

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

[[email protected] lib]$ pwd

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

[[email protected] lib]$ ll | grep bbed

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

[[email protected] lib]$

[[email protected] 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   查看所有命令帮助

最常用的有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

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里的偏移量,可以用+和-进行操作

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

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>

[email protected]> select dump(‘aa‘,1016) from dual;

DUMP(‘AA‘,1016)

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

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

在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  (注意长度,不能超过建表时候设置的长度,否则会出错)

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

Total Blocks Marked Corrupt   : 0

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号一致!

时间: 2024-10-07 16:17:41

oracle BBED 直接修改数据库block块的相关文章

oracle BBED 直接改动数据库block块

1.BBED配置 1)将相应文件放到$ORACLE_HOME/rdbms/mesg和$ORACLE_HOME/rdbms/lib中: --将lib中bbedus.msb和bbedus.msg 放在$ORACLE_HOME/rdbms/mesg下 --将lib中sbbdpt.o和ssbbded.o 放在$ORACLE_HOME/rdbms/lib下 2)安装BBED --在$ORACLE_HOME/rdbms/lib下运行: [[email protected] lib]$ make -f ins

Oracle导库,修改数据库文件

前一阵子,做oracle数据库的还原.因为是菜鸟,没用过oracle数据库.所以好多地方都不知道如何下手. 在sql server 中数据库的还原,无非就是附加数据库 .或者使用脚本来还原. 但是在oracle中数据库的还原,就没有这些可视化的工具了(自己装的客户端不算).在安装oracle服务端之后,数据库的还原必须使用dos命令行操作. oracle不懂,公司没网.然后就仅凭手机的那一丢丢流量,学习如何导库. -- 经过不懈努力,终于可以导入了. 可以导入了,但还没导入完.接下来,就出现以下

Oracle bbed 实用示例-----修改Data内容、恢复delete的rows

bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db. 这样避免checkpoint 进程重写bbed 对block 的修改. 也避免oracle 在bbed 修改完成之前读block 或者申明block 为corrupt. 一. 示例: 修改Data内容 1.1连接bbed [[email protected] ~]$ bbed parfile=/u01/app/oracle/bbed/bbed.par Password: BBED: Relea

12 oracle 数据库坏块--物理坏块-ORA-01578/ORA-01110

oracle 数据库坏块--物理坏块 数据坏块的类型物理坏块:通常是由于硬件损坏如磁盘异常导致.内存有问题.存储链有问题. IO有问题.文件系统有问题. Oracle本身的问题等逻辑坏块:可能都是软件问题导致通常是由于oracle bug导致,比如data block和index block数据不一致第三方软件或者硬件造成的物理损坏物理数据坏块的场景常见的物理坏块(Physical Block Corruptions)有块头和块尾信息不一致(Fractured/Incomplete),check

对Oracle数据库坏块的理解

1.物理坏块和逻辑坏块 在数据库中有一个概念叫做数据块的一致性,Oracle的数据块的一致性包括了两个层次:物理一致性和逻辑一致性,如果一个数据块在这两个层次上存在不一致性,那就对应到了我们今天要要说的物理坏块和逻辑坏块. 在每一个数据块的头部有一个校验和字段,每当数据块要被写回磁盘前,Oracle都会重新计算 这个数据块的校验和,并记录到这个字段最终写会磁盘.下次数据块被读入内存,Oracle会重新 计算数据块的校验和,并和块头的字段相比较,如果有差异,Oracle就知道这个数据块有错误, 会

Oracle bbed 实用示例-----File Header Reset

一.查看当前环境 1.1 当前控制文件中的SCN号 [[email protected] ~]$ sqlplus /nolog SQL*Plus: Release 10.2.0.1.0 - Production on Sat Jan 17 10:11:34 2015 Copyright (c) 1982, 2005, Oracle. All rights reserved. SQL> conn /as sysdba Connected. SQL> col name format a65 SQL

Oracle bbed使用说明2---常用命令

一.BBED常用命令说明 先看帮助的说明 BBED> help all SET DBA [ dba | file#, block# ] SET FILENAME 'filename' SET FILE file# SET BLOCK [+/-]block# SET OFFSET [ [+/-]byte offset | symbol | *symbol ] SET BLOCKSIZE bytes SET LIST[FILE] 'filename' SET WIDTH character_coun

Oracle &nbsp; bbed 使用

1:安装: 11g R2 版的 cd $ORACLE_HOME/ find . -name ins_rdbms.mk cd rdbms/lib make -f ins_rdbms.mk $ORACLE_HOME/rdbms/lib/bbed 在11g会报错.需要在网上下载三个文件.或者你有10g 的库直接把10g的文件拷过来: 附上下载地址: http://download.csdn.net/detail/jycjyc/4578006 将下载到的bbedus.msb拷贝到上一级目录mesg中 

Oracle Form开发应用之Data Block级别的主要属性

项目(英文)  项目(中文) 说明 General 常规 * Name 名称  Data Block 名称 eg:BLK_NAME  * Subclass Information   子类信息  设定Property class eg:BLOCK Navigation 导航  * Navigation Style  导航器风格  当光标到记录的最后一个item后  Same Recorde: 返回到第一个Item  Change Recorde: 转到下一个Recorde的第一个Item  Ch