zoukankan      html  css  js  c++  java
  • 利用BBED恢复UPDATE改动前的值

    转载请注明出处: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)改动空间

  • 相关阅读:
    C#获取IP信息
    获取百度地图按条件查找的信息
    react中如何实现一个按钮的动态隐藏和显示(有效和失效)
    es6 关于map和for of的区别有哪些?
    js 高级程序设计 第四章学习笔记
    ant design Table合并单元格合并单元格怎么用?
    React中如何实现模态框每次打开都是初始界面
    前端界面布局相关整理之2017
    待改善的代码整理
    cq三期备注说明
  • 原文地址:https://www.cnblogs.com/mengfanrong/p/4216744.html
Copyright © 2011-2022 走看看