闪回表(Flashback table)运用
原理: ??闪回表(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; 运用闪回表前提 ??1.普通用户中需要有Flashback any table的系统权限。命令如: ??SQL>grant flashback any table to scott; ??2.有该表的select、insert、delete、alter权限。 ??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,确定其表中已没有数据 7.删除tab_test表中索引ind_test SQL> drop index ind_test; Index dropped 8.更改tr_test触发器 ?2?after insert on tab_test 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',sans-serif; font-size:13px; line-height:19px; margin:0cm 0cm 0pt"> Done 11.查看恢复结果如下: 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实现比较好 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |