Oracle中如何使用bbed恢复delete的数据

表中的数据被delete之后并不会真正删除数据,而是打了一个删除标记,只要还没有被覆盖就可以恢复回来。

实验过程如下:

SYS@ORCL>create table bbed_test(x varchar2(20));

Table created.

SYS@ORCL>insert into bbed_test values('BADLY9');

1 row created.

SYS@ORCL>insert into bbed_test values('JP');

1 row created.

SYS@ORCL>commit;

Commit complete.

SYS@ORCL>select rowid, dbms_rowid.rowid_relative_fno(rowid)rel_fno,

 2  dbms_rowid.rowid_block_number(rowid)blockno,

 3  dbms_rowid.rowid_row_number(rowid) rowno

 4  from bbed_test;

ROWID                 REL_FNO    BLOCKNO      ROWNO

------------------ ---------- ---------- ----------

AAAM0VAABAAAOuCAAA          1      60290          0

AAAM0VAABAAAOuCAAB          1      60290          1

SYS@ORCL>alter system flush buffer_cache;

System altered.

SYS@ORCL>alter system dump datafile 1 block 60290;

System altered.

SYS@ORCL>oradebug setmypid

Statement processed.

SYS@ORCL>oradebug tracefile_name

/u01/app/oracle/admin/ORCL/udump/orcl_ora_18509.trc

查看dump文件

block_row_dump:

tab 0, row 0, @0x1f96

tl: 10 fb: --H-FL-- lb: 0x1  cc: 1

col  0: [ 6]  42 41 44 4c 59 39

tab 0, row 1, @0x1f90

tl: 6 fb: --H-FL-- lb: 0x1  cc: 1

col  0: [ 2]  4a 50

end_of_block_dump

红色标记的位置记录了该行数据的状态:

本栏目更多精彩内容:http://www.bianceng.cnhttp://www.bianceng.cn/database/Oracle/

没有被删除的话是--H-FL--,其对应的值为0x2c

已经被删除的话是--HDFL--,其对应的值为0x3c

下面我们删除一行数据来看一下:

SYS@ORCL>delete bbed_test where x='BADLY9';

1 row deleted.

SYS@ORCL>commit;

Commit complete.

SYS@ORCL>select * from bbed_test;

X

--------------------

JP

SYS@ORCL> alter system flush buffer_cache;

System altered.

SYS@ORCL>alter system dump datafile 1 block 60290;

System altered.

查看dump文件

block_row_dump:

tab 0, row 0, @0x1f96

tl: 2 fb: --HDFL-- lb: 0x2

tab 0, row 1, @0x1f90

tl: 6 fb: --H-FL-- lb: 0x0  cc: 1

col  0: [ 2]  4a 50

end_of_block_dump

可以看到此时row 0的数据已经被标记为删除。

下面使用bbed工具将该条数据恢复回来:

BBED> set dba 1,60290

       DBA             0x0040eb82 (4254594 1,60290)

BBED> f /c BADLY9  

File: /u01/app/oracle/oradata/ORCL/system01.dbf (1)

Block: 60290            Offsets: 8182 to 8191           Dba:0x0040eb82

------------------------------------------------------------------------

4241444c 59390206 1e62

<32 bytes per line>

BBED> p *kdbr

rowdata[6]

----------

ub1 rowdata[6]                              @8178     0x3c

BBED> set offset 8178

       OFFSET          8178

BBED> m /x 2c

File: /u01/app/oracle/oradata/ORCL/system01.dbf (1)

Block: 60290            Offsets: 8178 to 8191           Dba:0x0040eb82

------------------------------------------------------------------------

2c020106 4241444c 59390206 1e62

<32 bytes per line>

BBED> sum apply

Check value for File 1, Block 60290:

current = 0xc7d4, required = 0xc7d4

现在去库里查看一下

SYS@ORCL>alter system flush buffer_cache;

System altered.

SYS@ORCL>select * from bbed_test;

X

--------------------

BADLY9

JP

可以看到被delete的数据已经恢复回来。

时间: 2024-08-17 20:00:24

Oracle中如何使用bbed恢复delete的数据的相关文章

如何使用bbed恢复update的数据

