如何使用bbed恢复delete的rows

小编给大家分享一下如何使用bbed恢复delete的rows,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!

实验如下:

1.创建环境表DVD

SQL> conn hr/hr;
Connected.
SQL>
SQL> create table dvd(job varchar2(100));
Table created.
SQL> insert into dvd values('Dave is DBA!');
1 row created.
SQL> insert into dvd values('Dave like Oracle!');
1 row created.
SQL> commit;
Commit complete.
SQL>  conn / as sysdba
Connected.
SQL>
SQL> set lines 200
SQL> select OWNER,TABLE_NAME,TABLESPACE_NAME from dba_tables where table_name='DVD';
OWNER                          TABLE_NAME                     TABLESPACE_NAME
------------------------------ ------------------------------ ------------------------------
HR                             DVD                            USERS

2.查询dvd相关file/block信息;

SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid) blockno,dbms_rowid.rowid_row_number(rowid) rowno,a.* from dvd a;
ROWID                 REL_FNO    BLOCKNO      ROWNO JOB
------------------ ---------- ---------- ---------- ----------------------------------------------------------------------------------------------------
AAAV8YAAEAAAAIPAAA          4        527          0 Dave is DBA!
AAAV8YAAEAAAAIPAAB          4        527          1 Dave like Oracle!
SQL>
--新开一个窗口执行dump块查询信息
oracle@wang ~]$   sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 28 14:31:49 2017
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
SQL> alter system dump datafile 4 block 527;
System altered.
SQL> oradebug setmypid
Statement processed.
SQL>
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2013.trc
SQL>
--查看trace:
[oracle@wang ~]$ more /u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2013.trc
Trace file /u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2013.trc
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options
ORACLE_HOME = /u01/app/oracle/product/11.2.0/db_1
System name:    Linux
Node name:      wang
Release:        3.10.0-327.el7.x86_64
Version:        #1 SMP Thu Oct 29 17:29:29 EDT 2015
Machine:        x86_64
Instance name: DBdb
Redo thread mounted by this instance: 1
Oracle process number: 27
Unix process pid: 2013, image: oracle@wang (TNS V1-V3)
*** 2017-11-28 14:31:56.277
*** SESSION ID:(40.13) 2017-11-28 14:31:56.277
*** CLIENT ID:() 2017-11-28 14:31:56.277
*** SERVICE NAME:(SYS$USERS) 2017-11-28 14:31:56.277
*** MODULE NAME:(sqlplus@wang (TNS V1-V3)) 2017-11-28 14:31:56.277
*** ACTION NAME:() 2017-11-28 14:31:56.277
 
Start dump data blocks tsn: 4 file#:4 minblk 527 maxblk 527
Block dump from cache:
Dump of buffer cache at level 4 for tsn=4 rdba=16777743
BH (0x89ff27e8) file#: 4 rdba: 0x0100020f (4/527) class: 1 ba: 0x89eee000
  set: 3 pool: 3 bsz: 8192 bsi: 0 sflg: 2 pwc: 0,0
  dbwrid: 0 obj: 89880 objn: 89880 tsn: 4 afn: 4 hint: f
  hash: [0x8fe6a618,0x87fd9a18] lru: [0x89ff2a10,0x89ff27a0]
  ckptq: [NULL] fileq: [NULL] objq: [0x89ff2a38,0x8b4e5e60] objaq: [0x89ff2a48,0x8b4e5e50]
  st: XCURRENT md: NULL fpin: 'ktspbwh3: ktspfmdb' tch: 5
  flags: block_written_once redo_since_read
  LRBA: [0x0.0.0] LSCN: [0x0.0] HSCN: [0xffff.ffffffff] HSUB: [1]
