转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/30615151

实验步骤例如以下:

1、创建表guo_test1

gyj@PROD> create table guoyJoe_t1(id int,name varchar2(10));

Table created.

gyj@PROD> insert into guoyJoe_t1 values(1,'guoyJoe');

1 row created.

gyj@PROD> insert into guoyJoe_t1 values(1,'tom');

1 row created.

gyj@PROD> COMMIT;

Commit complete.

2、查出这行记录的DBA

gyj@PROD> select name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid)    row# from guoyJoe_t1;

NAME            FILE#     BLOCK#       ROW#
---------- ---------- ---------- ----------
guoyJoe 5 20877 0
tom 5 20877 1

3、刷数据缓存

gyj@PROD> alter system flush buffer_cache;

System altered.

4、利用BBED找到这行记录(改动前的值:guoyJoe)

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

--观察行头
BBED> p kdbr
sb2 kdbr[0]                                 @118      8074
sb2 kdbr[1]                                 @120      8064

BBED> p *kdbr[0]
rowdata[10]
-----------
ub1 rowdata[10]                             @8174     0x2c

--观察事务
BBBED> x /rnc
rowdata[10]                                 @8174    
-----------
flag@8174: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8175: 0x01
cols@8176:    2

col    0[2] @8177: 1 
col    1[7] @8180: guoyJoe

---观察空间
BBED> p kdbhavsp
sb2 kdbhavsp                                @110      8042

BBED> p kdbhtosp
sb2 kdbhtosp                                @112      8042

5、发生UPDATE语句,把原来的值guoyJoe改动成oracledba

gyj@PROD> update guoyJoe_t1 set name='oracledba' where name='guoyJoe';

1 row updated.

gyj@PROD> commit;

Commit complete

6、刷数据缓存

gyj@PROD> alter system flush buffer_cache;

System altered.

7、利用BBED找到这行被改动后的记录(改动后的值上:oracledba)

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

--观察行头
BBED> p kdbr
sb2 kdbr[0]                                 @118      8048
sb2 kdbr[1]                                 @120      8064

BBED> p *kdbr[0]
rowdata[0]
----------
ub1 rowdata[0]                              @8148     0x2c

--观察事务
BBED> x /rnc
rowdata[0]                                  @8148    
----------
flag@8148: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8149: 0x01
cols@8150:    2

col    0[2] @8151: 1 
col    1[9] @8154: oracledba

---观察空间
BBED> p kdbhavsp
sb2 kdbhavsp                                @110      8040

BBED> p kdbhtosp  
sb2 kdbhtosp                                @112      8040

8、对照改动前与改动后的数据

BBED> d /v offset 8174 count 16
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
Block: 20877 Offsets: 8174 to 8189 Dba:0x0140518d
-------------------------------------------------------
2c000202 c1020767 756f794a 6f650106 l ,...á..guoyJoe.. BBED> d /v offset 8148 count 16
File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
Block: 20877 Offsets: 8148 to 8163 Dba:0x0140518d
-------------------------------------------------------
2c010202 c102096f 7261636c 65646261 l ,...á..oracledba

9、開始恢复
(1)改动row directory指针位置(@118)
--改动前
BBED> p kdbr
sb2 kdbr[0]                                 @118      8074
--改动后
BBED> p kdbr
sb2 kdbr[0]                                 @118      8048
gyj@PROD> select to_char('8074','xxxxxxxxxxxxxx') from dual;

