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重新执行创建脚本即可。
阅读(1808) | 评论(0) | 转发(0) |