Block dump from disk:
buffer tsn: 4 rdba: 0x0100020f (4/527)
scn: 0x0000.0039530d seq: 0x01 flg: 0x06 tail: 0x530d0601
frmt: 0x02 chkval: 0x9014 type: 0x06=trans data
Hex dump of block: st=0, typ_found=1
Dump of memory from 0x00007F3C1C8B7A00 to 0x00007F3C1C8B9A00
7F3C1C8B7A00 0000A206 0100020F 0039530D 06010000  [.........S9.....]
7F3C1C8B7A10 00009014 00000001 00015F18 00395308  [........._...S9.]
7F3C1C8B7A20 00000000 00320002 01000208 00160002  [......2.........]
7F3C1C8B7A30 000005FA 00C3D82B 00180272 00002002  [....+...r.... ..]
7F3C1C8B7A40 0039530D 00000000 00000000 00000000  [.S9.............]
7F3C1C8B7A50 00000000 00000000 00000000 00000000  [................]
7F3C1C8B7A60 00000000 00020100 0016FFFF 1F5D1F73  [............s.].]
7F3C1C8B7A70 00001F5D 1F880002 00001F73 00000000  [].......s.......]
7F3C1C8B7A80 00000000 00000000 00000000 00000000  [................]
        Repeat 500 times
7F3C1C8B99D0 00000000 2C000000 44110101 20657661  [.......,...Dave ]
7F3C1C8B99E0 656B696C 61724F20 21656C63 0C01012C  [like Oracle!,...]
7F3C1C8B99F0 65766144 20736920 21414244 530D0601  [Dave is DBA!...S]
Block header dump:  0x0100020f
 Object id on Block? Y
 seg/obj: 0x15f18  csc: 0x00.395308  itc: 2  flg: E  typ: 1 - DATA
     brn: 0  bdba: 0x1000208 ver: 0x01 opc: 0
     inc: 0  exflg: 0
 
 Itl           Xid                  Uba         Flag  Lck        Scn/Fsc
0x01   0x0002.016.000005fa  0x00c3d82b.0272.18  --U-    2  fsc 0x0000.0039530d
0x02   0x0000.000.00000000  0x00000000.0000.00  ----    0  fsc 0x0000.00000000
bdba: 0x0100020f
data_block_dump,data header at 0x7f3c1c8b7a64
===============
tsiz: 0x1f98
hsiz: 0x16
pbl: 0x7f3c1c8b7a64
     76543210
flag=--------
ntab=1
nrow=2
frre=-1
fsbo=0x16
fseo=0x1f73
avsp=0x1f5d
tosp=0x1f5d
0xe:pti[0]      nrow=2  offs=0
0x12:pri[0]     offs=0x1f88
0x14:pri[1]     offs=0x1f73
block_row_dump:
tab 0, row 0, @0x1f88
tl: 16 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [12]  44 61 76 65 20 69 73 20 44 42 41 21
tab 0, row 1, @0x1f73
tl: 21 fb: --H-FL-- lb: 0x1  cc: 1
col  0: [17]  44 61 76 65 20 6c 69 6b 65 20 4f 72 61 63 6c 65 21
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 527 maxblk 527
*** 2017-11-28 14:31:57.368
Processing Oradebug command 'setmypid'
*** 2017-11-28 14:31:57.368
Oradebug command 'setmypid' console output:
*** 2017-11-28 14:32:00.927
Processing Oradebug command 'tracefile_name'
*** 2017-11-28 14:32:00.927
Oradebug command 'tracefile_name' console output:
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2013.trc
[oracle@wang ~]$

我们的表dvd里只有2行记录,所以这里显示的row 为2.

注意这里的fb: --H-FL--。 其有8个选项,每个值分别与bitmask 对应。

Therefore,columns that fit within a single block, are not chained, migrated or part of aclustered table and are not deleted will have the following attributes:
(1)Head of Row Piece
(2)First Data Piece
(3)Last Data Piece

如果一个row 没有被删除,那么它就具有上面的3个属性,即Flag 表示为:--H-FL--. 这里的字母分别代表属性的首字母。其对应的值:32 + 8 + 4 =44 or 0x2c.

如果一个row 被delete了,那么row flag 就会更新,bitmask 里的deleted 被设置为16. 此时row flag 为: 32 + 16 + 8 + 4 = 60 or 0x3c.

--验证一下:

