码迷,mamicode.com
首页 > 其他好文 > 详细

FlashbackQuery:SCN与timestamp示例

时间:2014-10-16 23:10:53      阅读:274      评论:0      收藏:0      [点我收藏+]

标签:style   blog   http   color   io   使用   ar   strong   sp   

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

FlashbackQuery:SCN与timestamp示例

标签:style   blog   http   color   io   使用   ar   strong   sp   

原文地址:http://www.cnblogs.com/rusking/p/4029752.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!