• Oracle的flashback特性之一:Flashback Query


    Flashback特性flashback query、flashback table、flashbackdatabase依赖Undo表空间,必须启用Undo表空间管理。

    flashback table  需要启用回收站recycle bin

    flashbackdatabase 需要启用闪回区flashback area。

    SQL> show parameter undo;
    
    NAME                                 TYPE
    ------------------------------------ ----------------------
    VALUE
    ------------------------------
    undo_management                      string
    AUTO
    undo_retention                       integer
    900
    undo_tablespace                      string
    UNDOTBS1 

    undo_management   值为auto表示自动管理,manual表示手动管理。

    undo_tablespace    当undo_management值为auto时,用来指定当前undo表空间名称。undo表空间大小直接影响查询能力。

    undo_retention      记录undo记录保存的最长时间,单位秒,默认900秒,动态参数。undo_retention 只是指定数据的过期时间,并不是说undo数据一定会在undo表空间中保存15分钟,如一个新事务开始时,undo空间已经写满,新事务数据会覆盖先前已提交的数据,而不管这些数据是否已经过期;另外也不是说时间一过,已提交事务的数据就立刻无法访问,它只是失效,只要不被其他事务覆盖,仍然存在,可以被使用。

    有一种特殊情况,能够确保undo中的数据在undo_retention指定时间过期前一定有效,不会覆盖未过期的数据。

    启用:alter tablespace UNDOTBS1retention guarantee;

    禁止:alter tablespace UNDOTBS1retention noguarantee;

    需要注意事务提交之后,对表做了DDL操作,会是undo中的撤销数据失效,应用flashback query会触发错误。另外表结构修改并不影响undo中的撤销记录,但有可能导致undo记录无法应用,例如增加了约束。flashback query对v$tables,v$tables等动态性能视图无效,dba_*,all_*,user_*等数据字典有效,可以支持远程数据库访问,select* from test@dblink as of scn 54321。

    一、闪回查询Flashback Query

    1、基于事件,as of timestamp

    (1)测试表。

    SQL> select * from test1;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc
             4 dd
             5 ee

    (2)删除掉其中几条。

    SQL> delete from test1 where id > 3;
    
    2 rows deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from test1;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc

    (3)闪回查询

    SQL> select * from test1 as of timestamp sysdate - 2/1440;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc
             4 dd
             5 ee

    (4)恢复数据。

    SQL> insert into test1 select * from test1 as of timestamp sysdate - 2/1440 where id >3;
    
    2 rows created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from test1;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc
             4 dd
             5 ee

    2、基于scn, as of scn,如果对相互有主外键约束的表进行恢复时,as of timestamp方式可能会由于时间点不统一,造成数据选择或插入失败,scn方式能够确保记录的约束一致性。

    (1)获取当前scn

    SQL> select current_scn from v$database;
    
    CURRENT_SCN
    -----------
         500381

    (2)删除数据。

    SQL> delete from test1 where id >3;
    
    2 rows deleted.
    
    SQL> commit;
    
    Commit complete.

    (3)闪回查询。

    SQL> select * from test1 as of scn 500381;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc
             4 dd
             5 ee

    (4)恢复数据。

    SQL> insert into test1 select * from test1 as of scn 500381 where id > 3;
    
    2 rows created.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> select * from test1;
    
            ID NAME
    ---------- --------------------
             1 aa
             2 bb
             3 cc
             4 dd
             5 ee

    3、版本查询,versions between,能够查看指定时间段内undo表空间中记录的不同版本,只包括已经提交的记录。

    (1)获取当前scn

    SQL> select current_scn from v$database;
    
    CURRENT_SCN
    -----------
         512219

    (2)一系列提交操作

    SQL> update test1 set id = id + 2 where id >3;
    
    2 rows updated.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> delete from test1 where id < 3;
    
    2 rows deleted.
    
    SQL> commit;
    
    Commit complete.
    
    SQL> insert into test1 values(6, 'ff');
    
    1 row created.
    
    SQL> insert into test1 values(7, 'gg');
    
    1 row created.
    
    SQL> commit;
    
    Commit complete.

    (3)获取当前scn

    SQL> select current_scn from v$database;
    
    CURRENT_SCN
    -----------
         512333

    (4)查询数据

    SQL> select id, name, versions_startscn, versions_endscn, versions_operation from test1 versions between scn 512219 and 512333 order by 2;
    
            ID NAME                 VERSIONS_STARTSCN VERSIONS_ENDSCN VE
    ---------- -------------------- ----------------- --------------- --
             1 aa                              512276                 D
             1 aa                                              512276
             2 bb                                              512276
             2 bb                              512276                 D
             3 cc
             6 dd                              512258                 U
             4 dd                                              512258
             5 ee                                              512258
             7 ee                              512258                 U
             6 ff                              512291                 I
             7 gg                              512291                 I
    
    11 rows selected.

    (5)结果分析

    versions_operation:对该行执行的操作:I表示INSERT,D表示DELETE,U表示UPDATE,对于索引键的UPDATE操作,版本查询可能会将其识别成两个操作:DELETE和INSERT。如果为D,表明该列已被删除,如果该列为空,表明记录在这段时间误操作。

    versions_startscn/versions_starttime:该记录操作的scn或时间,如果为空,表示该行记录是在查询范围外创建的。

    versinons_endscn/versions_endtime:该记录失效的scn或时间,如果为空,说明记录当前时间在当前表内存在,或者已经被删除。

    4、事务查询,transaction query

    (1)当前scn

    SQL> select current_scn from v$database;
    
    CURRENT_SCN
    -----------
         513490

    (2)提交操作

    SQL> delete from test1 where id < 3;
    
    0 rows deleted.
    
    SQL> rollback;
    
    Rollback complete.
    
    SQL> delete from test1 where id = 3;
    
    1 row deleted.
    
    SQL> commit;
    
    Commit complete.

    (3)当前scn

    SQL>  select current_scn from v$database;
    
    CURRENT_SCN
    -----------
         513545

    (4)查询事物

    SQL> select xid, commit_scn, commit_timestamp, operation, undo_sql from flashback_transaction_query q 
    where q.xid in(select versions_xid from scott.test1 versions between scn 513490 and 513545);
    
    XID              COMMIT_SCN COMMIT_TIMESTAMP
    ---------------- ---------- -------------------
    OPERATION
    ----------------------------------------------------------------
    UNDO_SQL
    --------------------------------------------------------------------------------
    050019002C010000     513533 2012-10-27 11:33:15
    DELETE
    insert into "SCOTT"."TEST1"("ID","NAME") values ('3','cc');
    
    050019002C010000     513533 2012-10-27 11:33:15
    BEGIN

    (5)结果分析

    上述查询列出了前面所做的操作和时间,实际执行的语句该视图并没有记录,只能通过undo_sql和operation推测,实际使用中,该视图存储记录量较大,查询的时候建议通过关键列过滤,比如logon_user,table_name,table_owner等。

  • 相关阅读:
    HL极大算子弱(1,1)范数趋于无穷, 当维数趋于无穷
    Stein's Maximal principle
    课程: 广义相对论和波方程
    关于球乘子和BochnerRiesz乘子的相关文献
    The Hardy Uncertainty Principle
    Mar. 22 10:0011:30, 1569, "Global wellposedness for the nonlinear Schrodinger equation with derivative in energy space" by Yifei Wu
    Several questions regarding construction of functions
    通知: 强化班<调和分析与PDE>3月26日的课程 改到3月21 晚上6:009:00 地点不变
    ADO.NET Entity Framework 入门示例向导
    JavaScript 定义类方法
  • 原文地址:https://www.cnblogs.com/guarder/p/3472166.html
Copyright © 2020-2023  润新知