Oracle Flashback技术总结(四)—— Flashback Table 和Flashback Data Archive

六、Flashback Table

        注意SYS用户下不支持闪回,这点前面已经说明过

1.flashback table 简介

Flashback Table也是使用UNDO tablespace的内容来实现对数据的回退。该命令相对简单,输入:flashback table table_name to scn(to timestamp) 即可。

注意:如果想要对表进行flashback,必须允许表的row movement.要查看某表是否启用row movement,可以到user_tables 中查询(或all_tables,dba_tables),


要启用或禁止某表row movement,可以通过下列语句:

SYS@ orcl>alter table test014 enable row movement;--启用 row movement

SYS@ orcl>alter table test014 disable row movement;--禁止 row movement


要查看某表是否启用row movement


SYS@ orcl>select row_movement from dba_tables where table_name='TEST014';

ROW_MOVE

--------

ENABLED


Flashback table 命令支持同时操作多个表,表名中间以逗号分隔即可,如果你执行一条flashback table命令时同时指定了多个表,要记住单个flashback table 是在同一个事务中,因此这些表的恢复操作要么都成功,要么都失败。如:flashback table a,b ,c to scn  1943060 ;


2、flashback table举例:

PROC@ orcl>select * from test015;


ID

----------

 1


PROC@ orcl>select sysdate,current_scn from v$database;

SYSDATE      CURRENT_SCN

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

2013-05-24 01:48:18 1943060


删除数据并恢复

PROC@ orcl>delete from test015;

1 row deleted.


PROC@ orcl>commit;

PROC@ orcl>alter table test015 enable row movement;

Table altered.


PROC@ orcl>flashback table test015 to scn 1943060;

或者:

 flashback table c to timestamp to_timestamp('2013-05-24 02:28:48','yyyy-mm-dd hh24:mi:ss');



七、undo简介


1. 基于undo 的表恢复,需要注意DDL 操作的影响

第三个就是修改并提交过数据之后,对表做过DDL 操作,包括:

drop/modify 列, move 表, drop 分区(如果有的话), truncate table/partition,这些操作会另undo 表空间中的撤销数据失效,对于执行过这些操作的表应用flashback query 会触发ORA-01466 错误。另外一些表结构修改语句虽然并不会影响到undo 表空间中的撤销记录,但有可能因表结构修改导致undo 中重做记录无法应用的情况,比如对于增加了约束,而flashback query 查询出的undo 记录已经不符合新建的约束条件,这个时候直接恢复显然不可能成功,你要么暂时disable 约束,要么通过适当逻辑,对要恢复的数据进行处理之后,再执行恢复。另外,flashback query 对v$tables,x$tables 等动态性能视图无效,不过对于dba_*,all_*,user_*等数据字典是有效的。同时该特性也完全支持访问远端数据库,比如select * from  tbl@dblink as of scn 360;的形式。 


2. 基于undo 的表恢复,需要注意事项
 

  flashback table 实际上做的也是dml 操作(会在被操作的表上加dml 锁),因此还需要注意triggers 对其的影响,默认情况下,flashback table to scn/timestamp 在执行时会自动disable 掉与其操作表相差的triggers,如果你希望在此期间trigger 能够继续发挥做用,可以在flashback table 后附加ENABLE TRIGGERS 子句。


3、Automatic Undo Management( 自动撤销管理表空间)

提到自动撤销管理表空间,就不得不提手动管理的回滚段在9i 之前,回滚段的管理和监控是需要dba手工介入的,创建合适的回滚段是件非常耗费dba 精力的事情,你可能需要不断关注oracle 运行状况很长一阵子时间后,通过不断的调整才能基本确认一段时期内回滚段的大小,一旦回滚段创建的不合适,就极有可能引起性能问题甚至错误,比如ora-1555 就是典型的回滚段设置不合适触发的。9i 之后呢(含9i),oracle 为了清晰它的整个概念,取消了回滚段这个说法(实际上并未取消回滚段),而完全以undo 来代替,这也它正好与redo 相对应,一个重做,一个撤销。回滚段可以不再由dba 手工介入,而是完全由它自己在运行时自动分配,这在一定程度上即解放了dba,也确实起到了提高性能的作用,比如采用自动管理表空间就可以最大程序的降低ora-1555发生的机率(注意是降低,不是避免,我们不可能创建一个无限大的回滚段,ora-1555 也并不完全是回滚段造成的,关于ora-1555 的问题这里就不深入讨论了,互联网上已经有太多文章描述和介绍该问题及解决方案)

是否起用自动管理的撤销表空间由二个初始化参数决定:UNDO_MANAGEMENT:值为AUTO 表示使用了自动撤销管理表空间,MANUAL 则表示手动管理;UNDO_TABLESPACE:当UNDO_MANAGEMENT 值为AUTO 时,该参数用来指定当前的undo 表空间名称。

