DBA实验手册第3讲 运用bbed工具恢复delete误删除的数据

     --(南宋)陆游《冬夜读书示子聿》


 前       言 

01


当面试官问你,Oracle数据库的表被执行了delete操作并已提交,如何找回数据呢?常规的修复方法包括闪回表、impdp单表导入、rman单表恢复,除了这些方法之外,还可以考虑使用BBED工具找回数据。今天我想跟大家先分享下如何运用bbed工具恢复delete误删除的数据。想深入学习bbed工具的朋友,一定要动手多做实验!

当Oracle数据库执行delete语句后,表中数据实际上并没有被删除,而是将行标记为已删除,表示数据块可以重用。因此,在数据块没有被覆盖之前,将数据块上的标志位的已删除标记去掉,就可以找回数据了。


 往期文章推荐 

02


1、DBA实验手册第1讲 运用bbed工具和SQL语句学习bootstrap$表存储信息

2、DBA实验手册第2讲 运用bbed工具恢复bootstrap$表数据

欢迎关注公众号!


 数据块简介 

03


在Oracle数据库中,块是存储数据的最小单位,一个块通常大小为8KB。块是Oracle进行I/O操作的基本单位,它用于存储表数据、索引、回滚段数据、临时数据等。数据库中的所有数据都存储在块中,包括表的行数据、索引键值和数据字典信息等。每个数据块的块头结构都是固定的。所有的数据块都包含相同的头结构----kcbh。行状态存储在每行的行标头中,该行标头占用每行的前几个字节。行标头由行标记、锁字节(ITL条目)和列计数组成。第一个Row标志是一个单字节,它保存一个显示行状态的位掩码。位掩码解码如下:

DBA实验手册第3讲 运用bbed工具恢复delete误删除的数据-1

因此行标头(数据块dump文件中的“--H-FL--”对应上面表格的8列信息)=Head of row picec + First data picec + Last data picec = 32+8+4 = 44 转换为16进制 0x2c。当数据被删除后,行标头+(Deleted 16) =32+16+8+4=60 转换为16进制 0x3c。

    SQL> select to_char(44,'xxxxxxxx') as hex1,
    to_char(60,'xxxxxxxx') as hex2 from dual;
    HEX1 HEX2
    --------- ---------
    2c 3c