TO_CHAR('8074',
---------------
           1f8a

gyj@PROD> select to_char('8048','xxxxxxxxxxxxxx') from dual;

TO_CHAR('8048',
---------------
           1f70

BBED> d /v offset 118 count 16
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877   Offsets:  118 to  133  Dba:0x0140518d
-------------------------------------------------------
 701f801f 00000000 00000000 00000000 l p...............

BBED> modify /x 8a offset 118
Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) Y
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877            Offsets:  118 to  133           Dba:0x0140518d
------------------------------------------------------------------------
 8a1f801f 00000000 00000000 00000000

<32 bytes per line>

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

BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

Block Checking: DBA = 20992397, Block Type = KTB-managed data block
data header at 0x7f76ff66e264
kdbchk: xaction header lock count mismatch  ----事务锁报错
        trans=1 ilk=1 nlo=0
Block 20877 failed with check code 6108

DBVERIFY - Verification complete

Total Blocks Examined         : 1
Total Blocks Processed (Data) : 1
Total Blocks Failing   (Data) : 1
Total Blocks Processed (Index): 0
Total Blocks Failing   (Index): 0
Total Blocks Empty            : 0
Total Blocks Marked Corrupt   : 0
Total Blocks Influx           : 0
Message 531 not found;  product=RDBMS; facility=BBED

(2)接下来改动事务锁
---把更新前值的事务锁标记从00改为01
BBBED> x /rnc
rowdata[10]                                 @8174    
-----------
flag@8174: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8175: 0x01
cols@8176:    2

BBED> d /v offset 8175 count 16
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877   Offsets: 8175 to 8190  Dba:0x0140518d
-------------------------------------------------------
 000202c1 02076775 6f794a6f 6501066f l ...á..guoyJoe..o

BBED> modify /x 01 offset 8175
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20861            Offsets: 8175 to 8190           Dba:0x0140517d
------------------------------------------------------------------------
 010202c1 02076775 6f794a6f 650106ed

--把更新后值的事务锁标识01改为00
BBED> x /rnc
rowdata[0]                                  @8148    
----------
flag@8148: 0x2c (KDRHFL, KDRHFF, KDRHFH)
lock@8149: 0x01
cols@8150:    2

BBED> d /v offset 8149 count 16
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877   Offsets: 8149 to 8164  Dba:0x0140518d
-------------------------------------------------------
 010202c1 02096f72 61636c65 6462612c l ...á..oracledba,

BBED> modify /x 00 offset 8149
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20861            Offsets: 8159 to 8174           Dba:0x0140517d
------------------------------------------------------------------------
 000202c1 02096f72 61636c65 6462612c

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

BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

Block Checking: DBA = 20992397, Block Type = KTB-managed data block
data header at 0x7cb464
kdbchk: the amount of space used is not equal to block size
        used=46 fsc=0 avsp=8040 dtl=8088 
    ---提示数据块的空间使用不对(dtl-used=kdbhavsp=kdbhtosp)
       8088-46=8042 与 avsp=8040相关2,也就是说我要恢复到8042
     
 (3)改动空间,把空间改动为6a1f,以dtl-used=kdbhavsp为主
  gyj@PROD> select to_char('8042','xxxxxxxxxxxxxx') from dual;

TO_CHAR('8042',
       ---------------
           1f6a
  BBED> modify /x 6a1f  offset 110
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877            Offsets:  110 to  125           Dba:0x0140518d
------------------------------------------------------------------------
 6a1f681f 00000200 8a1f801f 00000000

<32 bytes per line>

BBED> modify /x 6a1f  offset 112
 File: /u01/app/oracle/oradata/PROD/tp01.dbf (5)
 Block: 20877            Offsets:  112 to  127           Dba:0x0140518d
------------------------------------------------------------------------
 6a1f0000 02008a1f 801f0000 00000000

<32 bytes per line>

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

BBED> verify
DBVERIFY - Verification starting
FILE = /u01/app/oracle/oradata/PROD/tp01.dbf
BLOCK = 20877

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
Message 531 not found;  product=RDBMS; facility=BBED

10、恢复成功(oracledba--->guoyJoe)

gyj@PROD> alter system flush buffer_cache;

System altered.

gyj@PROD> select name,dbms_rowid.rowid_relative_fno(rowid) file#,dbms_rowid.rowid_block_number(rowid) block#,dbms_rowid.rowid_row_number(rowid)    row# from guoyJoe_t1 where id=1;

NAME            FILE#     BLOCK#       ROW#
---------- ---------- ---------- ----------
guoyJoe 5 20877 0
tom 5 20877 1

实际上用BBED恢复UPDATE前的值不难,主要是要了解内部原理和块格式
总结例如以下:
 (1)改动行头
 (2)改动事务
 (3)改动空间

利用BBED恢复UPDATE改动前的值的更多相关文章

  1. 利用BBED恢复数据文件头

    转载请注明出处:http: @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED block block ) Block: Dba:0x01400001 ---------------- ...

  2. 使用BBED恢复数据文件头

    转载请注明出处:http://blog.csdn.net/guoyjoe/article/details/31018075 @@@@@@@利用BBED模拟损坏5文件1号块(文件头) BBED> ...

  3. [20190226]测试使用bbed恢复索引.txt

    [20190226]测试使用bbed恢复索引.txt --//上午做tab$删除恢复测试时发现,tab$的索引i_tab1很小.可以尝试使用bbed解决这个问题.--//首先在普通表上做一个测试看看. ...

  4. 利用binlogserver恢复单表实验【转】

    使用场景 每次开启binlogserver 指定了mysql-bin.0000XX 后都会从该点从头进行传输一次 创建binlogserver [root@mysql-zst3 binlogserve ...

  5. Linux中利用extundelete恢复误删除的数据

    利用extundelete工具恢复磁盘误删除的数据 原理: 简单介绍下关于inode的知识.在Linux下可以通过"ls -id"命令来查看某个文件或者目录的inode值,例如查看 ...

  6. 利用RMAN恢复整个数据库

    利用RMAN恢复整个数据库案例一 适合场合:恢复的目录一致,同时备份的过程中有归档日志 恢复的数据库目录和down机的数据库一致,还有一个就是RMAN备份的时候已经备份了归档日志. 备份脚本: run ...

  7. 160628、利用Oracle rownum让表排序字段值连续

    利用Oracle rownum让表排序字段值连续 1.需求说明 表(eval_index)中有字段如下: 表字段 描述 说明 ID 主键 GROUP_ID 分组编号 SORT_NUM 排序序号 按照分 ...

  8. 11g RAC 如何备份OCR,利用备份恢复OCR,ocrdump

    OCR备份 OCR的备份有2种方式,自动备份和手工备份. 自动备份策略: Oracle Clusterware 每隔4小时,CRSD 进程会自动对OCR 进行一次备份,在任意时刻,oracle 总会保 ...

  9. 利用grunt-contrib-connect和grunt-connect-proxy搭建前后端分离的开发环境

    前后端分离这个词一点都不新鲜,完全的前后端分离在岗位协作方面,前端不写任何后台,后台不写任何页面,双方通过接口传递数据完成软件的各个功能实现.此种情况下,前后端的项目都独立开发和独立部署,在开发期间有 ...

随机推荐

  1. android-sdk-windows下载版

    Android SDK 4.0.3 开发和执行环境配置 近期又装了一次最新版本号的ADK环境 眼下最新版是Android SDK 4.0.3 本文的插图和文本尽管是Android2.2的 步骤都是一样 ...

  2. c语言 int (*p)[5] 类型分析

    #include<stdio.h> int main() {     int i;     int  b[5]={1,3,5,7,9};     int  (*a)[5] = &b ...

  3. RH033读书笔记(7)-Lab 8 Introduction to String Processing

    Lab 8 Introduction to String Processing Sequence 1: Exercises in string processing 1. Other than the ...

  4. C/S通信模型和相关技术要点

    差点儿全部的项目中,都会涉及到client和服务端.而client与server之间的通信又是一个非经常见但又有须要问题的技术问题. 首先,连接方式有长连接和短连接.先看看概念. 长连接短连接仅仅是一 ...

  5. 【Git使用具体解释】EGit使用具体解释

    此系列文章写给那些打算使用Git或正在使用Git,但对Git还不是非常理解的程序员们,希望能帮助大家在学习和使用Git的过程中少走弯路,并以最少的时间和代价来熟悉Git,让Git可以辅助很多其它的开发 ...

  6. 深入研究Java类载入机制

    深入研究Java类载入机制   类载入是Java程序运行的第一步,研究类的载入有助于了解JVM运行过程,并指导开发人员採取更有效的措施配合程序运行. 研究类载入机制的第二个目的是让程序能动态的控制类载 ...

  7. 7 JavaScript Basics Many Developers Aren't Using (Properly)【转】

    JavaScript, at its base, is a simple language that we continue to evolve with intelligent, flexible ...

  8. Android开发学习总结——Android开发的一些相关概念(转)

    一.什么是3G.4G 1995年问世的第一代模拟制式手机(1G)只能进行语音通话. 1996到1997年出现的第二代GSM.CDMA等数字制式手机(2G)便增加了接收数据的功能 Ÿ 3G指的是第三代移 ...

  9. Spring aop 小例子demo

    由于最近的服务项目提供接口有一个需求,所有操作都必须检查操作的服务可用,所以感觉Aop特别适合实施.完成学习的小例子. 关于spring-Aop原理:http://m.oschina.net/blog ...

  10. 解决android模块化升级方法

    有关本机android升级版本必须是全apk更新安装,我们无法实现的一些模块化升级的解决思路: 本地人+web混合动力APP~ 查询详情,我们必须实现模块化升级,无论使用方法,我这样做.首页写在每个功 ...