[转帖]Oracle9i使用闪回操作_MySQL, Oracle及数据库讨论区_Weblogic技术|Tuxedo技术|中间件技术|Oracle论坛|JAVA论坛|Linux/Unix技术|hadoop论坛_联动北方技术论坛  
网站首页 | 关于我们 | 服务中心 | 经验交流 | 公司荣誉 | 成功案例 | 合作伙伴 | 联系我们 |
联动北方-国内领先的云技术服务提供商
»  游客             当前位置:  论坛首页 »  自由讨论区 »  MySQL, Oracle及数据库讨论区 »
总帖数
1
每页帖数
101/1页1
返回列表
0
发起投票  发起投票 发新帖子
查看: 3299 | 回复: 0   主题: [转帖]Oracle9i使用闪回操作        下一篇 
kim
注册用户
等级:中校
经验:1729
发帖:222
精华:0
注册:2011-7-21
状态:离线
发送短消息息给kim 加好友    发送短消息息给kim 发消息
发表于: IP:您无权察看 2011-8-11 10:03:32 | [全部帖] [楼主帖] 楼主

从9i开始,Oracle提供了闪回(FLASHBACK)功能。即查找当前时间之前的某个时间点系统或表的状态。

可以闪回的最大时间和回滚空间有关。如果使用了自动管理回滚表空间,那么UNDO_RETENTION给出了闪回支持的最小时间。也就是说,FLASHBACK最少可以支持UNDO_RETENTION给出的时间,如果系统比较闲,则可以闪回更长的时间。(当然,如果回滚表空间的空间分配不足,当系统处于忙时,有可能重用还没有达到UNDO_RETENTION时间限制的数据的空间)

使用闪回的一个前提是表不能进行DDL操作。不但不能对DDL操作进行回闪,而且,也无法闪回到DDL操作以前的数据了。

Oracle提供两种方法支持闪回:

一种是使用DBMS_FLASHBACK包,这是SESSION级的回闪。执行DBMS_FLASHBACK包的ENABLE_AT_TIME或者ENABLE_AT_SYSTEM_CHANGE_NUMBER过程后,当前session处于闪回状态,此时任何的查询返回的是ENABLE_AT_TIME指定的时间点或ENABLE_AT_SYSTEM_CHANGE_NUMBER指定的SCN的时刻对应的状态。当执行DISABLE过程后,系统恢复到当前状态。

这种方法是SESSION级别,此后对任何表的任意的查询语句都返回以前某个时间点的结果。不过缺点是闪回状态下,不支持DML语句。如果用以前的某个时间点的数据恢复当前数据,则必须ENABLE_AT_TIME后,打开一个游标,然后DIABLE闪回状态,然后从游标中读取数据并插入到当前表中。

第二种方式是采用AS OF语句,这是语句级的回闪。AS OF后面可以跟TIMESTAMP或SCN。通过在查询表后面直接加AS OF时间点的方式,可以查询到那一时刻的数据。这种方法直观方便,使用于恢复个别表,或对某个表提供基于时间点的访问。

下面给出一个例子:

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


会话已更改。

SQL> create table t (id number, name varchar2(30));


表已创建。

SQL> insert into t values (1, 'yangtingkun');


已创建 1 行。

SQL> commit;


提交完成。

SQL> select sysdate from dual;
SYSDATE
-------------------
2005-01-24 23:21:23
SQL> commit;


提交完成。

SQL> commit;


提交完成。

SQL> commit;


提交完成。

SQL> commit;


提交完成。

SQL> commit;


提交完成。

SQL> select sysdate from dual;
SYSDATE
-------------------
2005-01-24 23:26:05
SQL> delete t;


已删除 1 行。

SQL> commit;


提交完成。

SQL> commit;


提交完成。

SQL> exec dbms_flashback.enable_at_time(to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss'))


PL/SQL 过程已成功完成。

SQL> select * from t;
ID NAME
---------- ------------------------------
1 yangtingkun
SQL> exec dbms_flashback.disable


PL/SQL 过程已成功完成。

SQL> select * from t;


未选定行

SQL> select * from t as of timestamp to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss');
ID NAME
---------- ------------------------------
1 yangtingkun


上面给出了通过两种方法实现回闪查询的方法。在上面的例子中,我在执行insert命令和delete命令直接间隔了5分钟左右,且提交了一些空事务。这样做的原因是由于Oracle把时间点映射到SCN上,大约每5分钟左右映射依次。因此两个操作间隔5分钟,且保证两个操作间SCN发生了变化,从而使Oracle可以将timestamp正确的映射到不同的SCN上。

下面给出两种不同方法是如何实现数据恢复的。

SQL> select * from t;


未选定行

SQL> declare
2   cursor c is select * from t;
3   v_record c%rowtype;
4  begin
5   dbms_flashback.enable_at_time(to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss'));
6   open c;
7   dbms_flashback.disable;
8   loop
9    fetch c into v_record;
10    exit when c%NOTFOUND;
11    insert into t values (v_record.id, v_record.name);
12   end loop;
13   close c;
14  end;
15  /


PL/SQL 过程已成功完成。

SQL> select * from t;
ID NAME
---------- ------------------------------
1 yangtingkun
SQL> rollback;


回退已完成。

SQL> select * from t;


未选定行

SQL> insert into t
2  select * from t as of timestamp to_timestamp('2005-1-24 23:26:5', 'yyyy-mm-dd hh24:mi:ss');


已创建 1 行。

SQL> select * from t;
ID NAME
---------- ------------------------------
1 yangtingkun




赞(0)    操作        顶端 
总帖数
1
每页帖数
101/1页1
返回列表
发新帖子
请输入验证码: 点击刷新验证码
您需要登录后才可以回帖 登录 | 注册
技术讨论