TRUNCATE TABLE恢复-脚本

上篇bbed的方法也许较为复杂,如果对块结构和bbed不熟悉的朋友,可以尝试使用本文的方法来修复。
结合truncate系列一的原理,再加上truncate table还有一个特点,就是所释放的空间会变成free space,这就给没有备份的情况下恢复表数据提供了另外一种思路。

恢复思路如下:

  • 通过logminer或者redodump找到dataobj#的变化(用于update obj$里的dataobj#)
  • 使用dbms_rowid.rowid_create抽取该表空间匹配truncate前dataobj#的block里的数据

抽取的范围也有两种思路:

  • truncate bbed修复中介绍的redodump找出的extent map里的block(本文的PL/SQL不采用此方式)
  • 该表的第一个extent、该表空间的free space、该表空间所有segment的最后一个extent(因为truncate的空间可能已经被其他segment使用,可以抽取LHWM-HHWM之间还未格式化的block)

环境构造:

1.通过logminer或者redodump找到dataobj#的变化
因为表可能会truncate过多次,原dataobj#不一定就等于obj#,所以需要通过redo来确认,如果最小补充日志没有打开,logminer可能会有遗漏。如果遗漏则使用redodump来寻找。

dataobj#从87903变成了87904.

2.遍历表所在tablespace的free block和该表的第一个extent,以及该表空间所有segment的最后一个extent,使用dbms_rowid.rowid_create抽取数据

dbms_rowid.rowid_create参数解释如下:

至此,该方法在无数据覆盖的情况下实现了完全恢复。

此条目发表在Oracle, Oracle Recover分类目录。将固定链接加入收藏夹。

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注