• Flashback version/Transaction Query,FlashbackTable


    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》

  • 相关阅读:
    JQuery DOM操作
    JQuery 选择器和事件
    LinQ 组合查分页
    LinQ
    web 图片验证码 验证
    Web 上传图片加水印
    Web 组合查询加 分页
    ajax连接数据库加载+三级联动
    jq动画
    jq基础
  • 原文地址:https://www.cnblogs.com/rusking/p/4029971.html
Copyright © 2020-2023  润新知