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


      bbed 可以在db open 状态来进行修改,但是建议在做任何修改操作之前先shutdown db。 这样避免checkpoint 进程重写bbed 对block 的修改。 也避免oracle 在bbed 修改完成之前读block 或者申明block 为corrupt。

    一. 示例: 修改Data内容

    1.1连接bbed

    [oracle@ora10 ~]$ 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 的数据已经恢复出来。
  • 相关阅读:
    KlayGE 4.0功能规划
    Kinect for Windows SDK发布
    CENTOS下用syslogng集中管理日志并压缩保存
    Eclipse+Plugin
    struts2 获取request、session的方法
    ActiveMQ使用经验
    springmock + dbutil 用来测试数据库操作
    英语学习
    如何查看eclipse版本
    jQuery插件的开发
  • 原文地址:https://www.cnblogs.com/polestar/p/4233544.html
Copyright © 2020-2023  润新知