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: Release 2.0.0.0.0 - Limited Production on Thu Jan 15 17:27:30 2015

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

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

BBED> 

1.2查看要修改的内容

SQL> conn tv/tv
Connected.
SQL> select * from t01 where name=‘zz‘;

no rows selected

SQL> select * from t01 where name=‘ww‘;

        ID NAME
---------- --------------------------------
         1 ww

SQL>
注意: bbed 的修改仅仅是对原有位置内容的一个替换

1.3 对应block 的信息如下

SQL> select
  2     rowid,
  3     dbms_rowid.rowid_relative_fno(rowid)rel_fno, --当数据库文件数小于1024时,rel_fno和file id是相同的
  4     dbms_rowid.rowid_block_number(rowid)blockno,
  5     dbms_rowid.rowid_row_number(rowid) rowno
  6  from t01
  7  where name=‘ww‘;

ROWID                 REL_FNO    BLOCKNO      ROWNO
------------------ ---------- ---------- ----------
AAAMfRAAFAAAAy0AFM          5       3252        332

SQL> 

1.4 设置当前文件及数据块

BBED> set dba 5,3252 offset 0
        DBA             0x01400cb4 (20974772 5,3252)
        OFFSET          0
或

BBED> set file 5
        FILE#           5
BBED> set block 3252
        BLOCK#          3252
BBED>

1.5 查找关键字ww,确定其在block中的偏移量offset

BBED> find /c ww
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252             Offsets: 5530 to 6041           Dba:0x01400cb4
------------------------------------------------------------------------
 77772c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002 

 <32 bytes per line>

BBED>

1.6 dump数据块的内容

BBED> dump /v dba 5,3252 offset 5530 count 128
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252    Offsets: 5530 to 5657  Dba:0x01400cb4
-------------------------------------------------------
 77772c00 02018002 79792c00 02018002 l ww,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....

 <16 bytes per line>

BBED>

注意这里面的Offsets:5530 to 5657, 它指的是这一行的一个地址。其中

第一个w 的offset 是5530   即dump出的第一个77
第二个w 的offset 是5531   即dump出的第二个77

1.7 修改block,将ww 换成xz

BBED> modify /c xz dba 5,3252 offset 5530
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252             Offsets: 5530 to 5657           Dba:0x01400cb4
------------------------------------------------------------------------
 787a2c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002 

 <32 bytes per line>

--dump修改后的数据
BBED> dump /v dba 5,3252 offset 5530 count 128
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252    Offsets: 5530 to 5657  Dba:0x01400cb4
-------------------------------------------------------
 787a2c00 02018002 79792c00 02018002 l xz,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....
 79792c00 02018002 79792c00 02018002 l yy,.....yy,.....

 <16 bytes per line>

BBED>

1.8 应用变更

BBED> sum dba 5,3252 apply
Check value for File 5, Block 3252:
current = 0x5730, required = 0x5730

BBED>

1.9 回到sql窗口 刷新缓存,查看修改后的数据

SQL> alter system flush buffer_cache;

System altered.

SQL> select * from tv.t01 where name=‘ww‘;

no rows selected

SQL> select * from tv.t01 where name=‘xz‘;

        ID NAME
---------- --------------------------------
         1 xz

SQL> 

注:由于是实验,修改数据时并没有关闭数据库

二. 示例:恢复delete 的rows

  当row 被delete 的时候,实际上data 并没有被remove,只是将该row 标记为delete,然后其对应的空间被统计为free space。 row 的status 存在每个row的row header里。Row Header 包含Row Flag,Lock Byte(ITL)和column Count。Row Header 结构:


名称


长度


注释


Row Flag


1字节


行状态标志


Lock Byte(ITL)


1字节


同ITL 的lck相对应 表示这行是否被 lock 了


column Count


1字节


同ITL 的lck相对应 表示这行是否被 lock 了

其中Row Flag占用1个byte,并且以bitmask 来保存。bitmask 的解释如下:


Cluster Key


K


128


Cluster Table Member


C


64


Head of row piece


H


32


Deleted


D


16


First data piece


F


8


Last data piece


L


4


1st Column continues from previous piece


P


2


Last column continues in next piece


N


1

2.1 dump 一个block,看一个row Flag

SQL> conn /as sysdba
Connected.
SQL> alter system dump datafile 5 block 3252;

System altered.

SQL> oradebug setmypid
Statement processed.
SQL> oradebug tracefile_name
/u01/app/oracle/admin/orcl/udump/orcl_ora_6106.trc
SQL>!more /u01/app/oracle/admin/orcl/udump/orcl_ora_6106.trc

---有关row的信息如下
block_row_dump:
tab 0, row 0, @0x1db0
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 1]  80
col  1: [ 2]  79 79
tab 0, row 1, @0x1db8
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 1]  80
col  1: [ 2]  79 79
tab 0, row 2, @0x1dc0
tl: 8 fb: --H-FL-- lb: 0x0  cc: 2
col  0: [ 1]  80
col  1: [ 2]  79 79
tab 0, row 3, @0x1dc8
........
........
tab 0, row 332, @0x152f          --第332条数据
tl: 9 fb: --H-FL-- lb: 0x2  cc: 2
col  0: [ 2]  c1 02
col  1: [ 2]  78 7a              --第332条数据的name值78 7a 为 ‘xz‘
end_of_block_dump

注意这里的fb: --H-FL--。 其有8个选项,每个值分别与bitmask 对应。

