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

Flashback Query 种类:
Flashback Query 分 Flashback Query,Flashback Version Query, Flashback Transaction Query 三种。

flashback query 限制:
1. lashback query 对 v$tables,x$tables 等动态性能视图无效
2. 对于dba_*,all_*,user_*等数据字典是有效的

一 、 Flashback Query As of timestamp 的示例:

SQL> alter session set nls_date_format='YYYY-MM-DD hh24:mi:ss';
SQL> create table query as select * from user_objects;
SQL> select count(*) from query;
SQL> select sysdate from dual;
SYSDATE
-------------------
2015-03-13 16:29:13
SQL> delete from query;
SQL> commit;
SQL> select * from query;
no rows selected
--查看删除之前的状态:假设当前距离删除数据已经有 5 分钟左右的话:
SQL> select * from query as of timestamp sysdate-5/1440;
或者:
--知道误操作的准确时间,查看误操作之前的状态
SQL>select * from query as of timestamp to_timestamp('2015-03-13 16:29:13','YYYY-MM-DD hh24:mi:ss');
用 Flashback Query 恢复之前的数据:
SQL>Insert into query select * from query as of timestamp to_timestamp('2015-03-13 16:29:13','YYYY-MM-DD hh24:mi:ss');
14 rows created.
SQL> COMMIT;
SQL> select * from query;
14 rows selected.

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

补充:查看 SCN 和 timestamp 之间的对应关系:
select timestamp_to_scn(TO_TIMESTAMP_TZ('2015-03-13 16:52:30','YYYY-MM-DD HH24:MI:SS')) to_scn from dual;

二、 Flashback Query As of scn 的示例:

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

SQL> delete from query;
14 rows deleted.
SQL> commit;
--查看删除之前的状态:
SQL> select * from query as of scn 3473243;
14 rows selected.
用 Flashback Query 恢复之前的数据:
SQL> insert into query select * from query as of scn 3473243;
SQL> commit;
SQL> select count(*) from query;
COUNT(*)
----------
14

补充:查看 SCN 和 timestamp 之间的对应关系:
-- timestamp 转 scn
select timestamp_to_scn(TO_TIMESTAMP_TZ('2015-03-13 17:26:42','YYYY-MM-DD HH24:MI:SS')) to_scn from dual;
-- scn 转 timestamp
SQL> select scn_to_timestamp(3474603) scn from dual;

三、 Flashback Query 函数,存储过程,包,触发器等对象:

背景
Flashback Drop 可以闪回与表相关联的对象, 如果是其他的对象,比如function,procedure,trigger 等。 这时候,就需要使用到 ALL_SOURCE 表来进行 Flashback Query。

查看 dba_source 的所有 type
SQL> select type from dba_source group by type;

TYPE
------------
PACKAGE
PACKAGE BODY
TYPE BODY
FUNCTION
JAVA SOURCE
PROCEDURE
LIBRARY
TRIGGER
TYPE

9 rows selected.

恢复操作流程:
--创建函数:
create or replace function fadd(pEndNumber int) return int
as
i int;
result int;
begin
i:=0;
result:=0;
while i<=pEndNumber loop result:=result+i;i:=i+1; end loop;
return result;
end;
/

--记录时间
SQL> select sysdate from dual;
SYSDATE
-------------------
2015-03-13 17:26:42
--查询函数:
SQL> set serveroutput on;
SQL> select fadd(100) from dual;

FADD(100)
----------
5050
--查询 dba_source 表:
SQL> select text from dba_source where name='FADD' order by line;
TEXT
--------------------------------------------------------------------------------
10 rows selected.

drop 函数,在查询,记录不存在
SQL> drop function fadd;
Function dropped.
SQL> select text from dba_source where name='FADD' order by line;
no rows selected

使用我们的 Flashback Query 查询:
SQL>
select text from dba_source as of timestamp to_timestamp('2015-03-13 17:26:42','yyyy-mm-dd hh24:mi:ss') where name='FADD' order by line;

TEXT
--------------------------------------------------------------------------------
function fadd(pEndNumber int) return int
as
i int;
result int;
begin
i:=0;
result:=0;
while i<=pEndNumber loop result:=result+i;i:=i+1; end loop;
return result;
end;

10 rows selected.

text输出结果,重新执行一下就恢复回来了,其他的对象类推,不再演示。

