Flashback Query 还原数据

来源:互联网 发布:cba周琦数据统计 编辑:程序博客网 时间:2024/06/06 08:50
1)基本的Flashback Query
任何一条SELECT语句都可以针对一个表的先前版本。

ocp10g> select * from 表名 as of timestamp to_timestamp('27-12-04 16:54:06','dd-mm-yy hh24:mi:ss');

create table sq_sqxx_all_temp_hjw as select * from表名 as of timestamp sysdate-0.005


通过使用DBMS_FLASHBACK程序包,我们可以将整个会话返回至早先的时间点:
ocp10g> execute dbms_flashback.enable_at_time(to_timestamp('27-12-04 16:54:06','dd-mm-yy hh24:mi:ss'));
此时,所有查询都将看到位于指定时间的数据库。其他所有会话将看到实时数据,而该会话在取消闪回之前将看到数据库的一个冻结版本:
ocp10g> execute dbms_flashback.disable;

启用Flashback Query的语法可以接受一个时间标记或者一个SCN。如果使用SCN,那么闪回的时间点就是精确的。如果指定一个时间点,那么这个时间点将会映射为一个精度为3秒钟的SCN。

2)Flashback Table Query
首先,为所有需要闪回的表启用默认为表闪回先决条件的记录转移。
ocp10g> alter table <table_name> enable row movement;

然后,执行表闪回。
ocp10g> flashback table <table_name> to timestamp to_timestamp('27-12-04 18:30:11','dd-mm-yy hh24:mi:ss');

注:可以同时闪回多个Table,这样多个表在一个事务中闪回,并且只在事务结束时检查约束。
ocp10g> flashback table <table_name1>,<table_name2> to timestamp to_timestamp('27-12-04 18:30:11','dd-mm-yy hh24:mi:ss');

可以闪回至某个系统改变号,同时在执行闪回操作期间引发DML触发器:
SQL> flashback table <table_name1>,<table_name2> to scn 6539425 enable triggers;

3)Flashback Version Query
显示Table中相应记录的所有版本的SQL
ocp10g> select empno,ename,sal,versions_xid,versions_startscn,versions_endscn,versions_operation from emp versions between scn minvalue and maxvalue where empno=8000;

显示Table中两个时间标记指定的时间范围内的所有版本的SQL
ocp10g> select empno,ename,sal,versions_xid,versions_starttime,versions_endtime,versions_operation from emp versions between timestamp to_timestamp(systimestamp-1/24) and systimestamp where empno=8000;

4)Flashback Transaction Query
例子:
下面的示例将薪金值乘以11(实际上应当只增加10%)
SQL> update emp set sal=sal*11 where empno=7902;
SQL> commit;

随后我们察觉到出现了错误。此时可以查询记录的所有版本(如下所示):
SQL> select ename,sal,versions_xid from emp versions between scn minvalue and maxvalue where empno=7902;
ENAME                               SAL   VERSIONS_XID
-------------------   ------------------   -----------------------------------
FORD                             33000   06002600B0010000
FORD                               3000

这个查询简要地说明了所发生的情况,并且给出了倒退变化的足够信息。但是,如果指定的事务影响了其他表中的其他记录,那么将会发生什么情况?为了确定所发生的情况,就需要查询FLASHBACK_TRANSACTION_QUERY视图,针对受到指定事务影响的每条记录,该视图中都存在一条相关的记录。XID列的类型为RAW、VERSIONS_XID伪劣采用十六进制的情况稍微复杂一些,因此必须使用类型强制转换函数完成二者的连接:
SQL> select operation,undo_sql from flashback_transaction_query where xid=hextoraw('06002600B0010000');
OPERATION    UNDO_SQL
----------------    -------------------------------------------------------------------------
UPDATE          update "SCOTT"."EMP" set "SAL"='3000' where ROWID='AAAM+yAAEAAAAAeAAM';

上面这个查询只返回一条记录(从而确定只有一条记录真正受到指定事务的影响),并且提供了一条倒退变化影响的SQL语句。读者须要注意ROWID在UNDO_SQL语句中的用法。假如没有对表进行过重新组织,那么所提供的SQL语句能够修改正被修改的记录。
原创粉丝点击