Flashback version Query
相对于Flashback Query 只能看到某一点的对象状态, Oracle 10g引入的Flashback Version Query可以看到过去某个时间段内,记录是如何发生变化的。 根据这个历史,DBA就可以快速的判断数据是在什么时点发生了错误,进而恢复到之前的状态。
先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,用户创建表时虽然没有指定,但是Oracle为了维护而添加的一些内部字段,这些字段可以像普通文件那样的使用。
最熟悉的伪列就是 ROWID, 它相当于一个指针,指向记录在磁盘上的位置。ORA_ROWSCN 是Oracle 10g 新增的,暂且把它看作是记录最后一次被修改时的SCN。 Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。

SQL> create table test (id number(2));

表已创建。

SQL> insert into test values(1);

已创建 1 行。

SQL> insert into test values(2);

已创建 1 行。

SQL> insert into test values(3);

已创建 1 行。

SQL> select ora_rowscn,id from test;

ORA_ROWSCN ID
---------- ----------
1161066 1
1161066 2
1161066 3

ORA_ROWSCN记录的是最后一次被修改时的SCN,注意是被提交的修改。如果没有提交,这个伪列不会发生变化。
ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都是一个ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所有记录的ORA_ROWSCN都会同时改变。

SQL> INSERT INTO TEST VALUES(4);

已创建 1 行。
SQL> SELECT * FROM TEST; ID
----------
1
2
3
4 SQL> SELECT ORA_ROWSCN FROM TEST; ORA_ROWSCN
----------
1161066
1161066
1161066
1161066
SQL> COMMIT; 提交完成。 SQL> SELECT ORA_ROWSCN,ID FROM TEST; ORA_ROWSCN ID
---------- ----------
1161378 1
1161378 2
1161378 3
1161378 4

如果没有提交,ORA_ROWSCN值不会变。
=================Flashback Transaction Query=============================
Flashback Transaction Query也是使用UNDO信息来实现。利用这个功能可以查看某个事务执行的所有变化,它需要访问flashback_transaction_query 视图,这个视图的XID列代表事务ID,利用这个ID可以区分特定事务发生的所有数据变化。

SQL> create table test (id number(2));

表已创建。

SQL> insert into test values(1);

已创建 1 行。

SQL> insert into test values(2);

已创建 1 行。
--------------------------------------------------------------
SELECT TABLE_NAME,OPERATION FROM flashback_transaction_query where table_name='TEST';
TABLE_NAME OPERATION
TEST UNKNOWN
TEST UNKNOWN
TEST UNKNOWN
TEST UNKNOWN

operation为什么都是unknown?解决方法:http://www.cnblogs.com/rusking/p/4215272.html

==========================================================================
FLASHBACK TABLE
Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。注意SYS用户不支持闪回。
注意:如果想要对表进行flashback,必须允许表的row movement.
要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables).
例如:

SQL> select row_movement from user_tables where table_name='EMP2';

ROW_MOVE
--------
DISABLED

要启用或禁止某表row movement,可以通过下列语句:

--启用
SQL> ALTER TABLE table_name ENABLE ROW MOVEMENT;
表已更改。
--禁止
SQL> ALTER TABLE table_name DISABLE ROW MOVEMENT;
表已更改。
-------------------------------------------------------
SQL> ALTER TABLE EMP2 ENABLE ROW MOVEMENT; 表已更改。 SQL> SELECT ROW_MOVEMENT FROM USER_TABLES WHERE TABLE_NAME='EMP2'; ROW_MOVE
--------
ENABLED
====================
SQL> ALTER SESSION SET NLS_DATE_FORMAT=
2 "YYYY-MM-DD HH24:MI:SS"; 会话已更改。 SQL> SELECT SYSDATE FROM DUAL; SYSDATE
-------------------
2014-10-16 23:01:14 SQL> SELECT CURRENT_SCN FROM V$DATABASE; CURRENT_SCN
-----------
1164486 SQL> DELETE FROM EMP2; 已删除14行。 SQL> FLASHBACK TABLE EMP2 TO SCN 1164486; 闪回完成。 SQL> SELECT * FROM EMP2; EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
---------- ---------- --------- ---------- ------------------- ---------- ---------- ----------
7369 SMITH CLERK 7902 1980-12-17 00:00:00 800 20
7499 ALLEN SALESMAN 7698 1981-02-20 00:00:00 1600 300 30
7521 WARD SALESMAN 7698 1981-02-22 00:00:00 1250 500 30
……

Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。
如:
flashback table a,b ,c to scn 1103864;
一些注意事项:
(1)基于undo 的表恢复,需要注意DDL 操作的影响。修改并提交过数据之后,对表做过DDL 操作,包括:drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。
另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。
(2)基于undo 的表恢复,flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加 ENABLE TRIGGERS 子句。