SQL> select rowid,dbms_rowid.rowid_relative_fno(rowid) rel_fno,dbms_rowid.rowid_block_number(rowid) blockno,dbms_rowid.rowid_row_number(rowid) rowno from dvd;
ROWID                 REL_FNO    BLOCKNO      ROWNO
------------------ ---------- ---------- ----------
AAAV84AAEAAAAIPAAA          4        527          0
AAAV84AAEAAAAIPAAB          4        527          1
SQL> select * from dvd;
JOB
--------------------------------------------------------------------------------
Dave is DBA!
Dave like Oracle!
SQL> delete from dvd where rownum=1;
1 row deleted.
SQL> commit;
Commit complete.
SQL> select * from dvd;
JOB
--------------------------------------------------------------------------------
Dave like Oracle!

--再次查看dump 的标记:

[oracle@wang ~]$   sqlplus / as sysdba
SQL*Plus: Release 11.2.0.4.0 Production on Tue Nov 28 14:36:29 2017
Copyright (c) 1982, 2013, Oracle.  All rights reserved.
Connected to:
Oracle Database 11g Enterprise Edition Release 11.2.0.4.0 - 64bit Production
With the Partitioning, OLAP, Data Mining and Real Application Testing options

--需先flush buffer_cache清空buffer:

SQL>  alter system flush buffer_cache;
System altered.
SQL> alter system dump datafile 4 block 527;
System altered.
SQL>
SQL> oradebug setmypid
Statement processed.
SQL>
SQL> oradebug tracefile_name
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2065.trc
SQL>
SQL>

--再次查看trace文件:

[oracle@wang ~]$ more /u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2065.trc
block_row_dump:
tab 0, row 0, @0x1f88
tl: 2 fb: --HDFL-- lb: 0x2                            ---注意由-H-FL变为-HdFL
tab 0, row 1, @0x1f73
tl: 21 fb: --H-FL-- lb: 0x0  cc: 1
col  0: [17]  44 61 76 65 20 6c 69 6b 65 20 4f 72 61 63 6c 65 21
end_of_block_dump
End dump data blocks tsn: 4 file#: 4 minblk 527 maxblk 527
*** 2017-11-28 14:36:42.754
Processing Oradebug command 'setmypid'
*** 2017-11-28 14:36:42.754
Oradebug command 'setmypid' console output:
*** 2017-11-28 14:36:48.261
Processing Oradebug command 'tracefile_name'
*** 2017-11-28 14:36:48.262
Oradebug command 'tracefile_name' console output:
/u01/app/oracle/diag/rdbms/dbdb/DBdb/trace/DBdb_ora_2065.trc
[oracle@wang ~]$

这里的row 1flag 变成了--HDFL--

3.2 现在我们用bbed 将删除的row 1 内容找回来

--编辑BBED的PARFILE参数文件

先查看数据文件

SQL> select file#||' '||name||' '||bytes from v$datafile ;
FILE#||''||NAME||''||BYTES
--------------------------------------------------------------------------------
1 /u01/app/oracle/oradata/DBdb/system01.dbf 2936012800
2 /u01/app/oracle/oradata/DBdb/sysaux01.dbf 723517440
3 /u01/app/oracle/oradata/DBdb/undotbs01.dbf 2710568960
4 /u01/app/oracle/oradata/DBdb/users01.dbf 3207331840
5 /u01/app/oracle/oradata/DBdb/example01.dbf 355205120

--进入bbed窗口

--配置BBED参数文件parfile

--编辑listfile

[oracle@wang ~]$ vi filelist.txt
1 /u01/app/oracle/oradata/DBdb/system01.dbf 2936012800
2 /u01/app/oracle/oradata/DBdb/sysaux01.dbf 723517440
3 /u01/app/oracle/oradata/DBdb/undotbs01.dbf 2710568960
4 /u01/app/oracle/oradata/DBdb/users01.dbf 3207331840
5 /u01/app/oracle/oradata/DBdb/example01.dbf 355205120
filelist.txt [New] 6L, 275C written                                                                                                                
[oracle@wang ~]$
--编辑parfile:
[oracle@wang ~]$ vi bbed.par
blocksize=8192
listfile=/home/oracle/filelist.txt
mode=edit
~
bbed.par [New] 3L, 60C written                                                                                                                     
[oracle@wang ~]$
--进入bbed窗口
[oracle@wang ~]$ bbed parfile=/home/oracle/bbed.par
Password: blockedit
BBED: Release 2.0.0.0.0 - Limited Production on Tue Nov 28 15:02:40 2017
Copyright (c) 1982, 2011, Oracle and/or its affiliates.  All rights reserved.
************* !!! For Oracle Internal Use only !!! ***************
BBED> show all
        FILE#           1
        BLOCK#          1
        OFFSET          0
        DBA             0x00400001 (4194305 1,1)
        FILENAME        /u01/app/oracle/oradata/DBdb/system01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

        