如果一个row 没有被删除,那么它的Flag 表示为:--H-FL--. 这里的字母分别代表属性的首字母。其对应的值:32 + 8 + 4 =44 or 0x2c

如果一个row 被delete了,那么它的Flag 表示为:--HDFL--. bitmask里的deleted 被设置为16. 其对应的值:32 + 16 + 8 + 4 = 60 or 0x3c

2.2 验证:删除数据

SQL> conn tv/tv
Connected.
SQL> delete from t01 where name =‘xz‘;

1 row deleted.

SQL> commit;

Commit complete.

SQL> 

--dump数据块查看Flag的标记:
tab 0, row 332, @0x152f      --第332条数据
tl: 2 fb: --HDFL-- lb: 0x1   --Flag 变为:--HDFL--
end_of_block_dump

2.3 现在用bbed 将删除的row 1 内容找回来

  1. 第332条数据仍然存在数据块中
  2. 找到第332条数据的row header 位置
  3. 改变row header中的Flag值即可

1.查找行记录的位置

BBED> set file 5
        FILE#           5

BBED> set block 3252
        BLOCK#          3252

BBED> find /c xz
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252             Offsets: 5530 to 6041           Dba:0x01400cb4
------------------------------------------------------------------------
 787a2c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
 79792c00 02018002 79792c00 02018002 79792c00 02018002 79792c00 02018002
......
 <32 bytes per line>

BBED> 

‘xz‘在块内的偏移量为5530

2.查看row directory

BBED> print kdbr
sb2 kdbr[0]                                 @118      7600
sb2 kdbr[1]                                 @120      7608
sb2 kdbr[2]                                 @122      7616
.......
sb2 kdbr[332]                               @782      5423

3.查看第332条记录的起始位置:

BBED> print *kdbr[332]            ---不要忘记‘*‘
rowdata[0]
----------
ub1 rowdata[0]                              @5523     0x3c

BBED> 

第332条记录在块内偏移量为5523,而‘xz‘在块内的偏移量为5530

4.将第332条记录dump出来

BBED> dump /v dba 5,3252 offset 5523 count 32
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252    Offsets: 5523 to 5554  Dba:0x01400cb4
-------------------------------------------------------
 3c010202 c1020278 7a2c0002 01800279 l <....xz,.....y
 792c0002 01800279 792c0002 01800279 l y,.....yy,.....y

 <16 bytes per line>

BBED>

3c   5523  --Row Flag
01   5524  --Lock Byte
02   5525  --列数
02   5526  --列长度
c1   5527
02   5528  --列长度
02   5529
78   5530  --‘x‘
7a   5531  --‘z‘ 

5.修改Row Flag的值  将3c 改为 2c

BBED> modify /x 2c offset 5523
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
 File: /u01/app/oracle/oradata/ORCL/datafile/test_01.dbf (5)
 Block: 3252             Offsets: 5523 to 5554           Dba:0x01400cb4
------------------------------------------------------------------------
 2c010202 c1020278 7a2c0002 01800279 792c0002 01800279 792c0002 01800279 

 <32 bytes per line>

BBED>

BBED> sum apply
Check value for File 5, Block 3252:
current = 0x0e90, required = 0x0e90

BBED> 

5.验证结果

--清缓存
SQL> alter system flush buffer_cache;

System altered.

SQL> conn tv/tv
Connected.
SQL> select * from t01 where name=‘xz‘;

        ID NAME
---------- --------------------------------
         1 xz

SQL>

--delete 的数据已经恢复出来。
时间: 2024-08-29 04:18:57

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

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 直接修改数据库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

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

Linux 中 17 个 tar 命令实用示例

Tar(Tape ARchive,磁带归档的缩写,LCTT 译注:最初设计用于将文件打包到磁带上,现在我们大都使用它来实现备份某个分区或者某些重要的目录)是类 Unix 系统中使用最广泛的命令,用于归档多个文件或目录到单个归档文件中,并且归档文件可以进一步使用 gzip 或者 bzip2 等技术进行压缩.换言之,tar 命令也可以用于备份:先是归档多个文件和目录到一个单独的 tar 文件或归档文件,然后在需要之时将 tar 文件中的文件和目录释放出来. 本文将介绍 tar 的 17 个实用示例.

Oracle闪回查询恢复delete删除数据

Flashback query(闪回查询)原理 Oracle根据undo信息,利用undo数据,类似一致性读取方法,可以把表置于一个删除前的时间点(或SCN),从而将数据找回. Flashback query(闪回查询)前提: SQL> show parameter undo; NAME                                TYPE       VALUE ------------------------------------ ----------- --------

Oracle字符集的查看查询和Oracle字符集的设置修改

本文主要讨论以下几个部分:如何查看查询oracle字符集. 修改设置字符集以及常见的oracle utf8字符集和oracle exp 字符集问题. 一.什么是Oracle字符集 Oracle字符集是一个字节数据的解释的符号集合,有大小之分,有相互的包容关系.ORACLE 支持国家语言的体系结构允许你使用本地化语言来存储,处理,检索数据.它使数据库工具,错误消息,排序次序,日期,时间,货币,数字,和日历自动适应本地化语言和平台. 影响Oracle数据库字符集最重要的参数是NLS_LANG参数.

window Oracle 10g RMAN异机异目录恢复

1.实验环境简介                                  1.1  SOA原数据库                                                                                                                                                           数据库名        COMSOA 实例名          COMSOA DB

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 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