• FlashbackQuery:SCN与timestamp示例


    Flashback Query
    Flashback 是ORACLE 自9i 就开始提供的一项特性,在9i 中利用oracle 查询多版本一致的特点,实现从回滚段中读取表一定时间内操作过的数据,可用来进行数据比对,或者修正意外提交造成的错误数据,该项特性也被称为Flashback Query。
    Flashback Query分Flashback Query,Flashback Version Query, Flashback Transaction Query 三种。

    Flashback Query
    Flashback Query 是利用多版本读一致性的特性从UNDO 表空间读取操作前的记录数据。
    flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。
    该特性也完全支持访问远端数据库,比如select * from tbl@dblink as of scn 3600;的形式。
    多版本读一致性
    不同的事务在写数据时,会将数据的前映像写入undo 表空间,这样如果同时有其它事务查询该表数据,则可以通过undo 表空间中数据的前映像来构造所需的完整记录集,而不需要等待写入的事务提交或回滚。
    Flashback query 有多种方式构建查询记录集,记录集的选择范围可以基于时间或基于scn,甚至可以同时查询出记录在undo 表空间中不同事务时的前映象。用法与标准查询非常类似,要通过flashback query 查询undo 中的撤销数据,最简单的方式只需要在标准查询语句的表名后面跟上as of timestamp(基于时间)或as of scn(基于scn)即可。
    as of timestamp|scn 的语法是自9iR2 后才开始提供支持。
    =====================AS OF TIMESTAMP 示例========================

    SQL> SELECT SYSDATE FROM DUAL;
    
    SYSDATE
    -------------------
    2014-10-16 15:13:06
    
    SQL> DELETE FROM EMP2;
    
    已删除14行。
    
    SQL> SELECT * FROM EMP2 AS OF TIMESTAMP TO_TIMESTAMP('2014-10-16 15:13:06','YYYY-MM-DD HH24:MI:SS');
    
    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
    ……

    查看删除之前的状态:假设当前距离删除数据已经有5 分钟左右的话:

    SQL> select * from EMP2 as of timestamp sysdate-5/1440;
    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 Query恢复之前的数据:

    SQL> INSERT INTO EMP2 SELECT * FROM EMP2 AS OF TIMESTAMP TO_TIMESTAMP('2014-10-16 15:13:06','YYYY-MM-DD HH24:MI:SS');
    
    已创建14行。
    
    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
    ……

    建议使用as of scn 的方式执行flashback query,比如需要对多个相互有主外键约束的表进行恢复时,如果使用as of timestamp 的方式,可能会由于时间点不统一的缘故造成数据选择或插入失败,通过scn 方式则能够确保记录的约束一致性。

    ========================As of scn 示例=======================
    1.查看SCN:

    SQL> show user;
    USER 为 "SYS"
    SQL> SELECT dbms_flashback.get_system_change_number FROM dual;
    
    GET_SYSTEM_CHANGE_NUMBER
    ------------------------
    1151413
    
    SQL> SELECT CURRENT_SCN FROM V$DATABASE;
    
    CURRENT_SCN
    -----------
    1151425

    2.删除数据库/查看删除之前的数据

    SQL> SHOW USER;
    USER 为 "SCOTT"
    
    SQL> DELETE FROM EMP2;
    
    已删除14行。
    
    SQL> SELECT * FROM EMP2;
    
    未选定行
    
    SQL> SELECT * FROM EMP2 AS OF SCN 1151425;
    
    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
    7369 SMITH CLERK 7902 17-12月-80 800 20
    7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
    7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
    ……

    3. 用flashbach query恢复之前的数据

    SQL> INSERT INTO EMP2 SELECT * FROM EMP2 AS OF SCN 1151413;
    
    已创建14行。
    
    SQL> SELECT * FROM EMP2;
    
    EMPNO ENAME JOB MGR HIREDATE SAL COMM DEPTNO
    ---------- ---------- --------- ---------- -------------- ---------- ---------- ----------
    7369 SMITH CLERK 7902 17-12月-80 800 20
    7499 ALLEN SALESMAN 7698 20-2月 -81 1600 300 30
    7521 WARD SALESMAN 7698 22-2月 -81 1250 500 30
    ……

    ============================================
    4.SCN 与 timestamp 关系
    Oracle 在内部都是使用scn,即使你指定的是as of timestamp,oracle 也会将其转换成scn,系统时间标记与scn 之间存在一张表,即SYS 下的SMON_SCN_TIME
    每隔5 分钟,系统产生一次系统时间标记与scn 的匹配并存入sys.smon_scn_time 表,该表中记录了最近1440个系统时间标记与scn 的匹配记录,由于该表只维护了最近的1440 条记录,因此如果使用as of timestamp 的方式则只能flashback 最近5 天内的数据(假设系统是在持续不断运行并无中断或关机重启之类操作的话)。
    注意理解系统时间标记与scn 的每5 分钟匹配一次这句话,举个例子,比如scn:339988,339989 分别匹配08-05-3013:52:00 和2008-13:57:00,则当你通过as of timestamp 查询08-05-30 13:52:00 或08-05-30 13:56:59 这段时间点内的时间时,oracle 都会将其匹配为scn:339988 到undo 表空间中查找,也就说在这个时间内,不管你指定的时间点是什么,查询返回的都将是08-05-30 13:52:00 这个时刻的数据。
    查看SCN 和 timestamp 之间的对应关系:
    SQL>select scn,to_char(time_dp,'yyyy-mm-dd hh24:mi:ss')from sys.smon_scn_time;

    《FROM:http://blog.csdn.net/tianlesoftware/article/details/4677378

    使用带有AS OF子句的SELECT语句进行闪回查询。闪回查询获取之前的时间点的数据。

    语句通过时间戳或SCN显示地引用过去的时间。返回在那个时间点当时已经提交的数据。

    闪回查询的使用包括:

    1. 恢复丢失的数据、撤销不正确的且已经提交的改变。例如,如果你错误地删除或更新了行并且提交了,可以立即撤销这个错误。

    2. 比较当前的数据和早些时候的数据。例如,可以运行一个日报表,来显示数据从昨天到今天的变化。

    可以比较单独的行;也可以查看行集合的交集和并集。

    3. 查看事务数据在特定的时间的状态。例如,可以验证某一天的帐户余额。

    4. 通过消除存储一些类型的临时数据所需要,简化应用程序的设计。Oracle允许你直接从数据库获取过去的数据。

    5. 对过去的数据应用打包的应用,例如报告产生工具。

    6. 为应用提供了错误改正的自我服务,允许用户undo和改变他们的错误。

    示例A. 检查和还原过去的数据
    假设12:30 PM发现员工Chung所对应的数据行被从employees表中删除了。并且你知道在9:30 AM时,Chung的数据在数据库中是正常的。可以使用闪回查询来查看在9:30 AM时表中的内容,来找到丢失的数据。如果需要,可以还原数据。

    -- 使用闪回查询获取丢失的行

    SELECT * FROM employees

    AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')

    WHERE last_name = 'Chung';

     

    --使用闪回查询还原丢失的行

    INSERT INTO employees (

      SELECT * FROM employees

      AS OF TIMESTAMP TO_TIMESTAMP('2004-04-04 09:30:00', 'YYYY-MM-DD HH:MI:SS')

      WHERE last_name = 'Chung'

    );


    Oracle闪回查询指导

    1. 可以对每个表指定或省略AS OF子句,对不同的表指定不同的次数。

    注意:如果一个表是闪回数据归档,并且指定了时间比它创建的时间还要早,则查询会返回0行,而不会引起错误。

    2. 可以在查询中使用AS OF子句来执行DDL操作(例如创建和截断表),

    也可以用来在和闪回查询相同的会话中执行DML操作(INSERT、DELETE)。

    3. 在影响数据库当前状态的DDL语句或DML语句中使用闪回查询的结果,

    可以在INSERT或CREATE TABLE AS SELECT语句中使用AS OF子句。

    4. 如果在应用中,这种3秒钟的误差对于闪回查询是重要的,则使用SCN而不是时间戳。

    5. 可以使用创建视图引用过的数据,即在视图定义的SELECT语句中使用AS OF子句。

    如果指定一个相对时间,即从数据库主机的当前时间减去,则对于每个查询,时间要重新计算。

    CREATE VIEW hour_ago AS

      SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);

    6. 可以在自连接或集合操作中使用AS OF子句,来提取和比较来自于不同时间的数据。

    可以通过在闪回查询之前加上CREATE TABLE AS SELECT或INSERT INTO TABLE SELECT,来存储闪回查询的结果。

    INSERT INTO employees

    (SELECT * FROM employees AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE))

    MINUS

    SELECT * FROM employees);

    The UNDO_MANAGEMENT parameter must be set to AUTO
    The UNDO_RETENTION parameter must be set appropriately

  • 相关阅读:
    三层架构补充
    复习三层架构
    复习DOM、JQuery
    复习HTML CSS JavaScript
    Git在新电脑拉github 上的项目
    超全的IE兼容性问题及解决方案
    JS操作iframe
    attachEvent和addEventListener
    HTTP 方法:GET 对比 POST
    原生JS+ CSS3创建loading加载动画;
  • 原文地址:https://www.cnblogs.com/rusking/p/4029752.html
Copyright © 2020-2023  润新知