使用 Oracle 闪回表恢复表

Oracle 闪回表使您能够将表恢复到其上一个时间点的状态。

它为恢复被用户或应用程序意外修改或删除的表提供了一种快速的在线解决方案。在许多情况下,Oracle 闪回表使您无需执行更复杂的时间点恢复操作。

Oracle 闪回表:

  • 将指定表中的所有数据恢复到时间戳或 SCN 描述的前一个时间点。

  • 在线执行还原操作。

  • 自动维护应用程序与闪回表一起运行所必需的所有表属性,例如索引、触发器和约束。

  • 在分布式环境中维护任何远程状态。例如,如果复制的表被闪回,则复制所需的所有表修改。

  • 保持约束指定的数据完整性。如果没有违反任何表约束,则表会被闪回。这包括在FLASHBACK TABLE语句中包含的表和语句中未包含的另一个表之间指定的任何参照完整性约束FLASHBACK TABLE

  • 即使经过闪回操作,原表中的数据也不会丢失。您可以稍后恢复到原始状态。

用Flashback表倒带表

闪回表使用撤消表空间中的信息而不是恢复的备份来检索表。发生闪回表操作时,将删除新行并重新插入旧行。在执行表的闪回时,您的数据库的其余部分仍然可用。

要将表格倒回到前一个时间点:

  1. 确保满足“闪回表的先决条件”中描述先决条件

  2. 对表执行闪回表操作,如执行闪回表操作中所述。

闪回表的先决条件

要执行闪回表操作,表必须有资格被闪回,并且执行该操作的用户必须具有所需的权限。

您必须具有以下权限才能使用闪回表功能:

  • 您必须已被授予FLASHBACK ANY TABLE系统特权,或者您必须对表具有FLASHBACK对象特权。

  • 您必须在该表上具有READor SELECTINSERTDELETEALTER特权。

  • 要将表闪回到还原点,您必须具有SELECT ANY DICTIONARYFLASHBACK 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在用户进行一些不正确的更新后执行表的闪回。使用以下步骤:

  1. 确保满足“闪回表的先决条件”中描述先决条件
  2. 将 SQL*Plus 连接到目标数据库并识别当前的 SCN。

不能回滚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.或者,查询表以检查数据。

 

 

 

 

 

 

 

posted @ 2022-10-05 11:41  wongchaofan  阅读(1983)  评论(0编辑  收藏  举报