--修改指定到文件4,块527:

BED> set dba 4,527 offset 0
        DBA             0x0100020f (16777743 4,527)
        OFFSET          0
BBED> show all
        FILE#           4
        BLOCK#          527
        OFFSET          0
        DBA             0x0100020f (16777743 4,527)
        FILENAME        /u01/app/oracle/oradata/DBdb/users01.dbf
        BIFILE          bifile.bbd
        LISTFILE        /home/oracle/filelist.txt
        BLOCKSIZE       8192
        MODE            Edit
        EDIT            Unrecoverable
        IBASE           Dec
        OBASE           Dec
        WIDTH           80
        COUNT           512
        LOGFILE         log.bbd
        SPOOL           No

--查找Dave所在位置

BBED> find /c Dave
 File: /u01/app/oracle/oradata/DBdb/users01.dbf (4)
 Block: 527              Offsets: 8155 to 8191           Dba:0x0100020f
------------------------------------------------------------------------
 44617665 206c696b 65204f72 61636c65 213c0201 0c446176 65206973 20444241
 210206e0 53
 <32 bytes= per= line=>

--翻译其数据

BBED> d /v dba 4,527 offset 8155
 File: /u01/app/oracle/oradata/DBdb/users01.dbf (4)
 Block: 527     Offsets: 8155 to 8191  Dba:0x0100020f
-------------------------------------------------------
 44617665 206c696b 65204f72 61636c65 l Dave like Oracle
 213c0201 0c446176 65206973 20444241 l !<...Dave is DBA
 210206e0 53                         l !...S
 <16 bytes= per= line=>

--前后迁移offset偏移量,发现在offset在8156时发现3c标志

BBED> d /v dba 4,527 offset 8156
 File: /u01/app/oracle/oradata/DBdb/users01.dbf (4)
 Block: 527     Offsets: 8156 to 8191  Dba:0x0100020f
-------------------------------------------------------
 61766520 6c696b65 204f7261 636c6521 l ave like Oracle!
 3c02010c 44617665 20697320 44424121 l <...Dave is DBA!
 0206e053                            l ...S
 <16 bytes= per= line=>

这里已经出现了我们3c(deleted)标志,但是注意这里的位置的根据我们的查找的字符串来分的,实际在block里的分割方式不一样按照我们的offset 来进行。 我们可以通过row directory 来进行一个确认。

--print row directory 确认一下

BBED>  p kdbr
sb2 kdbr[0]                                 @118      8072
sb2 kdbr[1]                                 @120      8051
BBED>  p *kdbr[0]
rowdata[21]
-----------
ub1 rowdata[21]                             @8172     0x3c
BBED> p *kdbr[1]
rowdata[0]
----------
ub1 rowdata[0]                              @8151     0x2c

通过row directory,我们可以确认对应row记录的row header保存在offset 8172的位置,值为3c。 我们find 字符串的目的就是为了和rowdirectory 中的offset 进行比较。 他们相近时,就可以确定。

--现在我们将@8172位置的3c 变成2c。 即从deleted 变成正常

BBED> modify /x 2c offset 8172
 File: /u01/app/oracle/oradata/DBdb/users01.dbf (4)
 Block: 527              Offsets: 8172 to 8191           Dba:0x0100020f
------------------------------------------------------------------------
 2c02010c 44617665 20697320 44424121 0206e053
 <32 bytes= per= line=>
--应用更改:
BBED> sum apply
Check value for File 4, Block 527:
current = 0xf25d, required = 0xf25d
BBED>  
--flush buffer cache,然后查询
SQL> conn / as sysdba
Connected.
SQL> alter system flush buffer_cache;
System altered.
SQL> conn hr/hr;
Connected.
SQL> select * from dvd;
JOB
--------------------------------------------------------------------------------
Dave is DBA!
Dave like Oracle!

