Oracle Flashback之flashback table

来源:互联网 发布:历年乘用车销量数据 编辑:程序博客网 时间:2024/05/24 05:50

原文自:点击打开链接http://blog.csdn.net/waterxcfg304/article/details/8473711

一,Flashback Table功能描述
将数据表恢复到之前的一个时间点或SCN号。
注意:该功能将改变当前表及附属对象统一闪回到之前的一个状态。

二,需要修改的系统参数
undo_management,参数需要是“AUTO”,保证回滚段使用模式是SMU mode
undo_retention,单位是秒,调整可回滚的时间范围
确认系统的相关参数

三,原理
闪回表(Flashback table)与闪回查询(Flashback query)的原理大致相同,也是利用undo信息来恢复表对象到以前的某一个时间点(一个快照),因此也要确

保AUM(automatic undo management)有足够的Retention值。Flashback  table技术是以Undo segment中的内容为基础的, 因此受限于UNDO_RETENTON参数。要

使用flashback 的特性,必须启用自动撤销管理表空间。

但闪回表不等于闪回查询,其区别如下:
闪回查询只是查询以前的一个快照而已,并不改变当前表的状态。
闪回表则是将恢复当前表及附属对象一起回到以前的时间点。

四,特性:
1.  在线操作
2.  恢复到指定的时间点(或者SCN)的任何数据
3.  自动恢复相关属性
4.  满足分布式的一致性
5.  数据的一致性,所有相关对象将自动一致。

五,语法:
 SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss');
 SQL> flashback table flashback_table_test to scn 662421;
 SQL> flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

六,运用闪回表前提
  1,普通用户中需要有Flashback any table的系统权限。命令如:
  2.,有该表的select、insert、delete、alter权限。
  3,必须保证该表有row movement(行移动)。

七,下面是具体的实验:
SQL> show parameter undo

NAME                                 TYPE                   VALUE
------------------------------------ ---------------------- ------------------------------
undo_management                      string                 AUTO
undo_retention                       integer                900
undo_tablespace                      string                 UNDOTBS1


 1.创建flashback_table_test表
SQL> conn hr/hr
Connected.
SQL> create table flashback_table_test as select * from employees;

Table created.

2.查询flashback_table_test表中数据量
SQL> select count(*) from flashback_table_test;

  COUNT(*)
----------
       107

3.为flashback_table_test表创建索引和触发器(触发器为null,不做任何操作)
SQL>create index ind_test on flashback_table_test(employee_id);

SQL> create or replace trigger tr_test
after update on flashback_table_test
for each row
begin
       null;
end 
tr_test;
/

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
-------------------------------------- --------------------------------------------------------------------------------
2012-12-29 16:44:17                    662421


oracle 10g可以通过下面得到SCN。
SQL> SELECT current_scn from v$database;

CURRENT_SCN
-----------
     662403


5.删除flashback_table_test表中数据
SQL> delete from flashback_table_test;

107 rows deleted.


SQL> commit;

Commit complete.


6.查询删除数据后的flashback_table_test,确定其表中已没有数据
SQL> select count(*) from flashback_table_test;

  COUNT(*)
----------
         0


7.删除flashback_table_test表中索引ind_test

SQL> drop index ind_test;

Index dropped

8.更改tr_test触发器

SQL> create or replace trigger tr_test
after insert on flashback_table_test
for each row
begin
       null;
end 
tr_test;
/

Trigger created

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

SQL> alter table flashback_table_test enable row movement;

Table altered

10.恢复flashback_table_test表到刚记录的时间点(或scn),由于表中存在触发器,因此使用了关键字enable triggers;
SQL>  flashback table flashback_table_test to timestamp to_timestamp('2012-12-29 16:44:17', 'yyyy-mm-dd hh24:mi:ss') enable triggers;

Flashback complete.


11.查看恢复结果如下:(数据回来了)
SQL> select count(*) from flashback_table_test;

  COUNT(*)
----------
       107

但是索引没有回来
SQL> select index_name from user_indexes where table_name = 'flashback_table_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 line 100
SQL> set long 2000
SQL> select text from user_source t where t.name = 'TR_TEST';
trigger tr_test
after insert on flashback_table_test
for each row
begin
       null;
end
tr_test;

7 rows selected.


总结:

1. Flashback table在真正的高可用环境中,使用意义不大,受限比较多,要必须确保行迁移功能
2. Flashback table过程中,阻止写操作
3. 使用flashback table可以将delete方式删除的表闪回到之前某个时间点,而表中索引却不能正常恢复,因为drop索引的过程是不记录undo的。
4. 恢复的触发器本身还是修改后的,并不随表flashback到修改以前的时间点。说明关键字enable triggers只能保证触发器的状态正常,而不是内容回滚.
5. 由于原理利用其undo信息,来恢复其对象,因此也是不能恢复truncate数据
6. 恢复数据用flashback query实现比较好
7,flashback table功能不能够将被truncate的表内容恢复出来,原因也是truncate操作过程是不记录undo信息。

其他注意:
1.当闪回删除操作之前,如果某个键值如主键被重用,将导致违反主键约束,闪回失败。
2.若闪回所需要的UNDO信息不存在,将引发ORA-08180:no snapshot found based on specified time(未找到基于指定时间的快照)错误
3.如果受闪回影响的记录被其它用户锁定,将引发ORA-00054:resource busy and acquire with NOWAIT specified (资源忙碌)错误
4.表定义在闪回期间不能发生变化,否则导致ORA-01466:unable to read data - table definition has changed(表定义已变化)错误
5.闪回前未启用row movement,将收到ORA-08189: cannot flashback the table because row movement is not enabled 错误
6.对于存在参照关系的情况,建议将主表等一起实施闪回,否则,将收到ORA-02091: transaction rolled back,ORA-02291错误
7.SYS 模式中的表不能使用表闪回技术


0 0
原创粉丝点击