适用于:
Oracle Server - Enterprise Edition - Version: 10.2.0.1 and later [Release: 10.2 and later ]
Information in this document applies to any platform.
目标:
* 闪回特性的依据是什么
* oracle 10g 闪回技术之间的区别
* 闪回特性的必要条件
* 数据库闪回的局限性
* 闪回Drop的局限性与约束
* 闪回表的局限性与约束
* 闪回查询的局限性与约束
解决方案
新的oracle 10g 闪回技术由如下部分组成:
* 闪回数据库
* 闪回Drop
* 闪回表
* 闪回版本查询
* 闪回事物查询
闪回表,闪回查询,闪回事物查询和闪回版本查询都是依靠于undo数据,记录每个对oracle更新的影响并且记录在更新中改变的数值。主要用于提供SQL查询读一致性和回滚事物,这些undo记录包含重建数据所要求的信息,因为它们在过去的时间被建立并且记录了从那时起所有的改变。
这些闪回技术和新的oracle 10g 有两个主要的区别,闪回数据库是依据先前的闪回日志里的镜像,但是传统的闪回技术依据的是undo数据,并且闪回drop也是依据一个叫做回收站的结构建立起来的,它是ORACLE用于管理被抛弃的数据库对象直到它们所占的空间需要用于存放新的数据。
* 闪回数据库
闪回数据库允许你闪回完整的数据库回到一个指定的时间点。
最好在一个完整的数据库上做一个不完全恢复作为替代,在ORECLE闪回数据库上使用不完全恢复最大的优点就是它能更快,更有效的闪回数据库。闪回数据库不是基于undo数据的,而是基于闪回日志的。
如何闪回数据库功能开始,那么闪回日志将会存放在闪回恢复区域。
在数据库正常运行期间,闪回日志是按顺序记录的,并且它们没有被归档。在闪回恢复区中,ORACLE自动的创建、删除、并修改闪回日志。你只需要关心闪回日志监的性能监控和闪回区域的指派的磁盘空间的大小。
闪回数据库所花的时间总量与你要闪回数据库的时间是成比例的,而不是将数据库完全恢复,这将花掉更多的时间。先前在闪回日志里的镜像只是用于恢复数据库到过去的一个时间点,和进一步恢复使得数据库在过去一个时间点的一致性状态。ORACLE将数据文件返回到之前的一个时间点,但包括辅助文件,比如初始化参数文件。
DB_FLASHBACK_RETENTION_TARGET 决定你可以回溯到多长时间闪回数据库的参数,他的单位是分钟。
这个参数DB_FLASHBACK_RETENTION_TARGET是再初始化参数文件中设置,间接的,决定保留多少的闪回日志数据。不过,为一个给定的时间内的数据库生成的闪回日志的大小可以有很大的不同,在特定数据库的工作量而定。如果更多的块被数据库所更新在指定的时间内,那么将在时间间隔中需要更多的磁盘空间来存放闪回日志数据。
V$FLASHBACK_DATABASE_LOG 视图可以帮助你估计你需要增加多少闪回恢复区域来存放闪回日志。在你开启闪回数据库日志记录后设置闪回保留目标,让数据库跑在一个正常的工作量底下,过一会,生成一个具有代表性的闪回日志样本。然后执行如下查询:
SQL> SELECT ESTIMATED_FLASHBACK_SIZE FROM V$FLASHBACK_DATABASE_LOG;
前提条件:
* 你必须拥有SYSDBA权限
* 已经为数据库准备了闪回恢复区域
* 数据库已经使用ALTER DATABASE FLASHBACK ON 语句进入FLASHBACK模式除非你正在闪。
到一个保留恢复点。
* 数据库必须在mount状态而不是open状态
闪回数据库的局限性:
因为闪回数据库通过撤销存在于数据文件的更改,当你执行命令时,它存在如下限制:
* 闪回数据库只可以撤销对ORACLE数据库数据文件的更改。它不能够用于修复介质故障,或者被意外
删除的数据文件。
* 你不能够使用闪回数据库撤销压缩数据文件的操作。
* 如果数据库控制文件从备份中恢复或者重建,所积累的的闪回日志信息将被丢弃。你不能使用FLASHBACK DATABASE 去回到 重构控制文件之前的任意一时间点。
* 当NOLOGGING操作正在进行,在目标时间闪回数据库,由于受NOLOGGING操作的影响,在数据
库对象和数据文件中可能会发生块损坏。例如,你执行一个直接路径的INSERT操作在NOLOGGING
模式下,并且操作在2005年四月九点到九点十五分进行,并且之后你需要闪回数据库要九点零七分,
在被直接路径INSERT的对象和数据文件的更新可能被忽略,因为在数据库闪回完成后发生的块损坏。
* 压缩数据文件或者丢弃表空间会妨碍闪回数据库
如果可能,请避免与NOLOGGING操作一起使用目标时间或SCN恢复数据库。并且,在NOLOGGING
操作之后马上进行一次完备或者增量备份。如果你希望在直接路径INSERT一类的操作后恢复到一个
时间点,可以考虑在LONGGING模式下执行操作。
* 闪回Drop
这个特性为意外删除表提供了一个恢复的方法。
闪回Drop提供了一个安全网当丢弃ORACLE10g对象的时候。当一个用户丢弃了一个表,ORACLE
便把它放在了回收站当中。直到用户决定永久的删除他们或者直到包含该表的表空间出现了空间限制
。回收站是一个虚拟的容器,所有的被丢弃的对象都存放在这里。用户查看回收站并且恢复被丢弃的
表和它相关的对象。
闪回Drop是可以用的,甚至在重启数据库之后:
前提条件:
在DROP TABLE操作之前先闪回一个表,你只需要必要的对象权限去丢弃表在drop操作之前
关于闪回Drop的局限性和约束:
* 回收站功能只使用于非系统,本地管理的表空间。
如果一个表在一个非系统、本地管理的表空间,但是一个甚至更多与它相关的段是在个字典管理表空
间之中的,那么这些对象是被回收站说保护的。
* 如果没有合适的空间指派给回收站,并且没有指定强制保留多长时间的被丢弃对象在回收站中。那么
根据系统活动,一个别丢弃的对象可能保留在回收站中几秒,或者几个月。
* 尽管ORACLE允许对回收站中的对象进行查询,但是你不可以对回收站中的对象使用DML或者DDL
语句。
视图对回收站中的对象使用DML或者DDL语句,你将看到如下信息:
ORA-38301: can not perform DDL/DML over objects in Recycle Bin
并且,你将在警告日志文件中看到以下信息:
performing DML/DDL operation over object in bin.
performing DML/DDL operation over object in bin.
References : Note 578075.1 - performing DML/DDL operation over object in bin ORA-38301
* 你可以对回收站里的表执行闪回查询,但是只能使用回收站中表的名字,不能使用它原来的名字。
* 一个表和所有它有关的对象(indexes (except for bitmap join indexes), LOB segments, nested tables, triggers, constraints and so on) 将一并被放到回收站中,当你删除表的时候。一样的,当你执行闪回Drop的时候,相关的对象也会一并给恢复回来。这是可能的,然而,一些有关对象诸如索引可能已经被回收迫于空间压力。在这样的例子中,相关对象是不会从回收站中被回收的。
* 出于对安全的考虑,细粒度审计和虚拟专用数据库策略指定的表是不备回收站所保护的。
* 分区索引组织表是不被回收站所保护的。
* 回收站是不会保存表的参照约束的(虽然其他约束是可能被保存的).如果一个表在它被丢弃之前有参照
约束(即放置在回收站中)当你从回收站中闪回Drop,参照约束将会重建。
* 当你丢弃一个表,所有指定义在表上的物化视图日志将被丢弃但是不会存放在回收站之中。因此,物化
视图日志不能和表一起被闪回。
* 当你丢弃一个表,任何在表上的索引都被丢弃并且和表一并被放入到回收站当中。如果后来出现空间不足的情况,那么数据库将首先清除回收站中索引。在这种情况下,当你闪回一个表,你可能就不能得到定义在该表上的索引了。
* 如果用户或者ORACLE数据库做了空间导出清理操作,那么你将不能闪回表,如果它已经被清除。
* ORACLE数据库保留所有的保存在回收站中的表的索引,除了位图连接索引和区域索引。(位图连接索引和区域索引不放在回收站之中,当你使用DROP TABLE操作,所以不能回复)
* 闪回表:
闪回表发生作用是通过回滚发生在一个表或者多个表和它们的相关对象,如索引上的改变。
注意闪回表和闪回DROP是不同的:闪回表是撤销存在表最近的事物,然而闪回DROP是恢复一个被丢弃掉的表:闪回表使用撤销表空间数据,然而闪回DROP使用回收站。
在任意数量的逻辑损坏发生在表上之前,FLASHBACK TABLE命令将一个或者多个表回复到某个时间点。为了能够闪回表,你必须运行表进行行移动,因为DMO操作被用于将表带回它更早的状态,表的ROWIDs已经发生了改变,因此, 闪回表是不能应用在表的ROWIDs是固定不变得表上的。
在执行闪回表操作之前,你首先必须开启行移动功能,如下面的语法:
SQL> alter table
enable row movement;
前提条件:
* 要闪回一个表到更早的SCN或者是时间戳,你必须要么拥有闪回表对象权限要么拥有闪回任意表系统权限。另外,你必须在表上有SELECT, INSERT, DELETE, 和 ALTER 对象权限。
* 在闪回列表中,行移动必须对所有的表全部开放,除非你正在闪回表到BEFORE DROP。该操作叫
闪回DROP操作,并且它用的是回收站中被丢弃的数据而不是撤销数据。
* 要闪回一个表到一个恢复点,你必须拥有SELECT ANY DICTIONARY 或FLASHBACK ANY TABLE系统权限或者SELECT_CATALOG_ROLE角色。
闪回表的局限性和约束:
* 闪回表操作对以下类型的对象无效:表是簇的一部分,物化视图,远程表,对象表,嵌套表,或者单个表分区或者子分区。
* 之后的DDL操作改变了表的构架,所以随后你不能使用SCN或者TO TIMESTAME子句去闪回表到这些操作之前的时间:upgrading, moving, or truncating a table; adding a constraint to a table, adding a table to a cluster; modifying or dropping a column; adding, dropping, merging, splitting, coalescing, or truncating a partition or subpartition(除了增加范围分区)。
* 你不能回滚一个 FLASHBACK TABLE 指令。但是,你可以执行另一个FLASHBACK TABLE 指令并指定一个比当前时间早的时间来恢复。因此,在执行FLASHBACK TABLE子句之前记录下当前的SCN号是明智的。
* 闪回查询
闪回查询,从ORACLE9i 开始提供,已经增强为包括两种新类型的查询:
闪回版本查询和闪回事务查询。
闪回版本查询允许一个用户或者DBA去查看到一个表两个时间点之间的所有版本,并且闪回事物查询你可以看到两个时间之间所有事物改变。
闪回版本查询提供了一个更容易的方法去展示一个表里面两SCNs 或 时间戳之间所有行的所有版本,行是否被插入,删除,或是更新。甚至如果行被删除并且重新插入多次,所有的改变都可以从闪回查询中得到。
闪回事务查询,相比之下,根据事务ID将表的历史改变区分开来。使用闪回版本查询,你可以找到事务改变德工资信息,但是你不知道是谁进行了这些改变,闪回事务查询提供了这种额外的细节等级。
相比之下,引用实际表的闪回版本查询,闪回事务查询使用数据字典视图FLASHBACK_TRANSACTION_QUERY 去恢复包含在一个事务中的所有表的事务信息。该视图提供SQL指令你可以用来撤销特定事务做出的改变。
前提条件:
* 要执行ORACLE 闪回版本查询,你必须拥有目标的SELECT权限。另外,你要么拥有FLASHBACK TABLE对象权限在对象上,要么就拥有FLASHBACK ANY TABLE系统权限。
* 要执行ORACLE闪回事务查询,你必须拥有FALSHBACK TABLE 对象权限在对象选择列表中,另外,你必须拥有SELECT ANY TRANSACTION系统权限。
* 对于DBMS_FLASHBACK包,赋予EXECUTE权限到DBMS_FLASHBACK来提供访问这个包中的功能,DBMS_FLASHBACK包提供了相同的闪回查询功能,但是闪回查询有时候更方便。
* 要在ORACLE 10g 中使用使用闪回事务查询特性,数据库必须跑的是10.版本兼容,并且必须补充日志添加下面的SQL语句:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
闪回查询的局限性和约束:
* 你不可以在AS OF子句中指定一个子查询。
* 你不可以在临时的、外部表、固定表,或者簇的一部分使用VERSIONS子句,在闪回查中
* 你不可以在试图中使用VERSIONS子句闪回查询。但是,你可以在定义查询视图中使用VERSIONS语法。
* 闪回查询不撤销任何东西,它只是一个查询结构。你可以得到闪回查询的输出并且自己通过各种方法运行撤销。
* 闪回查询不会告诉你什么改变了,但日志监控会告诉你。
* 闪回查询可以撤销改变并且非常有效如果你直达哪些行需要被及时移动回去。你可以使用它来及时的移动整个表,但是代价是很高的如果该表是一个大表因为它设计到全表复制。
* 闪回查询不通过DDL操作来修改列,或者丢弃或者清除表。
* LogMiner 很适合找回改变的记录,不过他仅仅是提供对应的 DML语句,并非被修改行的前镜像与后镜像。这些情况在某些应用中很难处理。
相关文档
--------------------------
Oracle� Database Concepts 10g
Oracle� Database Backup and Recovery Basics 10g
参考文献
NOTE:249319.1 - Configure flashback database
NOTE:270060.1 - Use Flashback Table Feature and Resolve errors
NOTE:270535.1 - Restrictions on Flashback Table Feature
NOTE:317499.1 - 10G Oracle Flashback Transaction Query - Introduction and usage
NOTE:369755.1 - Flashback Logs-Space management
NOTE:578075.1 - performing DML/DDL operation over object in bin ORA-38301
显示相关信息
产品
* Oracle Database Products > Oracle Database > Oracle Database > Oracle Server - Enterprise Edition
关键字
DBMS_FLASHBACK; V$FLASHBACK_DATABASE_LOG; FLASH RECOVERY AREA; DATABASE RECOVERY