cf2000 发表于 2018-9-13 12:29:31

oracle bbed恢复删除数据实例

  恢复己删除数据
  一、创建模拟环境
  代码如下:
  SQL> create table hr.xifenfei (id number,name varchar2(20)) tablespace xff;
  Table created.
  SQL> insert into hr.xifenfei values(1,'xifenfei');
  1 row created.
  SQL> insert into hr.xifenfei values(2,'xff');
  1 row created.
  SQL> commit;
  Commit complete.
  SQL> select * from hr.xifenfei;
  ID NAME
  ———- ——————–
  1 xifenfei
  2 xff
  SQL> select rowid,
  2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,
  3 dbms_rowid.rowid_block_number(rowid)blockno,
  4 dbms_rowid.rowid_row_number(rowid) rowno
  5 from hr.xifenfei;

  ROWID>  —————— ———- ———- ———-
  AAAHy3AACAAAAISAAA 2 530 0
  AAAHy3AACAAAAISAAB 2 530 1
  查询file#,block,后面恢复要用

  SQL> delete from hr.xifenfei where>  1 row deleted.
  SQL> commit;
  Commit complete.
  SQL> select * from hr.xifenfei;
  ID NAME
  ———- ——————–
  1 xifenfei
  SQL> shutdown immediate;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  二、bbed恢复删除数据
  代码如下:
  $ bbed parfile=/tmp/parfile.cnf
  Password:

  BBED:>  Copyright (c) 1982, 2002, Oracle Corporation. All rights reserved.
  ************* !!! For Oracle Internal Use only !!! ***************
  BBED> show all
  FILE# 2
  BLOCK# 1
  OFFSET 0
  DBA 0×00800001 (8388609 2,1)
  FILENAME /opt/oracle/oradata/xifenfei/xff01.dbf
  BIFILE bifile.bbd
  LISTFILE /tmp/list
  BLOCKSIZE 8192
  MODE Edit
  EDIT Unrecoverable
  IBASE Dec
  OBASE Dec
  WIDTH 80
  COUNT 512
  LOGFILE log.bbd
  SPOOL No
  BBED> set dba 2,530
  DBA 0×00800212 (8389138 2,530)
  BBED> find /c xff
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8170 to 8191 Dba:0×00800212
  ————————————————————————
  7866662c 000202c1 02087869 66656e66 65690106 80e2
  
  BBED> dump /v
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8170 to 8191 Dba:0×00800212
  ——————————————————-
  7866662c 000202c1 02087869 66656e66 l xff,……xifenf
  65690106 80e2 l ei….
  
  BBED> dump /v offset 8160
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8160 to 8191 Dba:0×00800212
  ——————————————————-
  0000003c 020202c1 03037866 662c0002 l … dump /v offset 8164
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8164 to 8191 Dba:0×00800212
  ——————————————————-
  020202c1 03037866 662c0002 02c10208 l ……xff,……
  78696665 6e666569 010680e2 l xifenfei….
  
  BBED> dump /v offset 8162
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8162 to 8191 Dba:0×00800212
  ——————————————————-
  003c0202 02c10303 7866662c 000202c1 l . dump /v offset 8163
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8163 to 8191 Dba:0×00800212
  ——————————————————-
  3c020202 c1030378 66662c00 0202c102 lmodify /x 2c
  Warning: contents of previous BIFILE will be lost. Proceed? (Y/N) y
  File: /opt/oracle/oradata/xifenfei/xff01.dbf (2)
  Block: 530 Offsets: 8163 to 8191 Dba:0×00800212
  ————————————————————————
  2c020202 c1030378 66662c00 0202c102 08786966 656e6665 69010680 e2
  
  修改3c为2c
  BBED> sum apply
  Check value for File 2, Block 530:
  current = 0xb1b9, required = 0xb1b9
  三、核对结果
  代码如下:
  SQL> startup
  ORACLE instance started.
  Total System Global Area 236000356 bytes

  Fixed>
  Variable>  Database Buffers 33554432 bytes
  Redo Buffers 667648 bytes
  Database mounted.
  Database opened.
  SQL> select * from hr.xifenfei;
  ID NAME
  ———- ——————–
  1 xifenfei
  2 xff
  说明:
  1)如果数据未删除:row flag的值为 32+8+4=44或者0x2c
  2)如果数据被删除:row flag的值为 32+16+8+4=60或者0x3c
  找回被删除数据
  创建模拟表数据
  代码如下:
  SQL> create table t_xifenfei(id number,name varchar2(10));
  Table created.
  SQL> insert into t_xifenfei values(1,'xifenfei');
  1 row created.
  SQL> insert into t_xifenfei values(2,'XIFENFEI');
  1 row created.
  SQL> commit;
  Commit complete.
  dump数据块

  SQL>>
  System>  SQL> selectrowid,id,name,
  2 dbms_rowid.rowid_relative_fno(rowid)rel_fno,
  3 dbms_rowid.rowid_block_number(rowid)blockno,
  4 dbms_rowid.rowid_row_number(rowid) rowno
  5 from chf.t_xifenfei;

  ROWID          >  ------------------ ---------- ---------- ---------- ---------- ----------
  AAASdmAAEAAAACvAAA   1 xifenfei      4    175   0
  AAASdmAAEAAAACvAAB   2 XIFENFEI      4    175   1

  SQL>>
  System>  dump文件内容
  block_row_dump:
  tab 0, row 0, @0x1f89
  tl: 15 fb: --H-FL-- lb: 0x1 cc: 2
  col 0: [ 2] c1 02
  col 1: [ 8] 78 69 66 65 6e 66 65 69
  tab 0, row 1, @0x1f7a
  tl: 15 fb: --H-FL-- lb: 0x1 cc: 2
  col 0: [ 2] c1 03
  col 1: [ 8] 58 49 46 45 4e 46 45 49
  end_of_block_dump
  2012-05-01 05:09:29.287714 : kjbmbassert
  End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175
  删除表数据
  代码如下:
  SQL> delete from t_xifenfei;
  2 rows deleted.
  SQL> commit;
  Commit complete.

  SQL>>
  System>
  SQL>>
  System>  dump文件内容
  block_row_dump:
  tab 0, row 0, @0x1f89
  tl: 2 fb: --HDFL-- lb: 0x2
  tab 0, row 1, @0x1f7a
  tl: 2 fb: --HDFL-- lb: 0x2
  end_of_block_dump
  2012-05-01 05:13:35.214357 : kjbmbassert
  End dump data blocks tsn: 4 file#: 4 minblk 175 maxblk 175
  通过对比这两次的dump文件发现
  1.数据内容被删除,并不是真正删除,而是给其增加了一个标识位(fd:---D----)
  2.fb:--H-FL--(head of row piece+first data piece+last data piece )
  其有8个选项每个选项的值分别对应bitmask即32+8+4=44 or 0x2c
  3.如果一个row被delete了,那么row flag就会更新,bitmask里的deleted被设置为16.
  此时row flag为:32+16+8+4 = 60 or 0x3c.
  4.如果我们要找回来被删除的数据,只需要把3c改为2c即可
  unity3d教程http://www.unitymanual.com
  关闭数据库
  代码如下:
  SQL> select * from chf.t_xifenfei;
  no rows selected
  SQL> select name from v$datafile where file#=4;
  NAME
  ------------------------------------------------
  /tmp/user01.dbf
  SQL> shutdown immediate;
  Database closed.
  Database dismounted.
  ORACLE instance shut down.
  bbed修改数据
  BBED> set filename '/tmp/user01.dbf'
  FILENAME    /tmp/user01.dbf
  BBED> set block 175
  BLOCK#   175
  BBED> set blocksize 8192
  BLOCKSIZE    8192
  BBED> set mode edit
  MODE      Edit
  BBED> map
  File: /tmp/user01.dbf (0)
  Block: 175                  Dba:0x00000000
  ------------------------------------------------------------
  KTB Data Block (Table/Cluster)
  struct kcbh, 20 bytes         @0
  struct ktbbh, 72 bytes         @20
  struct kdbh, 14 bytes         @100
  struct kdbt, 4 bytes          @114
  sb2 kdbr                @118
  ub1 freespace            @122
  ub1 rowdata            @8158
  ub4 tailchk                @8188
  BBED> p *kdbr
  rowdata
  -----------
  ub1 rowdata               @8173   0x3c
  BBED> p *kdbr
  rowdata
  ----------
  ub1 rowdata               @8158   0x3c
  BBED> m /x 2c offset 8158
  File: /tmp/user01.dbf (0)
  Block: 175       Offsets: 8158 to 8191      Dba:0x00000000
  ------------------------------------------------------------------------
  2c630202 c1030858 4946454e 46454932 630202c1 02087869 66656e66 65690106
  b47e
  
  BBED> m /x 2c offset 8173
  File: /tmp/user01.dbf (0)
  Block: 175       Offsets: 8173 to 8191      Dba:0x00000000
  ------------------------------------------------------------------------
  2c630202 c1020878 6966656e 66656901 06b47e
  
  BBED> sum apply
  Check value for File 0, Block 175:
  current = 0x4d13, required = 0x4d13
  启动数据库验证
  代码如下:
  SQL> startup
  ORACLE instance started.
  Total System Global Area 535662592 bytes

  Fixed>
  Variable>  Database Buffers   117440512 bytes
  Redo Buffers      5832704 bytes
  Database mounted.
  Database opened.
  SQL> select * from chf.t_xifenfei;

  >  ---------- ----------
  1 xifenfei
  2 XIFENFEI

页: [1]
查看完整版本: oracle bbed恢复删除数据实例