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 REL_FNO BLOCKNO ROWNO
—————— ———- ———- ———-
AAAHy3AACAAAAISAAA 2 530 0
AAAHy3AACAAAAISAAB 2 530 1
查询file#,block,后面恢复要用

SQL> delete from hr.xifenfei where id=2;

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恢复删除数据

 代码如下 复制代码

[oracle@localhost ~]$ bbed parfile=/tmp/parfile.cnf
Password:

BBED: Release 2.0.0.0.0 – Limited Production on Mon Aug 22 01:52:52 2011

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

<32 bytes per line>

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

<16 bytes per line>

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 …<......xff,..
02c10208 78696665 6e666569 010680e2 l ....xifenfei....

<16 bytes per line>

BBED> 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….

<16 bytes per line>

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 .<......xff,....
02087869 66656e66 65690106 80e2 l ..xifenfei....

<16 bytes per line>

BBED> 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 l <......xff,.....
08786966 656e6665 69010680 e2 l .xifenfei....

<16 bytes per line>
通过尝试,推断出来3c的offset

BBED> modify /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

<32 bytes per line>
修改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 Size 451684 bytes
Variable Size 201326592 bytes
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> alter system flush BUFFER_CACHE;
 
System altered.
 
SQL> select   rowid,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                      ID NAME          REL_FNO    BLOCKNO      ROWNO
------------------ ---------- ---------- ---------- ---------- ----------
AAASdmAAEAAAACvAAA          1 xifenfei            4        175          0
AAASdmAAEAAAACvAAB          2 XIFENFEI            4        175          1
 
SQL> alter system dump datafile 4 block 175;
 
System altered.

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 [0xaf.4]
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> alter system flush BUFFER_CACHE;
 
System altered.
 
SQL> alter system dump datafile 4 block 175;
 
System altered.

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 [0xaf.4]
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即可

关闭数据库

 代码如下 复制代码

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[1], 4 bytes                    @114   
 
 sb2 kdbr[2]                                @118   
 
 ub1 freespace[8036]                        @122   
 
 ub1 rowdata[30]                            @8158  
 
 ub4 tailchk                                @8188  
 
BBED> p *kdbr[0]
rowdata[15]
-----------
ub1 rowdata[15]                             @8173     0x3c
 
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @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
 
 <32 bytes per line>
 
BBED>  m /x 2c offset 8173
 File: /tmp/user01.dbf (0)
 Block: 175              Offsets: 8173 to 8191           Dba:0x00000000
------------------------------------------------------------------------
 2c630202 c1020878 6966656e 66656901 06b47e
 
 <32 bytes per line>
 
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 Size                  1346140 bytes
Variable Size             411043236 bytes
Database Buffers          117440512 bytes
Redo Buffers                5832704 bytes
Database mounted.
Database opened.
SQL> select * from chf.t_xifenfei;
 
        ID NAME
---------- ----------
         1 xifenfei
         2 XIFENFEI
时间: 2024-09-15 02:54:20

oracle中bbed恢复与找回删除数据的相关文章

oracle中alter database create datafile 导致数据文件丢失恢复

alter database create datafile导致原始数据文件丢失 有客户一个小系统找我们恢复,通过Oracle Database Recovery Check 检测之后我们红框部分发现一奇怪现象 1.文件头fuzzy为NO,不符合数据库异常crash常识,也和其他文件该状态不匹配 2.文件的创建时间,scn均和checkpoint时间,scn一致(也就是说该文件是创建之后就checkpoint,然后就没有其他操作) 3.文件开始应用的归档为5,110和其他数据文件要求的3115相

ORACLE中常用的SQL语法和数据对象

一.数据控制语句 (DML) 部分 1.INSERT (往数据表里插入记录的语句) INSERT INTO 表名(字段名1, 字段名2, --) VALUES ( 值1, 值2, --); INSERT INTO 表名(字段名1, 字段名2, --) SELECT 字段名1, 字段名2, -- FROM 另外的表名; 字符串类型的字段值必须用单引号括起来, 例如: 'GOOD DAY' 如果字段值里包含单引号' 需要进行字符串转换, 我们把它替换成两个单引号''. 字符串类型的字段值超过定义的长

Oracle中如何截断表和删除表

1.截断表 Truncate  table:保留表结构,删除数据 05:49:59 SQL> truncate table test; Table truncated. 05:50:07 SQL> desc test; Name        Null     Type -------- -------- ----------------- EMPNO               NUMBER(4) ENAME               VARCHAR2(10) JOB          

SQL语句oracle中如何插入Date类型的数据

在开发的时候,经常要写条SQL语句将信息插入表中,插入的数据如果字段是date类型,就必须将date类型转换成字符串String类型在通过sql语句插入数据库.这是我字段唯一的方法,如果有高人请另赐教! 我的解决方法是用oracle中的to_date()方法,具体看下面的例子   Oracle中插入date数据代码    insert into news(ID,MSG,SEND_TIME,TIMER)    Oracle中插入date数据代码    values(20110101,'你好',to

oracle中kfed恢复误删除磁盘组详解

在某些情况下,可能因为误操作,不小先drop diskgroup,这个时候千万别紧张,出现此类故障,可以通过kfed进行完美恢复(数据0丢失).如果进一步损坏了相关asm disk,那后续恢复就很麻烦了,可能需要使用dul扫描磁盘来进行抢救性恢复,而且可能导致数据丢失. 创建测试磁盘组xifenfei [grid@xifenfei ~]$ sqlplus / as sysasm   SQL*Plus: Release 11.2.0.4.0 Production on Thu Apr 30 15:

Oracle中如何恢复rac db(raw)到单实例下

os:redhat as 4 oracle:oracle10gR2 客户提出了这样一个要求,演示一下rac db到单实例的恢复,他们的目的是检验生产环境的备份有效性 下面是思路和主要步骤: 1.先在rac db下生成一个init参数文件 2.修改参数,cluster_database为false以及屏蔽local_listener等和集群相关的参数 3.通过rman备份rac db(为了简单我使用了catalog) 4.拷贝参数文件和rac db备份到单实例机器上 5.在单实例机器上创建bdum

Oracle中如何恢复被删掉的存储过程?

  在某些时候,容易误删存储过程,那么针对存储过程被删除了,我们如何进行恢复呢 ? 这里为大家进行讲解. 1. 创建测试存储过程 SQL> conn roger/roger Connected. SQL> CREATE OR REPLACE PROCEDURE proc_test_drop 2 AS 3 BEGIN 4 FOR x IN (SELECT sysdate FROM dual) 5 LOOP 6 DBMS_OUTPUT.put_line (x.sysdate); 7 END LOO

oracle中数据库恢复历史再次刷新到Oracle 7.3.2版本—redo异常恢复

有网友在QQ上找我,说Oracle 7.3的数据库,因为redo异常咨询我是否可以恢复     检查数据库得到以下信息  代码如下 复制代码 SVRMGR> select * from v$version; BANNER ---------------------------------------------------------------- Oracle7 Workgroup Server Release 7.3.2.2.1 - Production Release PL/SQL Rel

oracle下实现恢复一个丢失的数据文件的代码_oracle

如果您目前拥有一个冷备份,但是缺少了其中的一个数据文件,但你目前存在所有的归档,如果您要恢复数据文件,可以参考以下的示例:   复制代码 代码如下: [oracle@jumper eygle]$ sqlplus "/ as sysdba"  SQL*Plus: Release 9.2.0.4.0 - Production on Sun Aug 20 01:22:50 2006  Copyright (c) 1982, 2002, Oracle Corporation.  All rig