初始化参数UNDO_RETENTION:该参数用来指定undo 记录保存的最长时间,以秒为单位,是个动态参数,完全可以在实例运行时随时修改通常默认是900 秒,也就是15 分钟。一定要注意,undo_retention 只是指定undo 数据的过期时间,并不是说,undo 中的数据一定会在undo表空间中保存15 分钟,比如说刚一个新事务开始的时候,如果undo 表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已过期,因此呢,这就又关联回了第一点,当你创建一个自动管理的undo 表空间时,还要注意其空间大小,要尽可能保证undo 表空间有足够的存储空间。同时还要注意,也并不是说,undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,它只是失效,只要不被别的事务覆盖,它会仍然存在,并可随时被flashback 特性引用。如果你的undo表空间足够大,而数据库又不是那么繁忙,那么其实undo_retention 参数的值并不会影响到你,哪怕你设置成1,只要没有事务去覆盖undo 数据,它就会持续有效。因此呢,这里还是那句话,要注意undo 表空间的大小,保证其有足够的存储空间。另外undo 表空间的大小,直接影响到flashback query 的查询能力:因为多版本查询所依赖的undo 数据都存储在undo 表空间中,该表空间越大,所能够存储的undo 数据自然也越多,如果该表空间可用空间非常小,别说flashback 了,恐怕正常查询都有可能触发ora-1555 吧。

只有在一种情况下,undo 表空间能够确保undo 中的数据在undo_retention 指定时间过期前一定有效,就是为undo 表空间指定Retention Guarantee,指定之后,oracle 对于undo 表空间中未过期的undo 数据不会覆盖,

SQL> Alter tablespace undotbs1 retention guarantee;--启用

SQL> Alter tablespace undotbs1 retention noguarantee;--禁用


八、Flashback Data Archive

1.Flashback Data Archive 简介

      虽然ORA-01555错误可以通过种种手段来避免和减少,但是随着时间的流逝,这些UNDO信息总会失去,那么能否将这些信息保存起来,使得数据库在一定的历史周期之内可以不断向后追溯,使得我们可以看到一个数据表在任意历史时间点上的切片呢?从Oracle Database 11g开始,Oracle 提供了一个这样的功能:闪回数据归档(Flashback Data Archive)。通过这一功能Oracle数据库可以将UNDO数据进行归档,从而提供全面的历史数据查询,也因此Oracle引入一个新的概念 Oracle Total Recall,也即Oracle全面回忆功能。闪回数据归档可以和我们一直熟悉的日志归档类比,日志归档记录的是Redo的历史状态,用于保证恢复的连续性;而闪回归档记录的是UNDO的历史状态,可以用于对数据进行闪回追溯查询;后台进程LGWR用于将Redo信息写出到日志文件,ARCH进程负责进行日志归档;在Oracle 11g中,新增的后台进程FBDA(Flashback Data Archiver Process)则用于对闪回数据进行归档写出:闪回归档数据甚至可以以年为单位进行保存,Oracle可以通过内部分区和压缩算法减少空间耗用,这一特性对于需要审计以及历史数据分区的环境尤其有用,但是注意,对于繁忙的数据库环境,闪回数据存储显然要耗用更多的存储空间。当然,用户可以根据需要,对部分表进行闪回数据归档,从而满足特定的业务需求。


2、Flashback Data Archive示例

创建基于ASSM自动段空间管理的表空间 

PROC@ orcl>create tablespace tpfda  datafile '/home/oracle/tpfda.dbf'  size 300m  segment space management auto;

创建undo表空间

PROC@ orcl>create undo tablespace undo_tpfda datafile '/home/oracle/undo_fda01.dbf' size 10M autoextend  off;

备注:为了测试方便,将undo表空间空间大小尽量设置比较小,以使得undo数据能够尽快老化

PROC@ orcl>alter system set undo_tablespace=undo_tpfda;--设置当前系统undo表空间

        创建闪回数据归档区

          PROC@ orcl>create flashback archive fa tablespace tpfda retention 1 month

       创建测试表和添加测试数据

PROC@ orcl>create table test017

    (

    id number,

    name varchar2(30)

    );

PROC@ orcl>begin

   for i in 1..10000 loop

      insert into test017(id,name) values(i,i);

  end loop;

 commit;

 end;

 /

开启对表进行数据归档

ROC@ orcl>alter table test017 flashback archive fa;

删除测试数据

PROC@ orcl>select current_scn from v$database;

PROC@ orcl>delete from test017

PROC@ orcl>commit;

查看归档数据

PROC@ orcl>select count(*) from test017 as of scn 1973282;

  COUNT(*)

----------

     1000

可以通过数据字典视图来查看关于闪回归档表的记录:

  select * from user_flashback_archive_tables;

闪回归档的数据字典:

     DBA_FLASHBACK_ARCHIVE

  DBA_FLASHBACK_ARCHIVE_TABLES

  DBA_FLASHBACK_ARCHIVE_TS

  USER_FLASHBACK_ARCHIVE

  USER_FLASHBACK_ARCHIVE_TABLES

  总之,闪回数据归档是Oracle 11g提供的重要增强之一,通过合理使用这一增强,可以为数据库提供更为全面的数据生命周期管理,Oracle关于UNDO技术的进化至此又迈进了重要的一步。

你可能感兴趣的:(Oracle数据库)