四、 Flashback version Query:

相对于 Flashback Query 只能看到某一点的对象状态, Oracle 10g 引入的
Flashback Version Query 可以看到过去某个时间段内,记录是如何发生变化的。
根据这个历史,DBA 就可以快速的判断数据是在什么时点发生了错误,进而恢
复到之前的状态。

先看一个伪列 ORA_ROWSCN. 所谓的伪列,就是假的,不存在的数据列,
用户创建表时虽然没有指定,但是 Oracle 为了维护而添加的一些内部字段,这
些字段可以像普通文件那样的使用。ORA_ROWSCN 是 Oracle 10g 新增的,暂且把它看作是记录 最后一次 被修
改时的 SCN。 Flashback Version Query 就是通过这个伪列来跟踪出记录的变化历史。

实验流程:
SQL> create table andy (id int);
Table created.

SQL> insert into andy values(1);
1 row created.

SQL> insert into andy values(2);
1 row created.

SQL> commit;
Commit complete.

SQL> select * from andy;
ID
----------
1
2

SQL> select ora_rowscn, id from andy;
ORA_ROWSCN ID
---------- ----------
3476348 1
3476348 2

-- 查看历史信息
SQL>
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original')
"Operation", id from andy versions between scn minvalue and maxvalue;

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio ID
---------------- ----------------- --------------- -------- ----------
04000100830A0000 3476348 Insert 2
04000100830A0000 3476348 Insert 1
或者

ORA_ROWSCN 缺省是数据块级别的,也就是一个数据块内的所有记录都
是一个 ORA_ROWSCN,数据块内任意一条记录被修改,这个数据库块内的所
有记录的 ORA_ROWSCN 都会同时改变。

SQL> delete from andy where id>3;
2 rows deleted.

SQL>
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original')
"Operation", id from andy versions between scn minvalue and maxvalue;

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio ID
---------------- ----------------- --------------- -------- ----------
01000D00910A0000 3477149 Insert 5
01000D00910A0000 3477149 Insert 4
02000600000B0000 3477111 Insert 3
Original 1
Original 2

SQL> select * from andy;
ID
----------
1
2
3

SQL> commit;
Commit complete.

SQL>
Select versions_xid,versions_startscn,versions_endscn,
DECODE(versions_operation,'I','Insert','U','Update','D','Delete', 'Original')
"Operation", id from andy versions between scn minvalue and maxvalue;

VERSIONS_XID VERSIONS_STARTSCN VERSIONS_ENDSCN Operatio ID
---------------- ----------------- --------------- -------- ----------
06001900EF0A0000 3477710 Delete 5
06001900EF0A0000 3477710 Delete 4
01000D00910A0000 3477149 3477710 Insert 5
01000D00910A0000 3477149 3477710 Insert 4
02000600000B0000 3477111 Insert 3
Original 1
Original 2

7 rows selected.

SQL> select * from andy as of scn 3477710;
ID
----------
1
2
3

SQL> select * from andy as of scn 3477709;
ID
----------
1
2
3
4
5
SQL> insert into andy select * from andy as of scn 3477709;
5 rows created.

SQL> select * from andy;
ID
----------
1
2
3
1
2
3
4
5

8 rows selected.

说明: 可以根据 Flashback version Query 中的历史scn 找到 Flashback Query 的scn点。

