Chinaunix首页 | 论坛 | 博客
  • 博客访问: 229341
  • 博文数量: 57
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 674
  • 用 户 组: 普通用户
  • 注册时间: 2013-11-30 22:48
个人简介

2014,换个角度,希望接下来的事情值得期待。

文章分类

全部博文(57)

文章存档

2015年(1)

2014年(55)

2013年(1)

我的朋友

分类: Oracle

2014-01-25 16:35:28

Flashback Query从undo表空间读取记录数据。对动态性能视图无效,对于dba_*,user_*,all_*等数据字典视图有效。 并且支持访问远端数据库。
事务在写数据时,会把前映像存放于undo表空间。因此对于查询,可通过undo表空间数据来构建所需要的记录集。
Flashback Query 支持多种方式查询。可以基于时间或者SCN。
一、AS OF TIMESTAMP示例
1.1查询当前日期格式
SQL> select sysdate from dual;

SYSDATE
--------------
25-1月 -14
1.2 设置当前日期格式
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
会话已更改。

SQL> select sysdate from dual;

SYSDATE
-------------------
2014-01-25 16:00:50
1.3 查询数据表
SQL> select * From testnamenew;


NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
1.4 模拟删除
SQL> delete from testnamenew;
已删除4行。
SQL> commit;
提交完成。
SQL> select * From testnamenew;

1.5 进行查询未删除前的数据
SQL> select sysdate from dual;

SYSDATE
-------------------
2014-01-25 16:03:30
1.5.1 第一种查询方式
SQL> select * From testnamenew as of timestamp sysdate - 4/1440;


NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
1.5.2第二种查询方式
SQL> select * From testnamenew as of timestamp to_timestamp('2014-01-25 16:00:00','yyyy-mm-dd hh24:mi:ss');

NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF
1.6插入数据
SQL> insert into testnamenew select * From testnamenew as of timestamp to_timestamp('2014-01-25 16:00:00','yyyy-mm-dd hh24:mi:ss')

已创建4行。

SQL> commit;

提交完成。
1.7 验证
SQL> select * From testnamenew;

NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF

二、AS OF SCN示例
对于单表AS OF TIMESTAMP足够使用,但是如果涉及主外键表恢复时,可能会由于时间点不同,造成插入失败,通过AS OF SCN则会保证记录一致性。
2.1查看当前SCN
SQL> conn / as sysdba;
已连接。
SQL>  select dbms_flashback.get_system_change_number from dual;

GET_SYSTEM_CHANGE_NUMBER
------------------------
                 4439298

SQL> select current_scn from v$database;

CURRENT_SCN
-----------
    4439313
SQL> delete from scott.testnamenew;

已删除4行。

SQL> commit;

提交完成。
SQL> select * from scott.testnamenew as of scn 4439313;

NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF


SQL> insert into scott.testnamenew select * from scott.testnamenew as of scn 4439313;

已创建4行。

SQL> commit;

提交完成。

SQL> select * from scott.testnamenew;

NAME
--------------------------------------------------
A%_WQ123
A%BWQ123
AB_WQ123
CD EF

三、Flashback Query 函数,触发器,存储过程,包等
Flashback Drop可以恢复表,索引等。如果是function,trigger,procedure,package等,则要结合all_source表进行查询
all_source表记录了当前用户有权限访问的存储对象的文本描述格式。
SQL> conn / as sysdba;
已连接。

SQL> select type from dba_source group by type;

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

已选择9行。

3.1创建测试程序

SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

会话已更改。

SQL> create or replace function getcurrentdate return date as
  2  v_date date;
  3  begin
  4     select sysdate into v_date from dual;
  5     return v_date;
  6  end;
  7  /

函数已创建。

SQL> select getcurrentdate() from dual;


GETCURRENTDATE()
-------------------
2014-01-25 16:28:57
3.2查看创建脚本
SQL> col text for a80;
SQL>  select text from user_source where name='GETCURRENTDATE' ORDER BY LINE;

TEXT
--------------------------------------------------------------------------------
function getcurrentdate return date as
v_date date;
begin
        select sysdate into v_date from dual;
        return v_date;
end;

已选择6行。

3.3 删除
SQL> drop function getcurrentdate;

函数已删除。

SQL>  select text from user_source where name='GETCURRENTDATE' ORDER BY LINE;

未选定行

3.4查询之前的创建语句
SQL> select text  from user_source as of timestamp to_timestamp('2014-01-25 16:31:00','yyyy-mm-dd hh24:mi:ss') where name='GETCURRENTDATE' order by line;

TEXT
--------------------------------------------------------------------------------
function getcurrentdate return date as
v_date date;
begin
        select sysdate into v_date from dual;
        return v_date;
end;

已选择6行。

3.5重新执行创建脚本即可。

阅读(1769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~