使用bbed不仅仅可以找回已经delete的数据还可以恢复update的数据,当然过程要比恢复delete的数据复杂一些. 实验过程如下: SYS@ORCL>create table bbed_test(x int,y varchar2(20)); Table created. SYS@ORCL>insert into bbed_test values(1,'BADLY9'); 1 row created. SYS@ORCL>insert into bbed_test values(2,

oracle中的 resetlogs+scn恢复

关于resetlog的作用是将日志序列重置,这样以前的归档就作废.请高人指点,是什么样的一个工作机制? 首先一定要明白oracle工作的基本原理,归档情况下:大家一定要同步,谁也不能滞后或者超前,也就是SCN号,如果学oracle不懂scn的作用,那oracle就很难学懂了.     为什么要resetlog,因为有一些地方不一致了,必须得需要着一个基准点,让大家以这个为起点,一起继续超前走.不知道楼主明白了吗? alter database open noresetlogs与resetlog有

Oracle中如何使用BBED跳过丢失的归档

在recover datafile的过程当中如果丢失了需要的归档将使得recover无法进行,使用bbed工具可以跳过丢失的归档进行recover datafile. 实验过程如下: SYS@ORCL>select * from v$version; BANNER ---------------------------------------------------------------- Oracle Database 10g Enterprise Edition Release 10.2.

oracle中12C sysaux 异常恢复—ORA-01190错误恢复

有朋友请求支援,他们数据库由于file 3 大量坏块,然后直接使用rman 备份还原了file 3,但是在recover过程中发现归档丢失,而且整个库在丢失归档的scn之后,还做过resetlogs操作,导致现在整个库无法正常启动,报ORA-01190错误,希望帮忙把file 3 给online起来,整个库正常open[当然在丢失sysaux的情况下,数据库可以open起来,但是这种情况下,迁移数据比较麻烦] SQL> startup; ORACLE 例程已经启动.   Total System

Oracle中如何使用bbed手动提交事务

有时候数据库挂掉,起库会出现ORA-00704错误,而导致ORA-00704错误的根本原因是访问OBJ$的时候,ORACLE需要回滚段中的数据,而访问回滚段的时候需要的undo数据已经被覆盖,此时我们可以通过bbed工具手工提交事务,从而解决这个问题. 使用bbed提交事务测试过程如下: JP@ORCL>create table JP_BBED_TEST as select * from hr.employees where rownum<=10; Table created. JP@ORCL

oracle中误删除表后恢复语句(FLASHBACK)_oracle

复制代码 代码如下: select * from dba_recyclebin; select * from user_recyclebin; FLASHBACK TABLE CF_IMPORT_RULE TO BEFORE DROP; FLASHBACK COMPLETE

oracle中exp跳过某些表导出数据

有一个需求,某个用户有很多张表,但是只能使用exp导出,而且想跳过其中某几张表,其他对象包括依赖关系都需要.针对这样的情况,通过分析exp的视图脚本,在exu10tabs视图进行修改,跳过某些表即可 修改exu10tabs视图 本测试为11.2.0.4版本,不同版本数据库,可能视图名称和语句有一定出入,请别照搬,exu10tabs在$ORACLE_HOME/rdbms/admin/catexp.sql中 CREATE OR REPLACE VIEW exu10tabs (            

Oracle中简单查询、限定查询、数据排序SQL语句范例和详细注解_oracle

一.简单查询 SQL(Structured Query Language) 结构化查询语言,是一种数据库查询和程序设计语言,用于存取数据以及查询.更新和管理关系数据库系统.ANSI(美国国家标准学会)声称,SQL是关系数据库管理系统的标准语言. Oracle数据库之所以发展的很好,主要也是因为Oracle是全世界最早采用SQL语句的数据库产品. SQL功能强大,概括起来,它可以分成以下几组: 复制代码 代码如下: DML(Data Manipulation Language) 数据操作语言,用于

oracle sql-oracle 中 group by 后给出的数据的排序问题

问题描述 oracle 中 group by 后给出的数据的排序问题 在group by之后查出的数据,是按照什么顺序给出的? 表中没有设置主键,不是用order by 排序,而是分组后查询出来的数据以什么原则优先的顺序输出 解决方案 应该默认是按照插入的顺序的,这里自己来设置顺序 解决方案二: group by 會對數據排序嗎Oracle Group By 用法之 -- HavingOracle数据分组:group by,having,rollup,cube,grouping sets