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语句能够修改正被修改的记录。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |