闪回表(Flashback table)运用

上一回演示了运用闪回表查询恢复delete删除的数据以及其原理,今天了解下闪回表。

原理:

   闪回表(Flashback table)与闪回查询(Flashback query)的原理大致相同,也是利用undo信息来恢复表对象到以前的某一个时间点(一个快照),因此也要确保AUM有足够的Retention值。但闪回表不等于闪回查询,其区别如下:

闪回查询只是查询以前的一个快照而已,并不改变当前表的状态。

闪回表则是将恢复当前表及附属对象一起回到以前的时间点。

 

特性:

1.   在线操作

2.   恢复到指定的时间点(或者SCN)的任何数据

3.   自动恢复相关属性

4.   满足分布式的一致性

5.   数据的一致性,所有相关对象将自动一致。

 

语法:

  SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss');

  SQL> flashback table tab_test to scn 1154953;

  SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 22:43:07', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

 

运用闪回表前提

   1.普通用户中需要有Flashback any table的系统权限。命令如:

   SQL>grant flashback any table to scott;

   2. 有该表的selectinsertdeletealter权限。

   3.必须保证该表有row movement(行移动)。

 

示例:

  1.创建tab_test

SQL> create table tab_test as select * from all_objects;

 

Table created

 

2.查询tab_test表中数据量

 

SQL> select count(*) from tab_test;

 

  COUNT(*)

----------

     40699

3.tab_test表创建索引和触发器(触发器为null,不做任何操作)

SQL> create index ind_test on tab_test(object_name);

 

Index created

 

SQL> create or replace trigger tr_test

  2  after update on tab_test

  3  for each row

  4  begin

  5      null;

  6 

  7  end tr_test;

  8  /

 

Trigger created

 

4.记录当时的时间点,试图恢复到该时间点

 

SQL> select to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss') time, to_char(dbms_flashback.get_system_change_number) scn from dual;

 

TIME                SCN

------------------- ----------------------------------------

2010-06-30 23:02:37 1160764

 

5.删除tab_test表中数据

 

SQL> delete from tab_test;

 

40699 rows deleted

 

SQL> commit;

 

Commit complete

 

6.查询删除数据后的tab_test,确定其表中已没有数据

SQL> select count(*) from tab_test;

 

  COUNT(*)

----------

7. 删除tab_test表中索引ind_test

SQL> drop index ind_test;

 

Index dropped

 

8.更改tr_test触发器

SQL> create or replace trigger tr_test

  2  after insert on tab_test

  3  for each row

  4  begin

  5      null;

  6 

  7  end tr_test;

  8  /

 

Trigger created

 

9.确保该表中的行迁移(row movement)功能

 

SQL> alter table tab_test enable row movement;

 

Table altered

 

10.恢复tab_test表到刚记录的时间点(或scn,由于表中存在触发器,因此使用了关键字enable triggers;

 

SQL> flashback table tab_test to timestamp to_timestamp('2010-06-30 23:02:37', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

 

Done

11.查看恢复结果如下:

SQL> select count(*) from tab_test;

 

  COUNT(*)

----------

     40699

 

SQL> select index_name from user_indexes where table_name = 'TAB_TEST';

 

INDEX_NAME

------------------------------

 

SQL> select object_name, status from user_objects where object_name in('TR_TEST', 'IND_TEST');

 

OBJECT_NAME                                                                      STATUS

------------------ -------

TR_TEST            VALID

 

SQL> set pages 0

SQL> set lines 1000

Cannot SET LINES

 

SQL> set long 2000

SQL> select text from user_source t where t.name = 'TR_TEST' order by line;

trigger tr_test

after insert on tab_test

for each row

begin

    null;

end tr_test;

 

总结:

1.  Flashback table在真正的高可用环境中,使用意义不大,受限比较多,要必须确保行迁移功能

2.  Flashback table过程中,阻止写操作

3.  表中数据能恢复,而表中索引确不能正常恢复

4.  恢复的触发器本身还是修改后的,并不随表flashback到修改以前的时间点。说明关键字enable triggers只能保证触发器的状态正常,而不是内容回滚.

5.  由于原理利用其undo信息,来恢复其对象,因此也是不能恢复truncate数据

6.  恢复数据用flashback query实现比较好

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/20948385/viewspace-666771/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/20948385/viewspace-666771/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值