加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Flashback Query Flashback Version Query Flashback Table Flas

发布时间:2020-12-15 17:42:20 所属栏目:百科 来源:网络整理
导读:1)基本的Flashback Query 任何一条SELECT语句都可以针对一个表的先前版本。 ocp10g select * from regions as of timestamp to_timestamp('27-12-04 16:54:06','dd-mm-yy hh24:mi:ss'); 通过使用DBMS_FLASHBACK程序包,我们可以将整个会话返回至早先的时间
1)基本的Flashback Query
任何一条SELECT语句都可以针对一个表的先前版本。
ocp10g> select * from regions as of timestamp to_timestamp('27-12-04 16:54:06','dd-mm-yy hh24:mi:ss');

通过使用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',arial; font-size:14px; line-height:21px">注:可以同时闪回多个Table,这样多个表在一个事务中闪回,并且只在事务结束时检查约束。
ocp10g> flashback table <table_name1>,<table_name2> to timestamp to_timestamp('27-12-04 18:30:11',arial; font-size:14px; line-height:21px">可以闪回至某个系统改变号,同时在执行闪回操作期间引发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
4)Flashback Transaction Query
例子:
下面的示例将薪金值乘以11(实际上应当只增加10%)
SQL> update emp set sal=sal*11 where empno=7902;
SQL> commit;
随后我们察觉到出现了错误。此时可以查询记录的所有版本(如下所示):
SQL> select ename,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语句能够修改正被修改的记录。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读