=====================Flashback Data Archive略=============
《FROM:http://blog.csdn.net/tianlesoftware/article/details/4677378》

Flashback version/Transaction Query,FlashbackTable的更多相关文章

  1. Flashback Version/Transaction Query

    1.应用Flashback Version Query查询记修改版本 SQL> select dbms_flashback.get_system_change_number from dual; ...

  2. Flashback Version Query、Flashback Transaction Query快速闪回细粒度数据

    Flashback Version Query 闪回版本查询 使用Flashback Version Query  返回在指定时间间隔或SCN间隔内的所有版本,一次commit命令就会创建一个版本. ...

  3. Oracle Flashback Transaction Query with Oracle Flashback Version Query

    Oracle Flashback Transaction Query with Oracle Flashback Version Query In this example, a database a ...

  4. 闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query

    Flashback Query 背景:Flashback 是 ORACLE 自 9i 就开始提供的一项特性,在 9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数 ...

  5. 利用flashback transaction query新特性进行事务撤销

    具备了flashback version query查询的基础,我们就可以进行基于flashback version query的恢复.这就是flashback transaction query.f ...

  6. PLSQL_闪回操作3_Fashback Transaction Query

    2014-12-09 Created By BaoXinjian

  7. Hibernate有五大核心接口,分别是:Session Transaction Query SessionFactoryConfiguration

    Session接口: Session接口 Session 接口对于Hibernate 开发人员来说是一个最重要的接口.然而在Hibernate中,实例化的Session是一个轻量级的类,创建和销毁它都 ...

  8. ocp 1Z0-043 131-205题解析

    131. Which three methods can you use to run an Automatic Database Diagnostic Monitor (ADDM) analysis ...

  9. PLSQL_闪回操作2_Fashback Version Query

    2014-12-09 Created By BaoXinjian

随机推荐

  1. 如何在pl/sql developer 7运行到oracle存储过程设置断点的地方

    如何高效调试oracle存储过程,尤其是父子网状调用的存储过程 1,在需要设置断点的oracle存储过程处设置断点         如何设置断点:直接在某行oracle存储过程处单击行首,会在行首显示 ...

  2. Java这个名字怎么来

      Java语言的历程丰富多彩,被现在众多程序员和企业广泛使用,不用质疑这是Java的领先技术的结果. Java是Sun公司开发的一种编程语言,Sun公司最初的方向是让Java来开发一些电器装置程序, ...

  3. Invalid content was found starting with element 'taglib'”

    今天在使用struts-menu制作菜单,在web.xml中写入 <taglib>      <taglib-uri>/WEB-INF/struts-menu.tld</ ...

  4. 路由转发(curl)

    <?php ini_set('memory_limit', '640M'); ini_set('default_charset', 'utf-8'); define('webroot', 'ht ...

  5. 简单的LRU Cache设计与实现

    要求: 设计并实现一个LRU缓存的数据结构,支持get和set操作 get(key):若缓存中存在key,返回对应的value,否则返回-1 set(key,value):若缓存中存在key,替换其v ...

  6. http_load压力测试

    http_load是基于linux平台的性能测试工具,它体积非常小,仅100KB.它以并行复用的方式运行,可以测试web服务器的吞吐量与负载. 一.安装http_load A.进入/usr/local ...

  7. Oracle instr用法

    1:实现indexOf功能,.从第1个字符开始,搜索第1次出现子串的位置 ,) as i from dual; select instr('oracle','or') as i from dual; ...

  8. Tomcat 6.0.32 +Spring dbcp datasource关闭Tomcat出现严重异常

    异常如下: 信息: Pausing Coyote HTTP/ -- :: org.apache.catalina.core.StandardService stop 信息: Stopping serv ...

  9. 关于cookie, iphone及chrome的异同

    http://www.blogjava.net/jjshcc/archive/2010/06/13/323517.html http://stackoverflow.com/questions/295 ...

  10. openssl对数组加密解密的完整实现代码

    本例是用C实现的对一个数组进行加密,加密到第二个数组,然后解密到另一个数组的完整实现代码. #include <stdio.h> #include <string.h> #in ...