以上是“如何使用bbed恢复delete的rows”这篇文章的所有内容,感谢各位的阅读!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


本篇内容主要讲解“sqlalchemy的常用数据类型怎么使用”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“sqlalche...
今天小编给大家分享一下sqlServer实现分页查询的方式有哪些的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家
这篇文章主要介绍“sqlmap之osshell怎么使用”,在日常操作中,相信很多人在sqlmap之osshell怎么使用问题上存在疑惑,小编查阅了各式资料,整理出
本篇内容介绍了“SQL注入的知识点有哪些”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧...
1. mssql权限sa权限:数据库操作,文件管理,命令执行,注册表读取等system。是mssql的最高权限db权限:文件管理,数据库操作等 users-administratorspublic权限:数据库操作 guest-users2、sql server注入执行命令查
sql执行计划如何查看?在SPL庞大的数据中我们不知道如何查看实际数据库中发生了什么事情,有必要定期进行查询优化和索引否则会影响我们后期的SQL的查询速度。那么针对这样的问题我们必须要知道SQL执行的计划,在本文中winwin7小编给大家分享下SQL执
SQL Server 是Microsoft 公司推出的关系型数据库管理系统。具有使用方便可伸缩性好与相关软件集成程度高等优点应用非常广泛。不过在使用中,我们会遇到非常多的错误,面对这么庞大的数据库环境,当然会有精确的错误代码的对照季,下面小编分享的
SQL Server本地账户无法登陆出现错误提示:error:40-Could not open a connenction to SQL Server的问题很常见,对于初学者来说可能不知道如何解决,一起来看看下面的解决方案。解决步骤如下:1、这种情况需要开启 SQL Server service
微软推出的SQL2008是一款非常好用的数据库软件,它稳定、功能强大,为众多企业提供了最佳的数据库解决方案,那么我们如何在Windows中安装它呢,一些朋友对SQL Server 2008的安装过程还不是很熟悉,下面就一起来看看SQL Server 2008详细安装图解...
本页概要如果您使用的是 SQL Server 2005备份和还原Sp_detach_db 和 Sp_attach_db 存储过程关于排序规则的说明导入和导出数据(在 SQL Server 数据库之间复
DBCC CHECKIDENT 检查指定表的当前标识值,如有必要,还对标识值进行更正。 语法 DBCC CHECKIDENT ( &#39;table_name&#39; [ , { NORESEED
这里对 SQL Server 字符串函数进行分门别类地列出,便于查阅和记忆,相信大家都在其它方面有高深的编程基础,从字面上来说大家都知道这些函数的意义,就不对这些函数作过多的解释了,主要谈些经验,具体
查询及删除重复记录的方法 1、查找表(people)中多余的重复记录,重复记录是根据单个字段(peopleId)来判断select*frompeoplewherepeopleIdin(selectpe
微软发SQL Server 2008第二个CTP预览版from: http://news.csdn.net/n/20070807/107158.html8月7日消息,微软公司本周发布了SQL Serv
症状当您将数据库备份恢复到另一台服务器时,可能会遇到孤立用户的问题。SQL Server 联机丛书中的孤立用户疑难解答主题中没有讲述解决此问题的具体步骤。本文介绍了如何解决孤立用户问题。更多信息虽然术
当登录SQL Server 2005时可能碰到错误: &#39;No Process is on the Other End of the Pipe&#39;。解决方法:(1)Open up SQL
概要本文描述如何映射标准登录和集成登录来解决在运行 SQL Server 的服务器之间移动数据库时的权限问题。更多信息当您将数据库从一个运行 SQL Server 的服务器移到另一个运行 SQL Se
----------------------------------------问题:该用户与可信的SQL SERVER 连接无关联使用sa用户或自建用户使用“SQL SERVER 身份认证”连接数据
更新日期: 2007 年 5 月 20 日 使用下表可以确定各种版本的 Microsoft SQL Server 2005 支持哪些功能。有关 SQL Server 2005 Enterprise E
当从Excel导入数据到Sql Sever中,可能会出现以下问题:&#xD;&#xA;对于指定的缓冲区大小而言,源列的数据太大