在上一篇博客(11G新特性:FLASHBACK ARCHIVE - 01)中提到了关于通过11G新特性FLASHBACK ARCHIVE恢复意外丢失表数据的恢复方法,主要是针对DML操作。在11G中,FALSHBACKARCHIVE可以支持针对DDL语句的恢复。
针对DDL语句(添加/删除列)
创建表t03
23:08:29SQL> create table t03 as select owner,object_id,object_name,object_type fromdba_objects where owner='SCOTT';
Table created.
23:08:36 SQL> select * from t03;
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
6 rows selected.
为表t03开启flashback archive:
23:08:41SQL> alter table t03 flashback archive;
Table altered.
记录下表定义未被修改前的时间:
23:08:50SQL> select sysdate from dual;
SYSDATE
-------------------
2011-11-1223:09:00
表t03添加列object_bytes:
23:09:14SQL> alter table t03 add (object_bytes number);
Table altered.
为新列object_bytes添加数据:
23:11:12SQL> update t03 set object_bytes = 1024;
6 rows updated.
23:11:26 SQL> commit;
Commit complete.
23:11:31 SQL> select * from t03;
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE OBJECT_BYTES
---------- ---------- -------------------- -------------------- ------------
SCOTT 75334 PK_DEPT INDEX 1024
SCOTT 75333 DEPT TABLE 1024
SCOTT 75335 EMP TABLE 1024
SCOTT 75336 PK_EMP INDEX 1024
SCOTT 75337 BONUS TABLE 1024
SCOTT 75338 SALGRADE TABLE 1024
6 rows selected.
至此,t03表已被添加列object_bytes,并存储有数据,现在我们通过FLASHBACK ARCHIVE查询t03表定义被修改前的数据状态,注意:2011-11-1223:09:00为表定义修改前的时间点,因此,我们可以尝试查询该时间点时的数据状态。
23:12:49SQL> select * from t03 as of timestamp to_timestamp('2011-11-1223:09:00','yyyy-mm-dd hh24:mi:ss');
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE OBJECT_BYTES
---------- ---------- -------------------- -------------------- ------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
6 rows selected.
可以看到,其实表定义还在(指新添加的列:object_bytes),不过该列上的数据已不存在,相信Oracle在后续的版本中继续完善。
上面实验的是添加列情况,假如我删除了列object_type,那么通过FLASHBACK ARCHIVE查询出的结果如下:
23:34:43SQL> select * from t04 as of timestamp to_timestamp('2011-11-1223:33:47','yyyy-mm-dd hh24:mi:ss');
OWNER OBJECT_ID OBJECT_NAME D_1248039_OBJECT_TYPE
---------- ---------- -----------------------------------------------------------------------------
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75334 PK_DEPT INDEX
SCOTT 75338 SALGRADE TABLE
SCOTT 75337 BONUS TABLE
6 rows selected.
需要注意列名D_1248039_OBJECT_TYPE,该列即为我们原本的object_type列。
针对DDL语句(TRUNCATE操作)
为表t02开启flashback archive:
SQL>alter table t02 flashback archive;
Table altered.
当前表t02的数据状态:
SQL>select * from t02;
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75334 PK_DEPT INDEX
SCOTT 75333 DEPT TABLE
SCOTT 75335 EMP TABLE
SCOTT 75336 PK_EMP INDEX
SCOTT 75337 BONUS TABLE
SCOTT 75338 SALGRADE TABLE
6 rows selected.
记录truncate前的时间点:
SQL>select sysdate from dual;
SYSDATE
-------------------
2011-11-1222:20:22
truncate表t02:
SQL>truncate table t02;
Table truncated.
表t02已空:
SQL>select * from t02;
no rows selected
通过FLASHBACKARCHIVE查询:
SQL>select * from t02 as of timestamp (systimestamp - interval '5' minute);
OWNER OBJECT_ID OBJECT_NAME OBJECT_TYPE
---------- ---------- -------------------- --------------------
SCOTT 75336 PK_EMP INDEX
SCOTT 75335 EMP TABLE
SCOTT 75338 SALGRADE TABLE
SCOTT 75337 BONUS TABLE
SCOTT 75333 DEPT TABLE
SCOTT 75334 PK_DEPT INDEX
6 rows selected.
当然,如果有知道确切的时间,也可以通入下语句查询:
SQL>select * from t02 as of timestamp to_timestamp('2011-11-12 22:20:22','yyyy-mm-ddhh24:mi:ss');
在10G版本中是不可能通过此方法恢复的,所谓11G新特性嘛,呵呵。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25834554/viewspace-710843/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/25834554/viewspace-710843/