Oracle中truncate删除的数据还能找到?

Oracle的truncate删除数据操作,不会写日志,不产生回滚段,因此执行速度快,相当于Windows的shift+del,不经回收站直接删除。

如果想找回truncate删除的数据,常规的可以采用这几种方案,

FY_Recover_Data是国内曾经的Oracle ACE大佬黄玮(个人网站:http://www.hellodba.com)开发的一个package,该脚本专门用于对truncate的表进行恢复。

作者讲述这个包的原理:如果我们已经有一套元数据及数据块,然后将被TRUNCATE的用户数据块的内容取代其用户数据块的内容,是否可以"骗"过Oracle,让它读出这些数据呢?

回顾一下表扫描的过程,这个方法应该是可行的。我们只要想办法构造出一个结构相同、且具有完整元数据信息和格式化了的用户数据块的傀儡表对象,然后将被truncate的用户数据块找出,再将其数据内容部分嫁接到傀儡对象的用户数据块,让Oracle认为这是傀儡对象的数据,就能让Oracle扫描并读出数据内容。

其原理用图示描述如下,

                                                   +-------------------------+  
    | Copy Of Dummy Data File |
    | (With Formmated Blocks)|
    +-------------------------+
    ||
    /
    (Blcok Header, Block Tail)
    ||
    /
    +-------------------+ +----------------+ Table Scan +---------------+
    | Source Data File | => (Data Block Content) => | Dummy Table | ============> | Restore Table |
    |(Without Meta Data)| |(With Meta Data)| +---------------+
    +-------------------+ +----------------+