Oracle 闪回表使您能够将表恢复到其上一个时间点的状态。
它为恢复被用户或应用程序意外修改或删除的表提供了一种快速的在线解决方案。在许多情况下,Oracle 闪回表使您无需执行更复杂的时间点恢复操作。
Oracle 闪回表:
-
将指定表中的所有数据恢复到时间戳或 SCN 描述的前一个时间点。
-
在线执行还原操作。
-
自动维护应用程序与闪回表一起运行所必需的所有表属性,例如索引、触发器和约束。
-
在分布式环境中维护任何远程状态。例如,如果复制的表被闪回,则复制所需的所有表修改。
-
保持约束指定的数据完整性。如果没有违反任何表约束,则表会被闪回。这包括在
FLASHBACK TABLE
语句中包含的表和语句中未包含的另一个表之间指定的任何参照完整性约束FLASHBACK TABLE
。 -
即使经过闪回操作,原表中的数据也不会丢失。您可以稍后恢复到原始状态。
用Flashback表倒带表
闪回表使用撤消表空间中的信息而不是恢复的备份来检索表。发生闪回表操作时,将删除新行并重新插入旧行。在执行表的闪回时,您的数据库的其余部分仍然可用。
要将表格倒回到前一个时间点:
-
确保满足“闪回表的先决条件”中描述的先决条件。
-
对表执行闪回表操作,如“执行闪回表操作”中所述。
闪回表的先决条件
要执行闪回表操作,表必须有资格被闪回,并且执行该操作的用户必须具有所需的权限。
您必须具有以下权限才能使用闪回表功能:
-
您必须已被授予
FLASHBACK ANY TABLE
系统特权,或者您必须对表具有FLASHBACK对象特权。
-
您必须在该表上具有
READ
orSELECT
、INSERT
、DELETE
和ALTER
特权。
-
要将表闪回到还原点,您必须具有
SELECT ANY DICTIONARY
或FLASHBACK ANY TABLE
系统特权或SELECT_CATALOG_ROLE
角色。
要使对象符合闪回条件,必须满足以下先决条件:
-
对象不得包括以下类别:作为集群一部分的表、物化视图、高级队列 (AQ) 表、静态数据字典表、系统表、远程表、对象表、嵌套表或单个表分区或子分区。
-
表的结构在当前时间和目标闪回时间之间不得更改。
以下数据定义语言 (DDL) 操作会更改表的结构:升级、移动或截断表;对表添加约束,将表添加到集群;修改或删除列;添加、删除、合并、拆分、合并或截断分区或子分区(添加范围分区除外)。
-
必须在表上启用行移动,这表明在闪回发生后,rowids 会发生变化。
存在此限制是因为如果应用程序存储了闪回之前的 rowid,则无法保证这些 rowid 对应于闪回之后的相同行。如果您的应用程序依赖于 rowid,那么您不能使用闪回表。
- undo 表空间中的 undo 数据必须在时间上向后延伸足够远以满足闪回目标时间或 SCN。
您可以执行闪回表的时间点取决于撤消保留期(撤消数据在被回收之前保留的最短时间)和表空间特征。撤消数据包含有关数据块在更改之前的信息。闪回操作使用 undo 重新创建原始数据。
为确保闪回表操作保留撤消信息,Oracle 建议将UNDO_RETENTION
撤消表空间的参数设置为 86400 秒(24 小时)或更大。
笔记:
FLASHBACK
TABLE
...
TO
BEFORE
DROP
是使用闪回丢弃功能,而不是闪回表,因此不受这些先决条件的约束。有关详细信息,请参阅"Rewinding a DROP TABLE Operation with Flashback Drop"。
执行闪回表操作
要在一个或多个表上使用闪回表功能,请使用FLASHBACK TABLE
带有目标时间或 SCN 的 SQL 语句。
假设您希望hr.temp_employees
在用户进行一些不正确的更新后执行表的闪回。使用以下步骤:
假设您希望hr.temp_employees
在用户进行一些不正确的更新后执行表的闪回。使用以下步骤:
不能回滚FLASHBACK TABLE语句,但可以发出另一个FLASHBAack TABLE语句并指定当前时间之前的时间。因此,建议记录当前SCN。您可以通过如下查询V$DATABASE来获取它:
SELECT CURRENT_SCN FROM V$DATABASE;
3.确定要将表返回到的时间、SCN或还原点。
如果已创建还原点,则可以通过执行以下查询列出可用的还原点:
SELECT NAME, SCN, TIME FROM V$RESTORE_POINT;
4.确保存在足够的撤消数据,以将表倒回指定的目标。
如果设置了UNDO_RETENTION初始化参数,并且启用了撤消保留保证,则可以使用以下查询确定撤消数据的保留时间:
SELECT NAME, VALUE/60 MINUTES_RETAINED FROM V$PARAMETER WHERE NAME = 'undo_retention';
5.确保使用Flashback Table回放的所有对象都启用了行移动。
可以使用以下SQL语句为表启用行移动:
ALTER TABLE hr.temp_employees ENABLE ROW MOVEMENT;
6.确定要闪存的表是否依赖于其他表。如果存在依赖项,那么决定是否也刷新这些表。
您可以发出以下SQL查询来确定依赖项,其中schema_name是要闪存的表的模式,table_name是表的名称:
SELECT other.owner, other.table_name FROM sys.all_constraints this, sys.all_constraints other WHERE this.owner = schema_name AND this.table_name = table_name AND this.r_owner = other.owner AND this.r_constraint_name = other.constraint_name AND this.constraint_type='R';
7.对要闪回的对象执行FLASHBACK TABLE语句。
以下SQL语句将hr.temp_employees表返回到名为temp_emplopyees_update的还原点:
FLASHBACK TABLE hr.temp_employees TO RESTORE POINT temp_employees_update;
以下SQL语句将hr.temp_employees表倒带到其在SCN指定的时间的状态:
FLASHBACK TABLE hr.temp_employees TO SCN 123456;
如以下示例所示,还可以使用TO_TIMESTAMP指定目标时间点:
FLASHBACK TABLE hr.temp_employees TO TIMESTAMP TO_TIMESTAMP('2013-10-17 09:30:00', 'YYYY-MM-DD HH:MI:SS');
注意:时间戳到SCN的映射并不总是精确的。当将时间戳与FLASHBACK TABLE语句一起使用时,表格被刷新的时间最多可以变化为为to_TIMESTAMP指定的时间的3秒左右。如果需要精确的时间点,则使用SCN而不是时间。
8.或者,查询表以检查数据。
标签:闪回,SCN,temp,恢复,闪回表,Oracle,TABLE,FLASHBACK From: https://www.cnblogs.com/wonchaofan/p/16755319.html