闪回之 Flashback Query (dml表、过程、函数、包等)、Flashback version Query的更多相关文章

  1. FlashBack 闪回

    [学习目标] Flashback Database 功能非常类似与RMAN的不完全恢复,它可以把整个数据库回退到 过去的某个时点的状态,这个功能依赖于Flashback log日志.比RMAN 更快速 ...

  2. Oracle闪回技术(Flashback)

    闪回技术有闪回表.闪回删除.闪回查询.闪回事务查询.闪回事务.闪回数据库.闪回数据归档.其中,闪回查询.闪回事务查询用来“观察”过去:闪回数据归档并不是一个独立的功能,其功能是扩展闪回查询的时间窗口: ...

  3. 闪回flashback

    1.flashback query(使用UNDO)查询某个scn时该表的内容 SQL> select current_scn ; 已更新 行. ;        //查询之前scn时的值 ID ...

  4. mariadb的flashback到底怎么样???防误删可以,但算不上真正的闪回--再看mariadb 10.3的System-Versioned Tables

    mariadb 在10.2.4引入闪回特性,支持DML(INSERT, DELETE, UPDATE)操作的闪回,不支持DDL语句,使用闪回,必须设置binlog_row_image=FULL. 其原 ...

  5. 己亥清爽恢复系列之数据文件4篇:DROP表后如何恢复(非闪回技术)

    己亥清爽系列说明:清爽系列是作为恢复系列的基础篇,基于FS(File System)文件系统的手工还原恢复,也叫基于用户管理的还原恢复,来自于博客园AskScuti. 实验说明:你不小心Drop掉了一 ...

  6. Oracle闪回技术之一Oracle 11g 利用FlashTable (闪回表)恢复(用delete)误删的数据

    闪回表,实际上就是将表中的数据快速恢复到过去的一个时间点或者系统改变号SCN上.实现表的闪回,需要用到撤销表空间相关的UNDO信息,通过SHOW PARAMETER UNDO命令就可以了解这些信息.用 ...

  7. Oracle闪回flashback总结

    1.说明: Ø  采用的技术. 使用的是多个技术. 1.      闪回日志 2.      回收站 3.      回滚段 无法使用回收站的操作 Drop table xxx purge; Drop ...

  8. Oracle 闪回归档(Flashback Database)

    cmd --管理员身份打开 sqlplus / as sysdba --管理数据库 shu immediate; --独占方式开始 startup mount --修改日期模式 alter datab ...

  9. Oracle 闪回归档(Flashback Data Archive)

    --检查权限 SELECT * FROM dba_sys_privs WHERE privilege LIKE '%FLASH%'; --设置权限 GRANT dba TO testuser;--设置 ...

  10. Oracle闪回技术详解

     概述: 闪回技术是Oracle强大数据库备份恢复机制的一部分,在数据库发生逻辑错误的时候,闪回技术能提供快速且最小损失的恢复(多数闪回功能都能在数据库联机状态下完成).需要注意的是,闪回技术旨在快速 ...

随机推荐

  1. modelsim-altera

    一. 1.  Go to the menu Tools > Options.  2.  In the “General” category, select “EDA Tool Options”. ...

  2. 使用css counter来美化代码片段的样式

    博客园默认的代码片段样式不太美观,特别是复制代码时会把前面的行号也复制下来,操作起来比较麻烦.最近看到一种使用CSS计数器来美化代码片段的方法,于是研究了一下计数器的使用,在此做个笔记. 这是官网的例 ...

  3. Linux QtCreator 设置mingw编译器生成windows程序

    Qt跨平台,那必须在Linux平台编译一个可以在windows下运行的Qt程序才行,当然还得和QtCreator环境弄在一起才行 工作环境:Centos 7 yum install qt5-qt* m ...

  4. 开源项目WebImageView载入图片

    项目地址:https://github.com/ZaBlanc/WebImageView 作者对载入图片,以及图片的内存缓存和磁盘缓存做了封装. 代码量不多.可是可以满足一般的载入图片. 先看下项目结 ...

  5. Java Enum的使用

    最近为了便于对状态码的描述信息进行解析,学习了一下Enum的使用,发现还挺好使的. 首先,定义一个Enum的类Status,有两个属性statusValue状态码 以及 statusDesc状态描述 ...

  6. 导出到Excel中NPOI

    源地址:http://www.cnblogs.com/dreamof/archive/2010/06/02/1750151.html\ 1.NPOI官方网站:http://npoi.codeplex. ...

  7. [ACM] HDU 1533 Going Home (二分图最小权匹配,KM算法)

    Going Home Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Tota ...

  8. Mybatis资料

    1. 入门案例 https://www.cnblogs.com/xdp-gacl/p/4261895.html 2. 详细笔记 以及配套视频教程: 笔记:https://blog.csdn.net/S ...

  9. sql server charindex函数和patindex函数详解(转)

    charindex和patindex函数常常用来在一段字符中搜索字符或字符串.假如被搜索的字符中包含有要搜索的字符,那么这两个函数返回一个非零的整数,这个整数是要搜索的字符在被搜索的字符中的开始位数. ...

  10. 九度OJ 1153:括号匹配问题 (DP)

    时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:5193 解决:2248 题目描述: 在某个字符串(长度不超过100)中有左括号.右括号和大小写字母:规定(与常见的算数式子一样)任何一个左括 ...