Flashback Oracle文档阅读

和Flashback相关的文档大多位于备份和恢复用户指南
Oracle 数据库开发指南中。

基本概念

请参看备份和恢复用户指南的1.4 About Oracle Flashback Technology

Oracle Flashback Technology的定义:

A set of Oracle Database features that provide an additional layer of data protection. These features include Oracle Flashback Query, Oracle Flashback Version Query, Oracle Flashback Transaction Query, Oracle Flashback Transaction, Oracle Flashback Table, Oracle Flashback Drop, and Oracle Flashback Database. 是一组技术,是备份和恢复的补充

You can use flashback features to view past states of data and rewind parts or all of your database. In general, flashback features are more efficient and less disruptive than media recovery in most situations in which they apply. 可以查看或回退,通常比备份和恢复更轻量级

逻辑 Flashback 特性

除了Flashback Database之外的闪回技术都是逻辑闪回,不依赖于RMAN。

所谓逻辑,是因为这些特性都是在逻辑层面操作的,而后续提到的Flashback Database是在物理层面操作的,依赖于RMAN。

除了Oracle Flashback Drop,逻辑闪回特性依赖于undo数据,undo数据记录了每次数据库更新的效果和更新中被覆盖的值。

Oracle 数据库包括以下逻辑闪回特性:

  • Oracle Flashback Query
    您可以指定目标时间并对数据库运行查询,查看在目标时间出现的结果。要从不需要的更改(如表更新)中恢复,您可以选择错误发生前的目标时间并运行查询以检索丢失行的内容。Oracle 数据库开发指南解释了如何使用这个特性。

  • Oracle Flashback Version Query
    您可以查看指定时间间隔内曾经存在于一个或多个表中的所有行的所有版本。您还可以检索有关行的不同版本的元数据,包括开始和结束时间、操作以及创建该版本的事务的事务 ID。您可以使用此功能来恢复丢失的数据值并审核对查询表的更改。Oracle 数据库开发指南解释了如何使用这个特性。

    扫描二维码关注公众号,回复: 15081236 查看本文章
  • Oracle Flashback Transaction Query
    您可以查看单个事务或特定时间段内所有事务所做的更改。Oracle 数据库开发指南解释了如何使用这个特性。

  • Oracle Flashback Transaction
    您可以撤销交易。Oracle 数据库确定事务之间的依赖关系,并实际上创建一个补偿事务来撤销不需要的更改。数据库倒回到一种状态,就好像该事务以及可能依赖于它的任何事务从未发生过一样。Oracle 数据库开发指南解释了如何使用这个特性。

  • Oracle Flashback Table
    您可以将一个表或一组表恢复到更早的指定时间点,而无需使数据库的任何部分脱机。在许多情况下,闪回表消除了执行更复杂的时间点恢复操作的需要。闪回表在恢复表的同时自动维护关联的属性,例如当前索引、触发器和约束,从而使您能够避免查找和恢复特定于数据库的属性。“Rewinding a Table with Flashback Table”解释了如何使用此功能。

  • Oracle Flashback Drop
    您可以撤销DROP TABLE 语句的效果。“Rewinding a DROP TABLE Operation with Flashback Drop”解释了如何使用此功能。

flashback data archive使您能够使用一些逻辑闪回功能来访问很久以前的数据。 闪回数据存档由一个或多个表空间或部分表空间组成。 创建闪回数据存档时,指定名称、保留期和表空间。 您还可以指定默认的闪回数据存档。 数据库会在保留期到期后的第二天自动清除旧的历史数据。

您可以为单个表打开和关闭闪回归档。 默认情况下,每个表的闪回归档都是关闭的。

Flashback Database

闪回数据库使您能够将 Oracle 数据库恢复到以前的时间点。

物理层面,Oracle 闪回数据库提供了一种比数据库时间点恢复 (DBPITR)更有效的数据保护替代方案。如果当前数据文件有不需要的更改,那么您可以使用 RMAN 命令FLASHBACK DATABASE将数据文件恢复到它们过去的内容。最终产品很像 DBPITR 的结果,但通常要快得多因为它不需要从备份中恢复数据文件,并且比介质恢复需要更少的重做

Flashback Database使用flashback logs访问过去版本的数据块和归档重做日志中的一些信息。闪回数据库要求您为数据库配置一个fast recovery area,因为闪回日志只能存储在那里。默认情况下不启用闪回日志记录。用于闪回日志的空间由数据库自动管理,并与快速恢复区中其他文件所需的空间进行平衡。

Oracle 数据库还支持还原点以及闪回数据库和备份与恢复。 restore point是对应于system change number (SCN)的别名。如果您预计需要将部分或全部数据库恢复到当时的内容,则可以随时创建还原点。guaranteed restore point 确保您可以使用闪回数据库将数据库返回到还原点的时间。

Rewinding a Database with Flashback Database”了解如何使用FLASHBACK DATABASE命令 执行闪回数据库

备份和恢复指南:5.10.2.1 Considerations When Setting the Size of the Fast Recovery Area

如果您计划启用闪回日志记录,那么闪回日志生成量大约与重做日志生成量相同。 例如,如果您打算将 DB_FLASHBACK_RETENTION_TARGET 设置为 24 小时,并且如果数据库每天生成 20 GB 的重做,那么一般的经验法则是允许 20 GB 到 30 GB 的磁盘空间用于闪回日志。 启用闪回日志记录时,同样的规则适用于保证还原点。 例如,如果数据库每天产生20GB的重做,并且保证还原点保留一天,那么计划分配20到30GB。

几个术语:

The return of the whole database to a prior consistent SCN by the FLASHBACK DATABASE command in RMAN or SQL. A database flashback is different from traditional media recovery because it does not involve the restore of physical files, instead restoring your current data files to past states using saved images of changed data blocks. This feature uses flashback logs and archived redo logs.

The recovery of an entire database to a specified past target time, SCN, or log sequence number.

Oracle-generated logs used to perform flashback database operations. The database can only write flashback logs to the fast recovery area. Flashback logs are written sequentially and are not archived. They cannot be backed up to disk.

  • fast recovery area
    An optional disk location that you can use to store recovery-related files such as control file and online redo log copies, archived redo log files, flashback logs, and RMAN backups. Oracle Database and RMAN manage the files in the fast recovery area automatically. You can specify the disk quota, which is the maximum size of the fast recovery area. Formerly referred to as flash recovery area.

  • restore point

A user-defined a name associated with an SCN of the database corresponding to the time of the creation of the restore point. A restore point can be a guaranteed restore point or a normal restore point.

  • system change number (SCN)
    A stamp that defines a committed version of a database at a point in time. Oracle assigns every committed transaction a unique SCN.

  • guaranteed restore point
    A restore point for which the database is guaranteed to retain the flashback logs for an Oracle Flashback Database operation. Unlike a normal restore point, a guaranteed restore point does not age out of the control file and must be explicitly dropped. Guaranteed restore points use space in the fast recovery area, which must be defined.

和Flashback相关的后台进程

RVWR和FBDA,都是可选的。前者与Flashback Database相关,后者Flashback Data Archive(也称为Flashback Time Travel)相关。
在这里插入图片描述

详见Database Concepts和Oracle Database 21c Technical Architecture。

使用Flashback技术

参看数据库开发指南的第20章Using Oracle Flashback Technology

Overview of Oracle Flashback Technology

Oracle 闪回技术是一组 Oracle 数据库特性,使您可以查看数据库对象的过去状态或将数据库对象返回到以前的状态,而无需使用时间点介质恢复。

使用闪回功能,您可以:

  • 执行返回过去数据的查询
  • 执行返回显示数据库更改详细历史记录的元数据的查询
  • 将表或行恢复到以前的时间点
  • 自动跟踪和归档交易数据变更
  • 数据库保持在线的情况下回滚事务及其相关事务

Oracle 闪回功能使用Automatic Undo Management (AUM) 系统来获取事务的元数据和历史数据。他们依赖于撤销数据(undo data),这是对单个事务影响的记录。例如,如果用户运行UPDATE语句将薪水从 1000 更改为 1100,则 Oracle 数据库会将值 1000 存储在撤消数据中。

撤消数据是持久的并且在数据库关闭后仍然存在。它会保留由undo_retention(默认15分钟)指定的时间,或者在存在自动撤消管理 (AUM) 的情况下达到调整的撤消保留时间。通过使用闪回功能,您可以使用撤消数据来查询过去的数据或从逻辑损坏中恢复。除了在闪回特性中使用它之外,Oracle 数据库还使用撤销数据来执行这些操作:

  • 回滚活动事务
  • 使用数据库或进程恢复来恢复终止的事务
  • 为 SQL 查询提供读取一致性

注意:执行CREATE TABLE语句后,至少等待 15 秒提交任何事务,以确保 Oracle 闪回功能(尤其是 Oracle 闪回版本查询)反映这些事务。

注意:Oracle 数据库建议避免使用versions_starttime或列 versions_endtimescn_to_timestamp
VERSIONS查询(包括CTAS查询)以提高性能。

在文档Database Concepts的Data Consistency部分写道:

Oracle Database always enforces statement-level read consistency, which guarantees that the data that a single query returns is committed and consistent for a single point in time. Depending on the transaction isolation level, this point is the time at which the statement was opened or the time the transaction began. The Oracle Flashback Query feature enables you to specify this point in time explicitly.

应用开发相关的闪回特性:

  • Flashback Query
    通过SELECT的AS OF子句返回较早时间的数据
  • Flashback Version Query
    使用此功能检索特定时间间隔内的元数据和历史数据(例如,查看给定时间间隔内曾经存在的表的所有行)。每个行版本的元数据包括开始和结束时间、更改操作的类型以及创建行版本的事务的标识。要创建 Oracle 闪回版本查询,请使用SELECT语句的VERSIONS BETWEEN子句。
  • Flashback Transaction Query
    使用此功能检索给定事务或给定时间间隔内所有事务的元数据和历史数据。要执行 Oracle 闪回事务查询,请查看静态数据字典视图FLASHBACK_TRANSACTION_QUERY。Flashback Version Query可为感兴趣的行提供事务 ID。
  • DBMS_FLASHBACK Package
    使用此功能可将内部 Oracle 数据库时钟设置为较早的时间,以便您可以检查当时的最新数据,或在数据库保持联机状态时回滚事务及其相关事务。
  • Flashback Transaction
    使用闪回事务在数据库保持联机状态时回滚事务及其相关事务。此恢复操作使用undo数据来创建和运行相应的补偿事务,将受影响的数据返回到其原始状态。(闪回交易是DBMS_FLASHBACK包的一部分)。
  • Flashback Time Travel
    使用闪回时间旅行自动跟踪和存档对闪回存档启用的表的更改的历史版本,确保对数据库对象版本的 SQL 级别访问,而不会出现快照太旧的错误。

偏数据库管理的闪回特性主要用于数据恢复。通常,您仅作为数据库管理员使用这些功能。包括:

  • Flashback Table
    使用此功能可以将表恢复到之前某个时间点的状态。您可以在数据库联机时恢复表,仅撤消对指定表的更改。
  • Flashback Drop
    使用此功能可以恢复已删除的表。此功能反转DROP TABLE语句的效果。
  • Flashback Database
    使用此功能可以通过使用恢复区将数据库快速恢复到较早的时间点。这很快,因为您不必恢复数据库备份。

Configuring Your Database for Oracle Flashback Technology

20.2.1 Configuring Your Database for Automatic Undo Management

要把数据库配置为Automatic Undo Management (AUM),必须:

  • 创建一个具有足够空间的undo表空间以保留闪回操作所需的数据。
    用户更新数据的频率越高,需要的空间就越大。数据库管理员通常会计算空间需求。

  • 启用 AUM。配置以下数据库初始化参数:

    • UNDO_MANAGEMENT(默认就是AUM)
    • UNDO_TABLESPACE
    • UNDO_RETENTION

    对于固定大小的撤消表空间,Oracle 数据库自动调整系统以提供最佳的undo保留时间。对于可自动扩展的undo表空间,Oracle数据库保留undo数据的时间长于UNDO_RETENTION参数指定的最长查询持续时间和undo保留的低阈值。
    你可以查询V$UNDOSTAT。TUNED_UNDORETENTION以确定为当前撤消表空间保留撤消的时间量。
    设置UNDO_RETENTION不保证未过期的undo数据不被丢弃。如果系统需要更多空间,Oracle 数据库可以用最近生成的撤消数据覆盖未过期的撤消。

  • 指定undo表空间的RETENTION GUARANTEE子句,保证未过期的undo数据不被丢弃。

20.2.2 Configuring Your Database for Oracle Flashback Transaction Query

要为 Oracle 闪回事务查询功能配置数据库,您或您的数据库管理员必须:

  • 确保 Oracle 数据库以版本 10.0 的兼容性运行。
  • 启用补充日志记录:
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

启用过程示例:

SQL> select SUPPLEMENTAL_LOG_DATA_MIN MIN, SUPPLEMENTAL_LOG_DATA_PK PK, SUPPLEMENTAL_LOG_DATA_UI UI, SUPPLEMENTAL_LOG_DATA_ALL ALL_LOG from v$database;

MIN      PK  UI  ALL
-------- --- --- ---
NO       NO  NO  NO

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> select SUPPLEMENTAL_LOG_DATA_MIN MIN, SUPPLEMENTAL_LOG_DATA_PK PK, SUPPLEMENTAL_LOG_DATA_UI UI, SUPPLEMENTAL_LOG_DATA_ALL ALL_LOG from v$database;

MIN      PK  UI  ALL
-------- --- --- ---
YES      NO  NO  NO

20.2.3 Configuring Your Database for Flashback Transaction

配置过程如下:

-- 启用归档
ALTER DATABASE ARCHIVELOG;
-- 打开至少一个archive log
ALTER SYSTEM ARCHIVE LOG CURRENT;
-- 如果之前没有配置,启用最小和主键补充日志记录
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
-- 如果要跟踪外键依赖,请启用外键补充日志记录
-- 如果您有很多外键约束,启用外键补充日志记录可能不值得性能损失。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;

20.2.4 Enabling Oracle Flashback Operations on Specific LOB Columns

要对表的特定 LOB 列启用闪回操作,请使用带有RETENTION选项 的ALTER TABLE语句。

由于 LOB 列的撤消数据可能非常庞大,因此您必须定义哪些 LOB 列用于闪回操作。

20.2.5 Granting Necessary Privileges

您或您的数据库管理员必须向必须使用这些闪回功能的用户、角色或应用程序授予权限。即查询相应表的权限,执行相应过程的权限。

对于 Oracle 闪回查询和 Oracle 闪回版本查询

  • 要允许在查询期间访问特定对象,请授予这些对象的读取权限或FLASHBACK权限。
  • 要允许对所有表进行查询,请授予FLASHBACK ANY TABLE权限。

对于 Oracle 闪回事务查询

  • 授予SELECT ANY TRANSACTION特权。
  • 要允许执行由 Oracle 闪回事务查询返回的撤消 SQL 代码,请授予SELECT、UPDATE、DELETE和INSERT特定表的权限。

对于 DBMS_FLASHBACK 包

  • 要允许访问DBMS_FLASHBACK包中的功能,请授予对DBMS_FLASHBACK的EXECUTE权限。

对于闪回时间旅行

要允许特定用户启用表上的闪回时间旅行功能,或使用特定的闪回存档,请将闪回存档的FLASHBACK ARCHIVE对象权限授予该用户。要授予FLASHBACK ARCHIVE对象特权,您必须以SYSDBA系统身份登录 具有FLASHBACK ARCHIVE ADMINISTER系统特权。

要允许执行这些语句,请授予FLASHBACK ARCHIVE ADMINISTER系统权限:

  • CREATE FLASHBACK ARCHIVE
  • ALTER FLASHBACK ARCHIVE
  • DROP FLASHBACK ARCHIVE

要授予FLASHBACK ARCHIVE ADMINISTER系统权限,您必须以SYSDBA身份登录。

要使用CREATE/ALTER FLASHBACK ARCHIVE创建默认闪回存档,您必须以SYSDBA身份登录。

要为已启用闪回存档的表禁用闪回存档,您必须以SYSDBA身份登录或具有 FLASHBACK ARCHIVE ADMINISTER系统特权。

Using Oracle Flashback Query (SELECT AS OF)

要使用 Oracle 闪回查询,请使用SELECT带AS OF子句的语句。Oracle 闪回查询检索早先存在的数据。该查询通过时间戳或系统更改编号 (SCN) 明确引用过去的时间。它返回在那个时间点最新的已提交数据。

Oracle 闪回查询的用途包括:

  • 恢复丢失的数据或撤消不正确的已提交更改。
    例如,如果您错误地删除或更新了行,然后提交它们,您可以立即撤消错误。
  • 将当前数据与较早时间的相应数据进行比较。
    例如,您可以运行每日报告来显示昨天的数据变化。您可以比较表数据的各个行或查找行集的交集或并集。
  • 在特定时间检查交易数据的状态。
    例如,您可以验证某一天的账户余额。
  • 选择在特定时间或用户定义的有效时间段内任何时间有效的数据。
    例如,您可以查找具有截至特定时间戳或指定有效时间段内指定开始和结束时间之间的有效员工信息的员工。(有关更多信息,请参阅时间有效性支持。)
  • 通过消除存储某些类型的时间数据的需要来简化应用程序设计。
  • Oracle 闪回查询让您可以直接从数据库中检索过去的数据。
  • 将打包的应用程序(例如报告生成工具)应用于过去的数据。
  • 为应用程序提供自助错误更正,从而使用户能够撤消和更正他们的错误。

SELECT AS OF后面可以接TIMESTAMP或SCN。TIMESTAMP可以是绝对时间或相对时间,例如:

  • 绝对时间:TO_TIMESTAMP(‘2004-04-04 09:30:00’, ‘YYYY-MM-DD HH:MI:SS’)
  • 相对时间:TIMESTAMP (SYSTIMESTAMP - INTERVAL ‘60’ MINUTE)

Oracle 闪回查询指南:

  • 您可以为每个表指定或省略该AS OF子句,并为不同的表指定不同的时间。如果指定的时间早于其创建时间,则查询将返回该表的零行,而不是导致错误。
  • 您可以在与 Oracle 闪回查询相同的会话中使用 AS OF查询子句来执行数据定义语言 (DDL) 操作(例如创建和截断表)或数据操作语言 (DML) 语句(例如 INSERT 和 DELETE)。
  • 要在影响数据库当前状态的 DDL 或 DML 语句中使用 Oracle 闪回查询的结果,请在 INSERT 或 CREATE TABLE AS SELECT 语句中使用 AS OF 子句。
  • 如果一个可能的 3 秒错误(最大值)对应用程序中的 Oracle 闪回查询很重要,请使用 SCN 而不是时间戳。 请参阅 Oracle 闪回技术通用指南
  • 您可以通过在定义视图的 SELECT 语句中使用 AS OF 子句来创建引用过去数据的视图。
  • 您可以在自连接或集合操作(如 INTERSECT 和 MINUS)中使用 AS OF 子句来提取或比较两个不同时间的数据。
  • 您可以在查询中使用 AS OF 子句来检查在特定时间有效的数据。

Using Oracle Flashback Version Query

使用 Oracle 闪回版本查询检索在给定时间间隔内存在的特定行的不同版本。每次COMMIT语句执行时都会创建一个行版本。
注意:执行CREATE TABLE语句后,至少等待 15 秒提交任何事务,以确保 Oracle 闪回版本查询反映这些事务。

使用 SELECT 语句的 VERSIONS BETWEEN 子句指定 Oracle 闪回版本查询。 语法是:

-- 其中start和end分别表示要查询的时间间隔的开始和结束的表达式。
VERSIONS BETWEEN { SCN | TIMESTAMP } start AND end

或者:

-- 其中 user_valid_time 是指用户指定的有效时间段
-- 如 Temporal Validity Support 中所述。
VERSIONS PERIOD FOR user_valid_time [ BETWEEN TIMESTAMP start AND end ]

Oracle 闪回版本查询返回一个表,其中包含指定时间间隔内任何时间存在的行的每个版本的行。 表中的每一行都包含关于行版本的元数据伪列,它揭示了数据库发生特定更改(可能是错误的)的时间和方式。

下表描述了关于行版本的元数据伪列。 VERSIONS_* 伪列仅对事务时间闪回版本查询(即带有 BETWEEN TIMESTAMP start AND end 子句的查询)具有值。

伪列名 描述
VERSIONS_STARTSCN
VERSIONS_STARTTIME
创建行版本时的起始系统更改号 (SCN) 或 TIMESTAMP。 此伪列标识数据首次具有反映在行版本中的值的时间。 使用此伪列来标识 Oracle 闪回表或 Oracle 闪回查询的过去目标时间。
如果此伪列为 NULL,则行版本是在开始之前创建的。
VERSIONS_ENDSCN
VERSIONS_ENDTIME
行版本过期时的 SCN 或 TIMESTAMP。
如果此伪列为 NULL,则该行版本在查询时是最新的,或者该行对应于 DELETE 操作。
VERSIONS_XID 创建行版本的事务的标识符。
VERSIONS_OPERATION 事务执行的操作:I 插入,D 删除,U 更新。版本是被插入、删除或更新的行的版本; 即,INSERT 操作之后的行、DELETE 操作之前的行或受 UPDATE 操作影响的行。
对于索引键的用户更新,Oracle 闪回版本查询可能将 UPDATE 操作视为两个操作,DELETE 和 INSERT,表示为两个版本行,D 后跟 I VERSIONS_OPERATION。

给定的行版本从其时间 VERSIONS_START* 开始有效,但不包括其时间 VERSIONS_END*。 也就是说,时间 t满足 VERSIONS_START* <= t < VERSIONS_END*

以下为一个典型查询:

SELECT versions_startscn, versions_starttime,
       versions_endscn, versions_endtime,
       versions_xid, versions_operation,
       last_name, salary
  FROM employees
  VERSIONS BETWEEN TIMESTAMP
      TO_TIMESTAMP('2008-12-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS')
  AND TO_TIMESTAMP('2008-12-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE first_name = 'John';

您可以将 VERSIONS_XID 与 Oracle 闪回事务查询(下一节介绍)结合使用来定位此事务的元数据,包括撤消行更改所需的 SQL 和负责更改的用户。

Flashback Version Query 仅允许使用 IOT(索引组织表)进行仅索引访问,但不允许使用索引快速全扫描。

Using Oracle Flashback Transaction Query

使用 Oracle 闪回事务查询检索给定事务或给定时间间隔内所有事务的元数据和历史数据。 Oracle 闪回事务查询查询静态数据字典视图 FLASHBACK_TRANSACTION_QUERY,其列在 Oracle 数据库参考中有描述。

UNDO_SQL 列显示与事务执行的 DML 操作逻辑相反的 SQL 代码。 您通常可以使用此代码来反转交易期间采取的逻辑步骤。 但是,有些情况下 UNDO_SQL 代码与原始事务的代码并不完全相反。 例如,UNDO_SQL INSERT 操作可能不会在表中以与删除行相同的 ROWID 将行重新插入。

此语句查询事务信息的 FLASHBACK_TRANSACTION_QUERY 视图,包括事务 ID、操作、操作开始和结束 SCN、负责操作的用户以及显示操作逻辑相反的 SQL 代码:

SELECT xid, operation, start_scn, commit_scn, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('000200030000002D');

此语句使用 Oracle 闪回版本查询作为子查询,将每个行版本与负责行数据更改的 LOGON_USER 相关联:

SELECT xid, logon_user
FROM flashback_transaction_query
WHERE xid IN (
  SELECT versions_xid FROM employees VERSIONS BETWEEN TIMESTAMP
  TO_TIMESTAMP('2003-07-18 14:00:00', 'YYYY-MM-DD HH24:MI:SS') AND
  TO_TIMESTAMP('2003-07-18 17:00:00', 'YYYY-MM-DD HH24:MI:SS')
);

注意:如果查询 FLASHBACK_TRANSACTION_QUERY 时未在 WHERE 子句中指定 XID,则查询会扫描许多不相关的行,从而降低性能。

Using Oracle Flashback Transaction Query with Oracle Flashback Version Query

在此示例中,数据库管理员执行以下操作:

DROP TABLE emp;
CREATE TABLE emp (
  empno   NUMBER PRIMARY KEY,
  empname VARCHAR2(16),
  salary  NUMBER
);
INSERT INTO emp (empno, empname, salary) VALUES (111, 'Mike', 555);
COMMIT;

DROP TABLE dept;
CREATE TABLE dept (
  deptno   NUMBER,
  deptname VARCHAR2(32)
);
INSERT INTO dept (deptno, deptname) VALUES (10, 'Accounting');
COMMIT;

现在 emp 和 dept 各有一行。 在行版本方面,每个表有一行的一个版本。 假设错误事务从表 emp 中删除了 empno 111:

UPDATE emp SET salary = salary + 100 WHERE empno = 111;
INSERT INTO dept (deptno, deptname) VALUES (20, 'Finance');
DELETE FROM emp WHERE empno = 111;
COMMIT;

接下来,事务将 empno 111 重新插入到 emp 表中,其中包含新的员工姓名:

INSERT INTO emp (empno, empname, salary) VALUES (111, 'Tom', 777);
UPDATE emp SET salary = salary + 100 WHERE empno = 111;
UPDATE emp SET salary = salary + 50 WHERE empno = 111;
COMMIT;

数据库管理员检测到应用程序错误并且必须诊断问题。 数据库管理员发出此查询以检索 emp 表中与 empno 111 对应的行的版本。该查询使用 Oracle 闪回版本查询伪列:

SELECT versions_xid XID, versions_startscn START_SCN,
  versions_endscn END_SCN, versions_operation OPERATION,
  empname, salary
FROM emp
VERSIONS BETWEEN SCN MINVALUE AND MAXVALUE
WHERE empno = 111;

结果类似于:

XID               START_SCN    END_SCN O EMPNAME              SALARY
---------------- ---------- ---------- - ---------------- ----------
09001100B2200000   10093466            I Tom                     927
030002002B210000   10093459            D Mike                    555
0800120096200000   10093375   10093459 I Mike                    555
 
3 rows selected.

结果表行按时间降序排列。 第三行对应于创建表时插入到表中的表 emp 中行的版本。 第二行对应于 emp 中被错误事务删除的行。 第一行对应于 emp 中用新员工姓名重新插入的行的版本。

数据库管理员将事务 030002002B210000 识别为错误事务,并使用 Oracle 闪回事务查询来审计此事务所做的所有更改:

SELECT  xid, start_scn, commit_scn, operation, logon_user, undo_sql
FROM flashback_transaction_query
WHERE xid = HEXTORAW('030002002B210000');

结果类似于:

XID               START_SCN COMMIT_SCN OPERATION LOGON_USER
---------------- ---------- ---------- --------- ------------------------------
UNDO_SQL
--------------------------------------------------------------------------------
 
030002002B210000   10093452   10093459 DELETE    HR
insert into "HR"."EMP"("EMPNO","EMPNAME","SALARY") values ('111','Mike','655');
 
030002002B210000   10093452   10093459 INSERT    HR
delete from "HR"."DEPT" where ROWID = 'AAATjuAAEAAAAJrAAB';
 
030002002B210000   10093452   10093459 UPDATE    HR
update "HR"."EMP" set "SALARY" = '555' where ROWID = 'AAATjsAAEAAAAJ7AAA';
 
030002002B210000   10093452   10093459 BEGIN     HR
 
 
4 rows selected.

以上结果是正序的,实际对应之前的以下事务:

UPDATE emp SET salary = salary + 100 WHERE empno = 111;
INSERT INTO dept (deptno, deptname) VALUES (20, 'Finance');
DELETE FROM emp WHERE empno = 111;
COMMIT;

要查看错误事务和所有后续事务的详细信息,数据库管理员执行以下查询:

COLUMN operation FORMAT A9
COLUMN table_name FORMAT A10
COLUMN table_owner FORMAT A11

SELECT xid, start_scn, commit_scn, operation, table_name, table_owner
FROM flashback_transaction_query
WHERE table_owner = 'HR'
AND start_timestamp >=
  TO_TIMESTAMP ('2002-04-16 11:00:00','YYYY-MM-DD HH:MI:SS');

结果类似于:

XID               START_SCN COMMIT_SCN OPERATION TABLE_NAME TABLE_OWNER
---------------- ---------- ---------- --------- ---------- -----------
02000E0074200000   10093435   10093446 INSERT    DEPT       HR
030002002B210000   10093452   10093459 DELETE    EMP        HR
030002002B210000   10093452   10093459 INSERT    DEPT       HR
030002002B210000   10093452   10093459 UPDATE    EMP        HR
0800120096200000   10093374   10093375 INSERT    EMP        HR
09001100B2200000   10093462   10093466 UPDATE    EMP        HR
09001100B2200000   10093462   10093466 UPDATE    EMP        HR
09001100B2200000   10093462   10093466 INSERT    EMP        HR
 
8 rows selected.

注意:由于前面的查询没有在 WHERE 子句中指定 XID,它会扫描许多不相关的行,从而降低性能。

注意,为了使自行测试的结果完全与以上一样,需要完成Configuring Your Database for Oracle Flashback Technology一节中的设置,同时赋予hr用户相应的权限。否则会有微小的差异。

Using DBMS_FLASHBACK Package

DBMS_FLASHBACK 包提供与 Oracle 闪回查询相同的功能,但 Oracle 闪回查询有时更方便

DBMS_FLASHBACK 包如同时间机器:您可以让时钟倒转,像在较早的时间一样执行正常查询,然后回到现在。 由于您可以使用 DBMS_FLASHBACK 包对过去的数据执行查询,而无需特殊子句(例如 AS OF 或 VERSIONS BETWEEN),因此您可以重用现有的 PL/SQL 代码来更早地查询数据库。

您必须对 DBMS_FLASHBACK 包具有 EXECUTE 权限。

在 PL/SQL 代码中使用 DBMS_FLASHBACK 包:

  1. 通过调用 DBMS_FLASHBACK.ENABLE_AT_TIME 或 DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER 指定过去的时间。
  2. 执行常规查询(即没有特殊闪回功能语法(如 AS OF)的查询)。 不要执行 DDL 或 DML 操作。在指定的过去时间查询数据库。
  3. 通过调用 DBMS_FLASHBACK.DISABLE 返回到现在。
    在再次调用 DBMS_FLASHBACK.ENABLE_AT_TIME 或 DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER 之前,您必须调用 DBMS_FLASHBACK.DISABLE。 您不能嵌套启用/禁用对。

要使用游标存储查询结果,请在调用 DBMS_FLASHBACK.DISABLE 之前打开游标。 存储结果并调用 DBMS_FLASHBACK.DISABLE 后,您可以:

使用过去的存储结果执行 INSERT 或 UPDATE 操作以修改当前数据库状态。

将当前数据与过去数据进行比较。 调用 DBMS_FLASHBACK.DISABLE 后,打开第二个游标。 从第一个游标中获取以检索过去的数据; 从第二个游标获取以检索当前数据。 您可以将过去的数据存储在临时表中,然后使用 MINUS 或 UNION 等集合运算符来对比或组合过去和当前的数据。

您可以随时调用 DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER 以获取当前系统更改号 (SCN)。 DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER 返回当前 SCN,而不管之前是否调用了 DBMS_FLASHBACK.ENABLE。

Using Flashback Transaction

DBMS_FLASHBACK.TRANSACTION_BACKOUT 过程在数据库保持在线时回滚事务及其相关事务。 此恢复操作使用undo数据来创建和运行将受影响的数据返回到其原始状态的补偿事务。

被回滚的事务受以下限制:

  • 他们不能执行更改数据库表的逻辑结构的 DDL 操作。
  • 他们不能使用大对象 (LOB) 数据类型:
    • BFILE
    • BLOB
    • CLOB
    • NCLOB
  • 他们不能使用 LogMiner 不支持的功能。
    LogMiner 支持的功能取决于正在回滚事务的数据库的 COMPATIBLE 初始化参数的值。 默认值是最新主要版本的版本号。
    Flashback Transaction 继承了 LogMiner 对 SQL 数据类型的支持。 因此,如果 LogMiner 由于事务中不支持的 SQL 数据类型而失败,闪回事务也会失败。
    某些数据类型虽然受 LogMiner 支持,但不会生成撤消信息作为修改此类列的操作的一部分。 因此,闪回事务不支持包含这些数据类型的表。 这些包括具有 BLOB、CLOB 和 XML 类型的表。

事务依赖性是指在闪回事务的上下文中,事务 2 可以通过以下任何方式依赖于事务 1:

  • 写写依赖
    事务 1 更改了表的一行,随后事务 2 更改了同一行。
  • 主键依赖
    一个表在 c 列上有一个主键约束。 在表的一行中,c 列的值为 v。事务 1 删除了该行,随后事务 2 将一行插入到同一个表中,并将值 v 赋给 c 列。
  • 外键依赖
    在表b中,列b1对表a的列a1有一个外键约束。 事务 1 更改了 a1 中的值,随后事务 2 更改了 b1 中的值。

TRANSACTION_BACKOUT 过程的参数是:

  • 要回退的事务数
  • 要撤销的事务列表,按名称或 XID 标识
  • 时间hint,如果您通过名称识别交易
  • 指定早于任何事务开始的时间。
  • 下表中的Backout选项
选项 描述
CASCADE 以后序方式撤销指定的事务和所有相关事务(即,先撤销父事务,然后撤销子事务)。
没有CASCADE,如果没有指定任何依赖事务,就会出错。
NOCASCADE 默认。 取消指定的事务,这些事务应该没有依赖事务。 第一个相关事务导致错误并出现在 *_FLASHBACK_TXN_REPORT 中。
NOCASCADE_FORCE 回退指定的事务,忽略相关事务。 服务器以提交时间的倒序为指定的事务运行撤消 SQL 语句。
如果没有破坏约束并且您对结果感到满意,则可以提交更改; 否则,您可以将它们回滚。
NONCONFLICT_ONLY 取消对指定事务的非冲突行的更改。 数据库保持一致,但事务原子性丢失。

TRANSACTION_BACKOUT 分析事务依赖性,执行 DML 操作,并生成报告。 TRANSACTION_BACKOUT 不提交它作为事务撤销的一部分执行的 DML 操作,但它以正确的形式持有对行和表的所有必需的锁,防止其他依赖项进入系统。 要使事务撤销永久生效,您必须显式提交事务。

要查看 TRANSACTION_BACKOUT 生成的报告,请查询静态数据字典视图 *_FLASHBACK_TXN_STATE 和 *_FLASHBACK_TXN_REPORT。

静态数据字典视图 *_FLASHBACK_TXN_STATE 显示事务是处于活动状态还是已退出。 如果一个事务出现在这个视图中,它就会被取消。

*_FLASHBACK_TXN_STATE 以原子方式维护以补偿事务。 如果补偿事务被撤销,它所做的所有更改也被撤销,*_FLASHBACK_TXN_STATE 反映了这一点。 例如,如果补偿事务 ct 撤销事务 t1 和 t2,则 t1 和 t2 出现在 *_FLASHBACK_TXN_STATE 中。 如果 ct 本身后来被撤销,t1 和 t2 的效果将恢复,并且 t1 和 t2 从 *_FLASHBACK_TXN_STATE 中消失。

静态数据字典视图 *_FLASHBACK_TXN_REPORT 为每个回退事务提供详细报告。

Using Flashback Time Travel

可以认为Flashback Time Travel和Flashback Data Archive是等同的,后者前者是基于后者的技术

闪回时间旅行提供了在表的生命周期内跟踪和存储事务更改的能力。

闪回时间旅行对于遵守记录阶段政策和审计报告很有用。

闪回存档(Flashback Archive)由一个或多个表空间或其中的一部分组成。 您可以有多个闪回存档。 如果您以 SYSDBA 身份登录,则可以为系统指定默认的 Fashback Archive。 闪回存档配置了保留时间。 闪回存档中存档的数据将保留创建闪回存档时指定的保留时间。

为特定表选择闪回存档时,请考虑表的数据保留要求以及您拥有 FLASHBACK ARCHIVE 对象特权的闪回存档的保留时间。

默认情况下,不为任何表启用闪回存档。 考虑为用户上下文跟踪和数据库加固启用闪回存档。

  • 用户上下文跟踪。 用于跟踪事务的元数据信息可以包括(如果启用该功能)用户上下文,这使得更容易确定哪个用户对表进行了哪些更改。
    要设置用户上下文级别(确定要保存多少用户上下文),请使用 DBMS_FLASHBACK_ARCHIVE.SET_CONTEXT_LEVEL 过程。 要访问上下文信息,请使用 DBMS_FLASHBACK_ARCHIVE.GET_SYS_CONTEXT 函数。
  • 数据库加固。 您可以在“应用程序”中将一组表关联在一起,然后使用单个命令在所有这些表上启用闪回存档。 数据库强化还使您能够使用单个命令锁定所有表,防止这些表上的任何 DML,直到它们随后被解锁。 数据库强化旨在更轻松地使用闪回时间旅行来跟踪和保护应用程序的安全敏感表。
    要为数据库强化注册应用程序,请使用 DBMS_FLASHBACK_ARCHIVE.REGISTER_APPLICATION 过程,该过程在 Oracle Database PL/SQL Packages and Types Reference 中进行了描述。

您还可以在各种场景中使用 Flashback Time Travel,例如强制数字粉碎、访问历史数据、选择性数据恢复和审计。

闪回时间旅行限制

  • 您不能在具有 LONG 数据类型或嵌套表列的表上启用闪回存档。
  • 您不能在嵌套表、临时表、外部表、物化视图、高级查询 (AQ) 表、混合分区表或非表对象上启用闪回存档。
  • 闪回存档不支持移动、拆分、合并或合并分区或子分区、移动表或将 LONG 列转换为 LOB 列的 DDL 语句。
  • 在已启用闪回存档的表上添加或启用约束(包括外键约束)失败并出现 ORA-55610。 支持在已启用闪回存档的表上删除或禁用约束(包括外键约束)。
  • 在表上启用闪回存档后,Oracle 建议最初等待至少 20 秒,然后再将数据插入表中,并等待最多 5 分钟,然后再在表上使用闪回查询。
  • 删除闪回存档基表需要先禁用基表上的闪回存档,然后才能删除基表。 禁用 Flashback Archive 将删除历史数据,而取消关联 Flashback Archive 将保留历史数据。 另一方面,支持截断基表,并且历史数据将在闪回存档中保持可用。
  • 如果在表上启用闪回存档,但禁用自动撤消管理 (AUM),则当您尝试修改表时会发生 ORA-55614 错误。
  • 如果表使用以下任何闪回时间旅行保留字作为列名,则无法启用闪回存档:STARTSCN、ENDSCN、RID、XID、OP、OPERATION。

20.9.1 DDL Statements on Tables Enabled for Flashback Archive

闪回存档仅支持这些 DDL 语句:

  • 执行以下任一操作的 ALTER TABLE 语句:
    • 添加、删除、重命名或修改列
    • 添加、删除或重命名约束
    • 删除或截断分区或子分区操作
  • 截断表语句
  • 重命名表的 RENAME 语句

闪回存档不支持移动、拆分、合并或合并分区或子分区、移动表或将 LONG 列转换为 LOB 列的 DDL 语句。

例如,以下 DDL 语句在为闪回存档启用的表上使用时会导致错误 ORA-55610:

  • 包含 UPGRADE TABLE 子句的 ALTER TABLE 语句,有或没有 INCLUDING DATA 子句
  • 移动或交换分区或子分区操作的 ALTER TABLE 语句
  • DROP TABLE语句

如果您必须在为闪回存档启用的表上使用不受支持的 DDL 语句,请使用 DBMS_FLASHBACK_ARCHIVE.DISASSOCIATE_FBA 过程来取消基表与其闪回存档的关联。 之后要将闪回存档与基表重新关联,请使用 DBMS_FLASHBACK_ARCHIVE.REASSOCIATE_FBA 过程。 此外,要删除为闪回存档启用的表,您必须首先使用 ALTER TABLE … NO FLASHBACK ARCHIVE 子句在表上禁用闪回存档。

20.9.2 Creating a Flashback Archive

您可以使用 CREATE FLASHBACK ARCHIVE 语句创建闪回存档。

使用 CREATE FLASHBACK ARCHIVE 语句创建闪回存档,指定:

  • 闪回存档的名称
  • 闪回存档的第一个表空间的名称
  • (可选)闪回存档在第一个表空间中可以使用的最大空间量
    默认是无限的。 除非你在第一个表空间上的空间配额也是无限的,否则你必须指定这个值; 否则,会出现 ORA-55621 错误。
  • 保留时间(表的闪回存档数据保证存储的天数)
  • (可选)是否优化闪回存档中维护的历史表中的数据存储,使用[NO] OPTIMIZE DATA。
    默认值为不优化数据。

如果您以 SYSDBA 身份登录,您还可以指定这是系统的默认闪回存档。 如果省略此选项,您仍然可以在稍后阶段将此闪回存档设为默认值。

Oracle 建议所有必须使用闪回存档的用户在闪回存档表空间上拥有无限配额; 但是,如果不是这种情况,您必须在该表空间上为这些用户授予足够的配额。

示例:

CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1
  QUOTA 10G RETENTION 1 YEAR;
CREATE FLASHBACK ARCHIVE fla2 TABLESPACE tbs2 RETENTION 2 YEAR;

20.9.3 Altering a Flashback Archive

使用 ALTER FLASHBACK ARCHIVE 语句,您可以:

  • 更改闪回存档的保留时间
  • 清除部分或全部数据
  • 添加、修改和删除表空间。注意:删除闪回存档的所有表空间会导致错误。

如果您以 SYSDBA 身份登录,还可以使用 ALTER FLASHBACK ARCHIVE 语句使特定文件成为系统的默认闪回存档。

示例:

ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs3 QUOTA 5G;
ALTER FLASHBACK ARCHIVE fla1 ADD TABLESPACE tbs4;
ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs3 QUOTA 20G;
ALTER FLASHBACK ARCHIVE fla1 MODIFY TABLESPACE tbs1;
ALTER FLASHBACK ARCHIVE fla1 MODIFY RETENTION 2 YEAR;
-- 表空间 tbs2 未被删除。
ALTER FLASHBACK ARCHIVE fla1 REMOVE TABLESPACE tbs2;
ALTER FLASHBACK ARCHIVE fla1
  PURGE BEFORE TIMESTAMP (SYSTIMESTAMP - INTERVAL '1' DAY);
ALTER FLASHBACK ARCHIVE fla1 PURGE BEFORE SCN 728969;

20.9.4 Dropping a Flashback Archive

您可以使用 DROP FLASHBACK ARCHIVE 语句删除闪回存档。

删除闪回存档会删除其历史数据,但不会删除其表空间。

示例:

DROP FLASHBACK ARCHIVE fla1;

20.9.5 Specifying the Default Flashback Archive

您可以使用 CREATE 或 ALTER FLASHBACK ARCHIVE 语句指定默认闪回存档。

系统的默认闪回存档是每个没有自己的默认闪回存档的用户的默认闪回存档。

默认情况下,系统没有默认的Flashback Archive。 如果您以 SYSDBA 身份登录,则可以通过以下任一方式指定默认闪回存档:

  • 在 ALTER FLASHBACK ARCHIVE 语句的 SET DEFAULT 子句中指定现有闪回存档的名称。 例如:
ALTER FLASHBACK ARCHIVE fla1 SET DEFAULT;
  • 创建闪回存档时,在 CREATE FLASHBACK ARCHIVE 语句中包括 DEFAULT。 例如:
CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1
  QUOTA 10G RETENTION 1 YEAR;

20.9.6 Enabling and Disabling Flashback Archive

默认情况下,所有表都禁用闪回存档。 如果您对用于该表的闪回存档具有 FLASHBACK ARCHIVE 对象权限,则可以为该表启用闪回存档。

要为表启用闪回存档,请在 CREATE TABLE 或 ALTER TABLE 语句中包含 FLASHBACK ARCHIVE 子句。 在 FLASHBACK ARCHIVE 子句中,您可以指定存储表历史数据的闪回存档。 默认值是系统的默认闪回存档。 如果指定不存在的闪回存档,则会发生错误。

如果表启用了闪回存档,而您尝试使用不同的闪回存档再次启用它,则会发生错误。

为表启用闪回存档后,只有当您拥有 FLASHBACK ARCHIVE ADMINISTER 系统权限或以 SYSDBA 身份登录时才能禁用它。 要禁用表的闪回存档,请在 ALTER TABLE 语句中指定 NO FLASHBACK ARCHIVE。 (不必在 CREATE TABLE 语句中指定 NO FLASHBACK ARCHIVE,因为这是默认设置。)

示例:

CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10),
  JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE;
CREATE TABLE employee (EMPNO NUMBER(4) NOT NULL, ENAME VARCHAR2(10),
  JOB VARCHAR2(9), MGR NUMBER(4)) FLASHBACK ARCHIVE fla1;
ALTER TABLE employee FLASHBACK ARCHIVE;
ALTER TABLE employee FLASHBACK ARCHIVE fla1;
ALTER TABLE employee NO FLASHBACK ARCHIVE;

20.9.7 Viewing Flashback Archive Data

您可以在静态数据字典视图中查看有关闪回存档文件的信息。

视图 描述
*_FLASHBACK_ARCHIVE 显示有关闪回存档文件的信息
*_FLASHBACK_ARCHIVE_TS 显示闪回存档文件的表空间
*_FLASHBACK_ARCHIVE_TABLES 显示有关为闪回存档启用的表的信息

20.9.8 Transporting Flashback Archive Data between Databases

您可以使用 FLASHBACK_ARCHIVE_MIGRATE 包和 Oracle Transportable Tablespaces 功能将闪回存档基表连同它们的历史导出和导入到另一个数据库。

DBMS_FLASHBACK_ARCHIVE_MIGRATE 允许将启用闪回存档的表从存在该包的任何版本上的数据库迁移到支持闪回时间旅行的任何版本上的任何数据库。

20.9.9 Flashback Time Travel Scenarios

场景:使用闪回时间旅行来实施数字粉碎
贵公司希望在十年后“粉碎”(删除)Taxes 表的历史数据更改。 当您为Taxes 表创建闪回存档时,您指定了十年的保留时间:

CREATE FLASHBACK ARCHIVE taxes_archive TABLESPACE tbs1 RETENTION 10 YEAR;

当来自税收交易的历史数据超过十年时,它会被清除。 (税收表本身以及不到十年的交易历史数据不会被清除。)

场景:使用闪回时间旅行访问历史数据
您希望能够从表 inventory 中检索年初所有项目的库存,并且能够在一年中的任何指定日期的营业结束时检索来自表 stock_data投资组合中每个代码的股票价格。

CREATE FLASHBACK ARCHIVE DEFAULT fla1 TABLESPACE tbs1
  QUOTA 10G RETENTION 5 YEAR;
ALTER TABLE inventory FLASHBACK ARCHIVE;
ALTER TABLE stock_data FLASHBACK ARCHIVE;
-- 要检索 2007 年初所有项目的库存
SELECT product_number, product_name, count FROM inventory AS OF
  TIMESTAMP TO_TIMESTAMP ('2007-01-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');
-- 要在 2007 年 7 月 23 日收盘时检索投资组合中每个代码的股票价格
SELECT symbol, stock_price FROM stock_data AS OF
  TIMESTAMP TO_TIMESTAMP ('2007-07-23 16:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE symbol IN my_portfolio;

场景:使用闪回时间旅行生成报告
您希望用户能够从表 investments 中为过去五年存储的数据生成报告。
和上一个场景似乎没有区别。

CREATE FLASHBACK ARCHIVE DEFAULT fla2 TABLESPACE tbs1
  QUOTA 20G RETENTION 5 YEAR;
ALTER TABLE investments FLASHBACK ARCHIVE;
SELECT * FROM investments AS OF
  TIMESTAMP TO_TIMESTAMP ('2006-12-31 16:00:00', 'YYYY-MM-DD HH24:MI:SS')
  WHERE name = 'LISA';

场景:使用闪回时间旅行进行审计
医疗保险公司必须审核医疗诊所。

CREATE FLASHBACK ARCHIVE DEFAULT fla4 TABLESPACE tbs1
  QUOTA 100G RETENTION 10 YEAR;
ALTER TABLE Billings FLASHBACK ARCHIVE;
-- 2007 年 5 月 1 日,客户在某些诊断和测试中被收取了错误的费用。 
-- 要查看截至 2007 年 5 月 1 日的记录,公司使用以下查询:
SELECT date_billed, amount_billed, patient_name, claim_Id,
  test_costs, diagnosis FROM Billings AS OF TIMESTAMP
  TO_TIMESTAMP('2007-05-01 00:00:00', 'YYYY-MM-DD HH24:MI:SS');

场景:使用闪回时间旅行恢复数据
最终用户从先前在数据库中提交的错误事务中恢复。 错误事务的撤消数据不再可用,但由于闪回存档中提供了所需的历史信息,闪回查询可以无缝运行。

丽莎管理着一个软件开发小组,其产品销售情况良好。 2007 年 11 月 3 日,她决定给所有拥有两年以上工作经验的三级员工加薪 10%,并晋升至四级。 丽莎要求她的人力资源代表鲍勃进行更改。

使用 HR Web 应用程序,Bob 更新了员工表,为 Lisa 的三级员工加薪 10% 并晋升为四级。 然后 Bob 完成当天的工作回家,并没有意识到他在交易中忽略了两年工作经验的要求。 几天后,Lisa 查看 Bob 是否完成了更新,发现组中的每个人都得到了加薪! 她立即打电话给鲍勃,请他改正错误。

起初,Bob 认为不去备份就无法将员工表恢复到之前的状态。 然后他想起员工表启用了闪回存档。

首先,他验证没有其他事务在他之后修改了雇员表:事务查询的提交时间戳对应于两天前 Bob 的事务。

接下来,Bob 使用这些语句将 employee 表恢复到他错误更改之前的状态:

DELETE EMPLOYEE WHERE MANAGER = 'LISA JOHNSON';
INSERT INTO EMPLOYEE
  SELECT * FROM EMPLOYEE
    AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '2' DAY)
      WHERE MANAGER = 'LISA JOHNSON';

General Guidelines for Oracle Flashback Technology

使用闪回技术时请考虑这些最佳实践。

  • 避免在表上启用闪回存档之前对表发出闪回查询。 应该,在对表执行任何 DML 操作之前启用闪回存档。
-- 在此示例中,操作序列将返回 a=1 的行。 
-- 这可能看起来像一个不正确的结果,为避免这种情况,您必须在插入任何行之前启用闪回存档。
CREATE TABLE foo (a NUMBER);
VAR scn NUMBER;
BEGIN 
   SELECT DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMEBR INTO :scn FROM DUAL;
END;
INSERT INTO foo VALUES (1);
COMMIT;
ALTER TABLE foo FLASHBACK ARCHIVE;
UPDATE foo SET a=2 WHERE a=1;
COMMIT;
SELECT * FROM foo AS OF SCN :scn;
  • 在您无法控制的 SQL 代码周围使用 DBMS_FLASHBACK.ENABLE 和 DBMS_FLASHBACK.DISABLE 过程,或者当您希望对多个连续查询使用相同的过去时间时。
  • 为方便起见,对您编写的 SQL 代码使用 Oracle 闪回查询、Oracle 闪回版本查询或 Oracle 闪回事务查询。 例如,Oracle 闪回查询非常灵活,可以在单个查询中进行比较和存储结果。
  • 要获得 SCN 以便稍后使用闪回功能,请使用 DBMS_FLASHBACK.GET_SYSTEM_CHANGE_NUMBER。
  • 要计算或检索过去的时间以在查询中使用,请使用函数返回值作为时间戳或 SCN 参数。 例如,将 INTERVAL 值添加或减去 SYSTIMESTAMP 函数的值。
  • 在本地或远程使用 Oracle 闪回查询、Oracle 闪回版本查询和 Oracle 闪回事务查询。 远程 Oracle 闪回查询的示例是:
SELECT * FROM employees@some_remote_host AS OF 
    TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE);
  • 为了保证数据库的一致性,在查询过去的数据之前执行COMMIT 或ROLLBACK 操作。
  • 请记住,所有闪回处理都使用当前会话设置,例如国家语言和字符集,而不是在查询时有效的设置。
  • 请记住,更改表结构的 DDL(例如删除/修改列、移动表、删除分区、截断表/分区和添加约束)会使表的任何现有撤消数据无效。 如果您尝试从执行此类 DDL 之前的某个时间检索数据,则会发生错误 ORA-01466。 更改表存储属性的 DDL 操作(例如 PCTFREE、INITRANS 和 MAXTRANS)不会使撤消数据无效。
  • 要在精确时间查询过去的数据,请使用 SCN。 如果您使用时间戳,实际查询到的时间可能比您指定的时间早最多 3 秒。 Oracle 数据库在内部使用 SCN,并将它们映射到时间戳,粒度为 3 秒。
    例如,假设 SCN 值 1000 和 1005 分别映射到时间戳 8:41 AM 和 8:46 AM。 查询 8:41:00 到 8:45:59 AM 之间的时间映射到 SCN 1000; 上午 8:46 的 Oracle 闪回查询映射到 SCN 1005。因此,如果您指定的时间稍晚于 DDL 操作(例如创建表),Oracle 数据库可能会使用紧接在 DDL 操作之前的 SCN, 导致错误 ORA-01466。
  • 您无法从动态性能 (V$) 视图中检索过去的数据。 对此类视图的查询返回当前数据。
  • 您可以在静态数据字典视图(例如 *_TABLES)中对过去的数据执行查询。
    注意:如果使用静态数据字典视图无法检索过去的数据,则可以查询相应的基表来检索数据。 但是,Oracle 不建议您直接使用基表,因为它们是规范化的,并且大多数数据都以加密格式存储。
  • 您可以通过在创建或更改闪回存档历史表时指定 OPTIMIZE DATA 来为闪回存档维护的历史表启用数据存储优化。
    OPTIMIZE DATA 通过使用以下任何功能优化历史表中的数据存储,默认是不优化历史表中数据的存储。:
    • Advanced Row Compression
    • Advanced LOB Compression
    • Advanced LOB Deduplication
    • Segment-level compression tiering
    • Row-level compression tiering
  • 创建 VPD 策略后,请考虑为闪回存档历史表创建等效策略。

Performance Guidelines for Oracle Flashback Technology

  • 使用 DBMS_STATS 包为 Oracle 闪回查询中涉及的所有表生成统计信息。 保持最新的统计数据。 Oracle 闪回查询使用基于成本的优化器,它依赖于这些统计信息。

  • 最小化必须访问的撤消数据量。 使用查询选择使用索引的过去数据的小集合,而不是扫描整个表。 如果必须扫描全表,请向查询添加并行提示。
    I/O 中的性能成本是在不在缓冲区高速缓存中的数据和撤消块中进行分页的成本。 CPU 使用的性能成本是将撤消信息应用于受影响的数据块的成本。 在对最近的更改进行操作时,闪回操作受 CPU 限制。
    Oracle 建议您有足够的缓冲区缓存,以便归档程序的版本查询在缓冲区缓存中找到撤消数据。 缓冲区高速缓存访问明显快于磁盘访问。

  • 如果在跟踪表上执行非常大的事务(例如影响超过 100 万行),请将大池大小设置得足够高(至少 1 GB)以使并行查询不必从 SGA 分配新块。

  • 对于 Oracle 闪回版本查询,使用索引结构。 Oracle 数据库保留索引更改和数据更改的撤消数据。 基于索引查找的 Oracle 闪回版本查询的性能比否则需要的全表扫描快一个数量级。

  • 在 Oracle 闪回事务查询中,xid 列的类型为 RAW(8)。 要利用在 xid 列上构建的索引,请使用 HEXTORAW 转换函数:HEXTORAW(xid)。

  • 针对物化视图的 Oracle 闪回查询不利用查询重写优化。

Multitenant Container Database Restrictions for Oracle Flashback Technology

这些 Oracle 闪回技术特性不可用于多租户容器数据库 (CDB):

  • 共享撤消模式下的 CDB 不支持闪回事务查询。 它仅在本地撤消模式下受支持。
  • CDB 不支持闪回事务回退。

使用Flashback Database 和 Restore Points

详见数据库备份恢复指南的第7章:Using Flashback Database and Restore Points

作为整体数据保护策略的一部分,使用 RMAN 配置、监控和维护还原点。

本章介绍闪回数据库和还原点。 它讨论了配置、监视和维护这些功能作为整体数据保护策略的一部分。

注意:有关使用闪回数据库以及正常和保证还原点的恢复方案的详细信息,请参阅第18章:执行闪回和数据库时间点恢复

7.1 Overview of Flashback Database, Restore Points and Guaranteed Restore Points

Oracle 闪回数据库和恢复点是相关的数据保护特性,使您能够及时倒回数据,以纠正由逻辑数据损坏或指定时间窗口内的用户错误引起的任何问题。

这些功能提供了一种比时间点恢复更有效的替代方法,并且不需要先备份数据库才能恢复。 效果类似于数据库时间点恢复 (DBPITR)。 闪回数据库和还原点不仅在传统的数据库恢复情况下有效,而且在必须快速创建和重新创建测试数据库的数据库升级、应用程序部署和测试场景中也很有用。 闪回数据库还提供了一种有效的替代方法,可以在 Data Guard 故障转移后重建发生故障的主数据库

还原点提供与闪回数据库和其他媒体恢复操作相关的功能。 特别是,在系统更改号 (SCN) 处创建的保证还原点可确保您可以使用闪回数据库将数据库倒回到此 SCN。 您可以单独或一起使用还原点和闪回数据库。

可以通过 RMAN 和 SQL 作为 FLASHBACK DATABASE 访问闪回数据库。 您可以使用任何一种语言从逻辑数据损坏或用户错误中快速恢复数据库。 以下示例将数据库返回到指定的 SCN 或还原点:

FLASHBACK DATABASE TO RESTORE POINT 'before_upgrade';
FLASHBACK DATABASE TO SCN 202381;

7.1.1 About Flashback Database

闪回数据库在其效果上类似于传统的时间点恢复。 它使您能够将数据库恢复到最近某个时间的状态。 闪回数据库比时间点恢复快得多,因为它不需要从备份中恢复数据文件,并且需要从归档重做日志中应用较少的更改。

如果数据文件完好无损,您可以使用闪回数据库来恢复对数据库的大部分不需要的更改。 您可以将数据库返回到其先前化身(incarnation)的状态,并撤消 ALTER DATABASE OPEN RESETLOGS 语句的影响。 “使用闪回数据库倒回数据库”解释了如何使用 FLASHBACK DATABASE 命令来反转数据库更改。

incarnation的定义如下:

A separate version of a database. The incarnation of the database changes when you open it with the RESETLOGS option, but you can recover backups from a prior incarnation so long as the necessary redo is available.

闪回数据库使用自己的日志记录机制,创建闪回日志并将它们存储在快速恢复区中。 如果闪回日志可用,则只能使用闪回数据库。 要利用此功能,您必须提前设置数据库以创建闪回日志。

要启用闪回数据库,您需要配置一个快速恢复区并设置一个闪回保留目标。 此保留目标指定您可以使用闪回数据库倒带数据库的时间。

从那时起,数据库会定期将每个数据文件中每个更改块的图像复制到闪回日志中。 这些块图像以后可以重复使用,以在捕获日志的任何时刻重建数据文件内容。

当您使用闪回数据库将数据库倒回到过去的目标时间时,该命令会确定哪些块在目标时间之后更改并从闪回日志中恢复它们。 数据库恢复紧接在目标时间之前的每个块的版本。 然后数据库使用重做日志重新应用在将这些块写入闪回日志后所做的更改。

磁盘或磁带上的重做日志必须在闪回日志跨越的整个时间段内可用。 例如,如果闪回保留目标是 1 周,那么您必须确保可以访问包含过去一周所有更改的联机和归档重做日志。 实际上,重做日志通常需要比闪回保留目标长得多的时间来支持时间点恢复。

7.1.2 About Flashback Database Window

当前有足够的闪回日志数据支持FLASHBACK DATABASE 命令的SCN 范围称为闪回数据库窗口。 闪回数据库窗口不能延伸到比可用闪回日志中最早的 SCN 更远的地方。

您不能将闪回日志备份到快速恢复区之外的位置。 要增加保留足够闪回日志以满足闪回数据库窗口的可能性,您可以增加快速恢复区中的空间。

如果快速恢复区不够大,无法容纳闪回日志和归档重做日志等文件以及保留策略所需的其他备份,则数据库可能会从最早的 SCN 向前删除闪回日志,以便为其他文件腾出空间。 因此,闪回数据库窗口可能比闪回保留目标更短,具体取决于快速恢复区的大小、必须保留的其他备份以及需要多少闪回日志数据。 闪回保留目标是一个目标,不能保证闪回数据库可用

如果因为闪回数据库窗口不够长而无法使用 FLASHBACK DATABASE,那么通常可以使用数据库时间点恢复 (DBPITR) 来获得类似的结果。 保证还原点是确保您可以使用闪回数据库返回到特定时间点或保证闪回窗口大小的唯一方法

注意:某些数据库操作,例如删除表空间,无法使用闪回数据库来逆转。 有关详细信息,请参阅“闪回数据库的限制”。

7.1.3 Limitations of Flashback Database

由于闪回数据库的工作原理是撤消对运行命令时存在的数据文件的更改,因此它有一定的局限性。

  • 闪回数据库只能撤消 Oracle 数据库对数据文件所做的更改。 它不能用于修复介质故障,或从意外删除的数据文件中恢复。
  • 您不能单独使用闪回数据库来检索丢失的数据文件。 如果将数据库闪回到数据库中存在删除的数据文件的时间,则只会将数据文件条目添加到控制文件中。 只能通过使用 RMAN 完全恢复和恢复数据文件来恢复丢失的数据文件。
  • 如果从备份中恢复或重新创建数据库控制文件,则所有累积的闪回日志信息都将被丢弃。 您不能使用 FLASHBACK DATABASE 返回到恢复或重新创建控制文件之前的时间点。
  • 将闪回数据库与正在进行 NOLOGGING 操作的目标时间一起使用时,块损坏很可能发生在受 NOLOGGING 操作影响的数据库对象和数据文件中。 例如,如果您在 NOLOGGING 模式下执行直接路径 INSERT 操作,并且该操作从 2005 年 4 月 3 日的 9:00 运行到 9:15,您稍后使用闪回数据库返回到目标时间 09:07 在那一天,由直接路径 INSERT 更新的对象和数据文件可能会在闪回数据库操作完成后留下块损坏。
    如果可能,请避免使用目标时间或 SCN 与 NOLOGGING 操作重合的闪回数据库。 此外,在任何 NOLOGGING 操作后立即对受影响的数据文件执行完整或增量备份,以确保操作后可恢复到时间点。 如果您希望在直接路径 INSERT 等操作期间使用闪回数据库返回到某个时间点,请考虑在 LOGGING 模式下执行该操作。

7.1.4 About Normal Restore Points

创建普通还原点会将还原点名称分配给 SCN 或特定时间点。

因此,还原点用作此 SCN 的书签或别名。 在执行您可能必须撤消的任何操作之前,您可以创建一个正常的还原点。 控制文件存储还原点的名称和 SCN。

如果您使用闪回功能或时间点恢复,则可以使用还原点的名称而不是时间或 SCN。 以下命令支持使用还原点:

  • RMAN 中的 RECOVER DATABASE 和 FLASHBACK DATABASE 命令
  • SQL中的FLASHBACK TABLE语句

创建一个正常的还原点消除了提前手动记录 SCN 或事后使用闪回查询等功能确定正确的 SCN。

普通还原点是轻量级的。 控制文件可以维护数千个正常还原点的记录,对数据库性能没有显着影响。 如果不手动删除,正常还原点最终会脱离控制文件,因此它们不需要持续维护。

7.1.5 About Guaranteed Restore Points

与普通还原点一样,保证还原点在恢复操作中充当 SCN 的别名。 一个主要区别是保证还原点永远不会超出控制文件的范围,必须显式删除

通常,您可以将保证还原点用作 SCN 的别名,并使用任何适用于正常还原点的命令。 除非另有说明,否则有关在何处以及如何使用正常还原点的信息也适用于保证还原点。

有保证的还原点可确保您可以使用闪回数据库将数据库倒回到还原点 SCN 处的状态,即使禁用了闪回日志的生成???。 如果启用闪回日志记录,则保证还原点强制将闪回数据库所需的闪回日志保留到最早保证还原点之后的任何 SCN。 因此,如果启用闪回日志记录,您可以将数据库倒回到连续统一体中的任何 SCN,而不是仅倒回到单个 SCN。

注意:如果禁用闪回日志记录,那么您不能直接将数据库闪回到保证还原点和当前时间之间的 SCN。 但是,您可以先闪回到保证还原点,然后恢复到保证还原点和当前时间之间的 SCN。

如果恢复区有足够的磁盘空间来存储所需的日志,那么您可以使用有保证的还原点将整个数据库倒回几天或几周前的已知良好状态。 与闪回数据库一样,即使是 NOLOGGING 操作(如直接加载插入)的影响也可以通过有保证的还原点来逆转。

注意:适用于闪回数据库的限制也适用于保证还原点。 例如,删除表空间可以防止将受影响的数据文件闪回到保证的还原点。 有关详细信息,请参阅“闪回数据库的限制”。 另外,当数据库中有保证还原点时,数据库兼容性参数不能设置为更高的数据库版本。 尝试这样做会导致错误。 存在此限制是因为闪回数据库目前无法逆转使用兼容性初始化参数增加数据库版本的影响。

实际上,有保证的还原点提供了一种有用的存储快照替代方法。

存储快照通常用于在风险操作(例如大规模数据库更新或应用程序补丁或升级)之前保护数据库。 您可以在主数据库或物理备用数据库上创建有保证的还原点,而不是创建快照或复制数据库来测试操作。 然后,您可以在确定保留所需的闪回日志的情况下执行有风险的操作。

7.1.6 Overview of Restore Points in a Multitenant Environment

您可以在可插拔数据库 (PDB) 中创建正常且有保证的还原点。 PDB 还原点只能由定义它们的 PDB 访问。

PDB 还原点

PDB 还原点是特定可插拔数据库 (PDB) 中某个时间点或 SCN 的书签。 它仅适用于为其创建它的 PDB,并且仅可用于对该 PDB 的操作。 PDB 还原点表示创建它的时间点的 PDB 子化身。

PDB 还原点可以是普通还原点,也可以是保证还原点。 有保证的 PDB 还原点保证您可以对 PDB 执行闪回操作到此还原点。

PDB 还原点可用于仅对创建它的 PDB 执行闪回数据库操作或时间点恢复。

注意:创建有保证的 PDB 还原点需要仔细考虑,因为这样的还原点可以防止重复使用多租户容器数据库 (CDB) 中所需的闪回日志。 这可能会影响 CDB 的运行,因为快速恢复区可能会用完空间。

清理 PDB 还原点

干净的 PDB 还原点是在 PDB 关闭且该 PDB 没有未完成的事务时创建的 PDB 还原点。 Clean PDB 还原点仅适用于使用共享撤消的 CDB。

Clean PDB 还原点可以是正常还原点或保证还原点。 使用 CREATE CLEAN RESTORE POINT 命令显式创建干净的 PDB 还原点。 对于使用共享撤消的 CDB,如果 PDB 已关闭且没有未完成的事务,则创建的任何 PDB 还原点都将标记为干净的 PDB 还原点。

如果您预计可能需要将 PDB 倒回到特定时间点,例如,恢复到应用程序升级之前的状态,那么建议您创建一个干净的 PDB 保证还原点。

对于使用共享撤消的 CDB,对干净 PDB 还原点的闪回数据库操作比对 SCN 或其他非干净 PDB 还原点的还原点的闪回数据库操作更快。 这是因为 RMAN 在对干净的 PDB 还原点执行闪回操作时不需要还原任何备份。

PDB 还原点的命名空间
每个可插拔数据库 (PDB) 都有自己的还原点命名空间。 因此,您可以在多个 PDB 中定义同名的 PDB 还原点。

在多租户环境中,当您在 PDB 中使用还原点名称或用于 PDB 操作时,该名称首先被解释为相关 PDB 的 PDB 还原点。 如果未找到具有指定名称的 PDB 还原点,则将其解释为 CDB 还原点。

7.2 About Logging for Flashback Database and Guaranteed Restore Points

闪回数据库和保证还原点的日志记录涉及在应用更改之前捕获数据文件块的图像。 FLASHBACK DATABASE 命令可以使用这些图像将数据文件返回到它们以前的状态。

正常闪回日志记录和保证恢复点日志记录之间的主要区别在于何时记录块以及是否可以删除日志以响应快速恢复区的空间压力。 这些差异会影响日志的空间使用和数据库性能。

您的可恢复性目标部分决定了是为闪回数据库启用日志记录,还是使用有保证的还原点,或者两者兼而有之。 这些功能在性能和空间使用方面的影响,无论是单独使用还是一起使用,也会影响您的决定。

7.2.1 Guaranteed Restore Points and Fast Recovery Area Space Usage

某些规则决定了快速恢复区中空间的使用。

当您创建有保证的还原点时,无论是否启用完整的闪回数据库日志记录,您都必须监视快速恢复区中的可用空间。 “管理快速恢复区中闪回日志的空间”解释了如何监控快速恢复区磁盘空间使用情况。

以下规则管理快速恢复区中闪回日志的创建、保留、覆盖和删除:

  • 如果快速恢复区有足够的空间,则在必要时创建闪回日志以满足闪回保留目标。
  • 如果闪回日志足够旧以至于不再需要满足闪回保留目标,则可以重新使用或删除闪回日志。
  • 如果数据库必须创建闪回日志,而快速恢复区已满或没有磁盘空间,则重新使用最旧的闪回日志。
    注意:重用最旧的闪回日志会缩短闪回数据库窗口。 如果由于磁盘空间不足而重复使用足够多的闪回日志,则可能无法满足闪回保留目标。
  • 如果快恢复区已满,则根据快恢复区规则可回收的归档重做日志会被快恢复区自动删除,为其他文件腾出空间。 在这种情况下,任何需要使用该重做日志文件以使用 FLASHBACK DATABASE 的闪回日志也将被删除。
    根据快速恢复区规则,当满足以下条件之一时,文件是可回收的:(1)该文件被报告为已过时且闪回数据库不需要。 例如,文件在 DB_FLASHBACK_RETENTION_TARGET 参数之外。(2) 文件已备份到磁带。
  • 快速恢复区中的文件如果需要满足保证的还原点,则不符合删除或重新使用的条件。 但是,满足保证还原点所需的存档重做日志在备份到磁盘或磁带后可能会被删除。 当您使用 RMAN FLASHBACK DATABASE 命令时,如果满足指定保证还原点所需的归档重做日志在快速恢复区中不可用,则从备份中还原它们。
    保留闪回日志和满足保证还原点所需的其他文件,以及满足备份保留策略所需的文件,可能导致快速恢复区完全填满。 如果您的快速恢复区已满,请参阅“响应满的快速恢复区”。

警告:如果由于保留策略和保证还原点的要求而没有文件符合从快速恢复区删除的条件,则数据库会像遇到磁盘已满情况一样执行。 在许多情况下,这会导致您的数据库停止。 请参阅“响应满的快速恢复区”。

7.2.2 About Logging for Guaranteed Restore Points with Flashback Logging Disabled

假设您在禁用闪回数据库日志记录时创建有保证的还原点。 在这种情况下,当数据文件块在保证恢复点之后第一次被修改时,数据库会在闪回日志中存储修改前的块映像。 因此,闪回日志会在创建保证还原点时保留每个更改的数据块的内容。 以后对同一个块的修改不会导致内容再次被记录,除非在最后一次修改块之后创建了另一个有保证的还原点,或者后续的闪回数据库操作已经恢复了块的原始内容。 当您使用闪回数据库将数据库多次还原到同一个还原点时,通常的做法是每次删除并重新创建保证的还原点。 这将删除旧的闪回日志,并确保不超过快速恢复区的空间配额。

这种记录方法具有以下重要后果:

  • FLASHBACK DATABASE 可以使用块映像在保证还原点时重新创建数据文件内容。
  • 对于重复修改相同数据的工作负载,磁盘空间使用量可能低于正常的闪回日志记录。 需要的空间更少,因为每个更改的块只记录一次。 具有少量插入的应用程序可能会受益于这种磁盘空间节省。 对于具有大批量插入或大批量插入的应用程序来说,这种优势不太可能。 在不启用闪回数据库日志记录的情况下,为保证还原点进行日志记录的性能开销也可能更低。

假设您的主要目标是能够将数据库恢复到创建保证还原点的时间。 在这种情况下,关闭闪回日志记录并仅使用有保证的还原点通常更有效。 例如,假设您在周末对数据库主机执行应用程序升级。 您可以在升级开始时创建有保证的还原点。 如果升级失败,则使用 FLASHBACK DATABASE 命令撤销更改。

7.2.3 About Logging for Flashback Database with Guaranteed Restore Points Defined

如果启用闪回数据库并定义一个或多个保证还原点,则数据库将执行正常的闪回日志记录。

在这种情况下,恢复区保留闪回到当前和当前最早定义的保证恢复点之间的任意时间所需的闪回日志。 如果需要满足保证,闪回日志不会因空间压力而被删除。

闪回日志记录会导致一些性能开销。 根据数据库上的活动模式,它还会在快速恢复区中造成巨大的空间压力。 因此,您应该监视快速恢复区中使用的空间。

7.3 Prerequisites for Flashback Database and Restore Points

为确保闪回数据库的成功运行和保证还原点,您必须首先设置一些关键的数据库选项。
Flashback Database
在启用闪回数据库之前配置以下数据库设置:

  • 您的数据库必须在 ARCHIVELOG 模式下运行,因为归档日志用于闪回数据库操作。
  • 您必须启用快速恢复区,因为闪回日志只能存储在快速恢复区中。
  • 对于 Oracle Real Application Clusters (Oracle RAC) 数据库,快速恢复区必须在集群文件系统或 ASM 中。
  • 要在 CDB 中创建还原点,COMPATIBLE 初始化参数必须设置为 12.1.0 或更高版本。

Guaranteed Restore Points
要使用有保证的还原点,数据库必须满足以下附加先决条件:必须将 COMPATIBLE 初始化参数设置为 10.2.0 或更高。

注意:在使用普通还原点之前没有需要设置的特殊先决条件。

Restore Points in PDBs
要在可插拔数据库 (PDB) 中创建还原点,COMPATIBLE 初始化参数必须设置为 12.2.0 或更高版本。

7.4 Using Normal and Guaranteed Restore Points

您可以创建、监控和删除正常和保证还原点。

7.4.1 Creating CDB Restore Points

要在多租户容器数据库 (CDB) 中创建或保证还原点,请使用 CREATE RESTORE POINT SQL 命令。 提供还原点的名称并指定它是保证还原点还是普通还原点(默认)。

要创建 CDB 还原点:

  1. 确保满足闪回数据库和还原点的先决条件中描述的先决条件。
  2. 以具有 SYSDBA 或 SYSBACKUP 权限的普通用户身份将 SQL*Plus 连接到根目录。
  3. 确保 CDB 已打开或已挂载。 如果 CDB 已挂载,则它必须已完全关闭(除非它是物理备用数据库)。
  4. 运行 CREATE RESTORE POINT 语句创建 CDB 还原点
CREATE RESTORE POINT cdb_before_upgrade;
CREATE RESTORE POINT cdb_grp_before_upgrade GUARANTEE FLASHBACK DATABASE;

7.4.2 Creating PDB Restore Points

您可以使用 CREATE RESTORE POINT SQL 语句在可插拔数据库 (PDB) 中创建正常 PDB 还原点、保证 PDB 还原点或清洁 PDB 还原点。

您可以在连接到 PDB 或根目录时创建 PDB 还原点。 当 PDB 使用共享撤消时,只有当 PDB 没有任何未完成的事务时,您才能创建一个干净的还原点。

要在连接到 PDB 时创建 PDB 还原点:

  1. 确保满足闪回数据库和还原点的先决条件中描述的先决条件。
  2. 以普通用户或具有 SYSDBA 或 SYSBACKUP 权限的本地用户身份将 SQL*Plus 连接到 PDB。
  3. 如果您在使用共享撤消的 CDB 中创建干净的 PDB 还原点,则必须关闭 PDB。
  4. 如果多租户容器数据库 (CDB) 处于挂载状态,那么它一定一直处于关闭状态(除非它是物理备用数据库)。
  5. 将当前容器设置为 PDB。
  6. 使用 CREATE RESTORE POINT 命令创建 PDB 还原点。

要在连接到 CDB 时创建 PDB 还原点:

  1. 确保满足闪回数据库和还原点的先决条件中描述的先决条件。
  2. 以具有 SYSDBA 或 SYSBACKUP 权限的普通用户身份将 SQL*Plus 连接到目标数据库的根目录。
  3. 如果您在使用共享撤消的 CDB 中创建干净的 PDB 还原点,则必须关闭 PDB。
  4. 包含 PDB 的 CDB 可以打开或装载。 如果安装了 CDB,那么它必须一直关闭(除非它是物理备用数据库)。
  5. 将当前容器设置为根
  6. 使用带有 FOR PLUGGABLE DATABASE 子句的 CREATE RESTORE POINT 命令创建 PDB 还原点

7.4.3 Listing Restore Points Using the LIST Command

使用 LIST 命令列出特定还原点或 RMAN 存储库已知的所有还原点。

示例:

-- SQL Plus
LIST RESTORE POINT restore_point_name;
LIST RESTORE POINT ALL;
-- RMAN
LIST RESTORE POINT ALL;

注意:LIST 命令不显示 PDB 化身编号以及还原点是否为 PDB 还原点等详细信息。 要查看有关多租户环境中还原点的其他详细信息,请参阅下一节:使用 V$RESTORE_POINT 视图列出还原点。

7.4.4 Listing Restore Points Using the V$RESTORE_POINT View

您可以使用 V$RESTORE_POINT 控制文件视图获取有关所有当前定义的还原点(正常和保证)的信息,包括 CDB 还原点和 PDB 还原点。

V$RESTORE_POINT 视图包含有关多租户环境中还原点的附加信息,这些信息不会由 LIST RESTORE POINT 命令显示。 这包括详细信息,例如创建 PDB 还原点的可插拔数据库 (PDB) 的化身,以及还原点是 PDB 还原点还是干净的 PDB 还原点。

示例:

SELECT name, guarantee_flashback_database, pdb_restore_point, clean_pdb_restore_point, pdb_incarnation#, storage_sizeFROM v$restore_point;

NAME                         GUARANTEE_  PDB_RESTORE_POINT  CLEAN_PDB_RESTORE_POINT  STORAGE_SIZE
--------                     ----------  ----------------   -----------------------  ------------
CDB_GRP_BEFORE_PATCH            YES         NO                  NO                     84586
PDB_GRP_BEFORE_UPGRADE_TEMP     YES         YES                 NO                      4562
CDB_RP1                         NO          NO                  NO                         0
PDB1_BEFORE_PATCHING            NO          YES                 NO                         0
MYPDB_CLEAN_GRP_BEFORE_UPGRADE  NO          YES                 YES                        0    

对于正常的还原点,STORAGE_SIZE 为零。 对于有保证的还原点,STORAGE_SIZE 指示快速恢复区中磁盘空间的近似字节数,该区域被绑定以保留保证 FLASHBACK DATABASE 到该还原点所需的日志。

7.4.5 Dropping Restore Points

当您确信不需要现有还原点时,或者当您想要使用现有还原点的名称创建还原点时,您可以使用 DROP RESTORE POINT SQL*Plus 语句删除还原点。

SQL> DROP RESTORE POINT before_app_upgrade;
Restore point dropped.

同一语句用于删除正常还原点和保证还原点。

注意:正常的还原点最终会在控制文件之外老化,即使没有明确删除。 管理控制文件中还原点保留的规则是:

  • 最新的 2048 个还原点始终保存在控制文件中,无论其存在时间如何。
  • 任何比 CONTROL_FILE_RECORD_KEEP_TIME (默认值为7)的值更新的还原点都会被保留,无论定义了多少个还原点。

不满足这些条件中的任何一个的正常还原点可能会在控制文件之外老化。

保证还原点永远不会超出控制文件的期限。 它们一直存在,直到它们被明确删除。

7.5 Using Flashback Database

要对目标数据库使用闪回日志记录,您必须启用闪回数据库。 可以遵循某些准则以确保闪回数据库的最佳性能。

7.5.1 Enabling Flashback Database

使用 ALTER DATABASE 命令启用闪回数据库。

要启用闪回日志记录:

  1. 按照“启用快速恢复区”中的描述配置恢复区。
  2. 确保数据库实例已打开或已挂载。 如果实例已挂载,则数据库必须干净地关闭,除非它是物理备用数据库。 其他 Oracle Real Application Clusters (Oracle RAC) 实例可以处于任何模式。
  3. (可选)将 DB_FLASHBACK_RETENTION_TARGET 设置为所需闪回窗口的长度(以分钟为单位),默认是1440分钟,即1天。
ALTER SYSTEM SET DB_FLASHBACK_RETENTION_TARGET=4320 SCOPE=BOTH; # 3 days
  1. 为整个数据库启用闪回数据库功能
ALTER DATABASE FLASHBACK ON;
  1. (可选)禁用特定表空间的闪回日志记录。如果禁用表空间的闪回数据库,则必须在运行闪回数据库之前使其数据文件脱机。
    默认情况下,为所有永久表空间生成闪回日志。 您可以通过禁用特定表空间的闪回日志记录来减少开销,如以下示例所示:
ALTER TABLESPACE tbs_3 FLASHBACK OFF;
-- ALTER TABLESPACE tbs_3 FLASHBACK ON;

当您在数据库打开时启用闪回数据库时,该命令极有可能无法获得所需的内存。 如果该命令因此而失败,请稍后重试该命令或在关闭并重新启动实例后重试。

当您在物理备用数据库上启用闪回数据库时,您可以闪回备用数据库。 备库闪回数据库在Data Guard环境下有一些应用。

7.5.2 Disabling Flashback Database Logging

使用 ALTER DATABASE 命令禁用闪回数据库。

在处于装载或打开状态的数据库实例上,发出以下命令:

ALTER DATABASE FLASHBACK OFF;

7.5.3 Configuring the Environment for Optimal Flashback Database Performance

维护闪回日志对数据库实例的开销相对有限。 更改的块以相对不频繁的固定时间间隔从内存写入闪回日志,以限制处理和 I/O 开销。

为了在启用闪回数据库的情况下为大型生产数据库实现良好性能,Oracle 建议如下:

  • 为您的快速恢复区使用较快的文件系统,最好没有操作系统文件缓存。
    数据库在快速恢复区创建的文件(包括闪回日志)通常很大。 操作系统文件缓存通常对这些文件无效,实际上可能会增加读取和写入这些文件的 CPU 开销。 因此,建议使用避免操作系统文件缓存的文件系统,例如自动存储管理 (ASM)。
  • 为存放快速恢复区的文件系统配置足够的磁盘轴。
    对于大型生产数据库,可能需要多个磁盘轴来支持数据库有效写入闪回日志所需的磁盘吞吐量。
  • 如果用于保存快速恢复区的存储系统没有非易失性 RAM,则尝试在条带存储卷上配置文件系统。
    使用相对较小的条带大小,例如 128 KB。 这种技术使对闪回日志的每次写入都可以分布在多个轴上,从而提高性能。
  • 对于大型数据库,将初始化参数 LOG_BUFFER 设置为至少 8 MB。

闪回数据库的日志记录开销取决于数据库工作负载中读取和写入的混合情况。 当您有写入密集型工作负载时,闪回数据库日志记录开销很高,因为它必须记录所有这些数据库更改。 查询不会更改数据,因此不会影响闪回数据库的日志记录活动。

7.5.4 Monitoring the Effect of Flashback Database on Performance

有几种数据分析方法可用于监视系统上的闪回数据库工作负载。

  • AWR 报告
    Automatic Workload Repository (AWR) 通过收集、处理和维护用于数据库问题检测和自调整的性能统计信息来自动收集数据库统计信息。 您可以比较启用闪回数据库前后的 AWR 报告,以监控性能影响。
  • AWR 快照
    您可以查看 AWR 快照以查明由闪回日志记录引起的系统使用情况。 例如,如果 flashback buf free by RVWR 是最重要的等待事件,那么您就知道 Oracle 数据库无法很快写入闪回日志。 因此,您可能希望调整快速恢复区使用的文件系统和存储,可能使用“为最佳闪回数据库性能配置环境”中描述的技术
  • V$FLASHBACK_DATABASE_STAT视图
    V$FLASHBACK_DATABASE_STAT 视图显示了数据库记录的闪回数据的字节数。 视图中的每一行都显示累积的统计信息(通常是在一个小时内)。 FLASHBACK_DATA和REDO_DATA列分别描述了在该时间间隔内写入的闪回数据和重做数据的字节数,而DB_DATA列描述了读取和写入的数据块的字节数。 FLASHBACK_DATA 和 REDO_DATA 列对应于顺序写入,而 DB_DATA 列对应于随机读取和写入。
  • V S Y S S T A T 视图由于顺序 I / O 和随机 I / O 之间的差异, I / O 开销的更好指示是为闪回日志发出的 I / O 操作数。下表显示的 V SYSSTAT视图 由于顺序 I/O 和随机 I/O 之间的差异,I/O 开销的更好指示是为闪回日志发出的 I/O 操作数。 下表显示的 V SYSSTAT视图由于顺序I/O和随机I/O之间的差异,I/O开销的更好指示是为闪回日志发出的I/O操作数。下表显示的VSYSSTAT 统计信息可以告诉您实例为各种目的发出的 I/O 操作数。
列名 列含义
Physical write I/O request 写数据块发出的写操作数
Physical read I/O request 为读取数据块发出的读取操作数
Redo writes 为写入重做日志而发出的写操作数
Flashback log writes 为写入闪回日志而发出的写操作数
Flashback log write bytes 从此实例写入的闪回数据库数据的总大小(以字节为单位)

7.5.5 About Flashback Writer (RVWR) Behavior with I/O Errors

当启用闪回或有保证的还原点时,后台进程RVWR将闪回数据写入快速恢复区的闪回数据库日志中。

如果 RVWR 遇到 I/O 错误,则预期会出现以下行为:

  • 如果定义了任何有保证的还原点,那么当 RVWR 遇到 I/O 错误时实例将失败。
  • 如果未定义保证还原点,则当 RVWR 遇到 I/O 错误时,实例不受影响。 请注意以下情况:
    • 在主数据库上,Oracle 数据库会在数据库打开时自动禁用闪回数据库。 所有现有的交易和查询不受影响。 对于单实例和 Oracle RAC 数据库,此行为是预期的。
    • 在物理或逻辑备用数据库上,RVWR 似乎已停止响应,定期重试 I/O。 这最终可能会导致逻辑备用数据库或物理备用数据库的托管恢复挂起。 (Oracle 数据库不会导致备用实例失败,因为它不希望导致主数据库在最大保护模式下失败。)要解决此问题,您可以发出 SHUTDOWN ABORT 或 ALTER DATABASE FLASHBACK OFF 命令。

执行闪回和数据库时间点恢复

参见备份和恢复指南第18章Performing Flashback and Database Point-in-Time Recovery

RMAN 使您能够查询不需要的数据库更改,并根据 Oracle 闪回技术和数据库备份选择并执行适当的恢复策略。

在备份和恢复指南第30章:30 Performing User-Managed Database Flashback and Recovery描述了用户管理的Flashback Database,但没看出来和本章描述的有何区别:

A user-managed backup and recovery strategy means a method that does not depend on RMAN. Use the flashback features of Oracle Database in a user-managed backup and recovery strategy.

在备份和恢复指南第2.8节,有一个快速指南可以参看。

18.1 Overview of Oracle Flashback Technology and Database Point-in-Time Recovery

本概述描述了 Oracle 闪回技术和数据库时间点恢复的目的和基本概念。

18.1.1 Purpose of Flashback and Database Point-in-Time Recovery

某些情况适合使用时间点恢复或闪回功能将数据库或数据库对象返回到其先前时间点的状态。

一些典型的情况包括:

  • 用户错误或损坏会删除所需的数据或引入损坏的数据。 例如,用户或 DBA 可能会错误地删除或更新一个或多个表的内容,删除应用程序更新期间仍然需要的数据库对象,或者运行中途失败的大批量更新。
  • 数据库升级失败或升级脚本出错。
  • 介质故障后的完整数据库恢复无法成功,因为您没有所有需要的重做日志或增量备份。

18.1.2 About Point-in-Time Recovery and Flashback Features

数据库时间点恢复 (DBPITR) 和闪回功能使您能够将数据库恢复到之前的时间点。

DBPITR 是针对不需要的数据库更改的最基本解决方案。 它有时被称为不完全恢复因为它不使用所有可用的重做或完全恢复对数据库的所有更改。 在这种情况下,您恢复整个数据库备份,然后应用重做日志或增量备份来重新创建直到不需要的更改之前的某个时间点的所有更改。

如果不需要的数据库更改很广泛但仅限于特定的表空间,那么您可以使用表空间时间点恢复 (TSPITR) 将这些表空间返回到较早的系统更改编号,同时未受影响的表空间仍然可用。

如果不需要的数据库更改仅限于特定的表或表分区,那么您可以使用以前创建的 RMAN 备份仅将这些对象返回到不需要的更改发生之前的某个时间点。

Oracle 数据库还提供了一组统称为闪回技术的特性,支持查看过去的数据状态,以及及时来回回绕数据,而无需从备份中恢复数据库。 根据对数据库的更改,闪回技术通常可以更快地恢复不需要的更改,并且对数据库可用性的影响更小。

对于多租户环境,数据库时间点恢复 (DBPITR) 和闪回操作之间可能存在某些依赖关系。

对于使用本地撤消的可插拔数据库 (PDB),DBPITR 和闪回操作彼此独立。

从 Oracle Database 21c 开始,您可以对同一数据库化身中的孤立 PDB 化身或祖先数据库化身中的孤立 PDB 化身执行 PDB 闪回或时间点恢复操作。 在一个 CDB 中,您可以同时执行闪回或 PITR 多个 PDB 到不同的数据库和具有当前数据库祖先化身的 PDB 化身。

18.1.3 Basic Concepts of Database Point-in-Time Recovery

DBPITR 在物理层面上工作,将数据文件返回到过去目标时间的状态。

在 RMAN DBPITR 操作中,您指定目标 SCN、日志序列、还原点或时间。 RMAN 从目标时间之前创建的备份恢复数据库,然后应用增量备份和日志来重新创建数据文件备份时间和恢复终点之间的所有更改。 当终点指定为 SCN 时,数据库应用重做日志并在每个重做线程或指定的 SCN 之后停止,以先发生者为准。 当结束点被指定为一个时间时,数据库内部为指定的时间确定一个合适的SCN,然后恢复到这个SCN。

如果您的备份策略设计得当并且您的数据库以 ARCHIVELOG 模式运行,那么 DBPITR 几乎在所有情况下都是一个选项。 给定一个目标 SCN,数据文件可以从备份中恢复,并且无需用户干预即可高效恢复。 然而,RMAN DBPITR 有以下缺点:

  • 您不能将选定的对象返回到它们之前的状态,只能返回整个数据库
  • 您的整个数据库在 DBPITR 期间不可用
  • DBPITR 可能很耗时,因为 RMAN 必须恢复所有数据文件。 此外,RMAN 可能需要恢复重做日志和增量备份来恢复数据文件。 如果备份在磁带上,则此过程可能需要更长的时间。

您可以对一个或多个 PDB 执行时间点恢复 (PITR)。 在 PITR 操作之前创建的备份仍然有效,并且可以在发生介质故障时使用。

在 PDB PITR 操作期间,PDB 的所有数据文件都在原地恢复。 如果 CDB 使用共享撤消,则 UNDO 表空间无法就地恢复,因为它由 CDB 中的所有 PDB 共享。 因此,RMAN 将 UNDO、SYSTEM 和 SYSAUX 表空间恢复到辅助目标,然后使用撤消信息将 PDB 恢复到目标时间。

配置快速恢复区后,RMAN 在 PDB PITR 期间将其用作辅助目标。 如果未配置快速恢复区,则使用 AUXILIARY DESTINATION 子句指定用于存储辅助数据库文件的位置。 如果快速恢复区没有足够的空间来恢复根表空间和撤消表空间,请使用 AUXILIARY DESTINATION 子句指定备用位置。

在 Data Guard 环境中,为了让备用数据库跟随主数据库(其中 PDB 已还原到特定时间点),您可能需要闪回整个备用数据库、还原 PDB 或闪回 PDB。

18.1.4 Basic Concepts of Flashback Technology

在大多数可用的情况下,Oracle 数据库的闪回特性比介质恢复更有效。 您可以使用它们来调查数据库过去的状态。

18.1.4.1 About Physical Flashback Features Useful in Backup and Recovery

Oracle 闪回数据库是 DBPITR 最有效的替代方案

与其他闪回功能不同,它在物理层面上运行并将当前数据文件恢复为过去某个时间的内容。 结果类似于 DBPITR 的结果,包括 OPEN RESETLOGS,但闪回数据库通常更快,因为它不需要您恢复数据文件,并且与介质恢复相比只需要有限的重做应用。

闪回数据库需要快速恢复区。 要为闪回数据库启用日志记录,您必须设置 DB_FLASHBACK_RETENTION_TARGET 初始化参数并发出 ALTER DATABASE FLASHBACK ON 语句。

在正常操作期间,数据库会定期将数据文件块的旧图像写入闪回日志。 闪回日志是按顺序写入的,通常是批量写入的。 在某些方面,闪回日志就像一个连续的备份。 数据库在恢复区自动创建、删除和调整闪回日志的大小。 不归档闪回日志。 您只需要了解闪回日志即可监控性能并确定恢复区的磁盘空间分配。

当您执行闪回数据库操作时,数据库使用闪回日志来访问过去版本的数据块,并且还使用归档重做日志中的一些数据。 因此,您无法在发现故障后启用闪回数据库,然后使用闪回数据库来回溯此故障。 您可以使用有保证的还原点的相关功能在固定时间点保护数据库的内容,例如在有风险的数据库更改之前。

如果在所需的少量重做应用期间遇到任何不可恢复的操作,则会导致逻辑损坏的数据块。 当访问此类块时,这会导致 Oracle 错误。

您可以对整个多租户容器数据库 (CDB) 或特定的可插拔数据库 (PDB) 执行闪回数据库操作。

注意:您不能仅在根上执行闪回操作。 您必须对整个 CDB 执行闪回操作。

整个 CDB 上的闪回数据库使您能够将整个 CDB(包括其所有 PDB)倒回到以前的时间点。 目标时间可以由系统更改号 (SCN)、日志序列号、还原点或时间指定。

PDB 上的闪回数据库使您能够撤消由该 PDB 中的逻辑数据损坏或用户错误引起的不需要的更改。 在特定 PDB 上执行闪回数据库时,其他 PDB 可以保持打开和运行。

所需的目标时间点由 PDB 还原点、CDB 还原点、SCN 或时间表达式指定。 PDB 上的闪回操作到 CDB 还原点等同于 PDB 上的闪回操作到 CDB 化身上的还原点 SCN。 一般来说,对于PDB,闪回到PDB还原点的操作比闪回到CDB还原点的操作更准确。 这是因为 PDB 还原点表示创建它的时间点的 PDB 子化身。

可以在单个 PDB 上执行多个闪回操作。 但是,您只能对 PDB 执行闪回操作到其祖先化身之一。 PDB 必须始终保持与整个数据库化身兼容的过去化身。

即使在 PDB 上执行闪回数据库操作后,PDB 备份仍然有效。 如果发生介质故障,您可以使用这些备份执行恢复。 这种类型的 PDB 恢复可以通过数据库重置日志和 PDB 重置日志来恢复。

在主数据库上执行相同的操作后,您还可以在物理备用数据库上对 PDB 执行闪回数据库操作。

18.1.4.2 About Logical Flashback Features Useful in Backup and Recovery

逻辑闪回功能用于将表及其内容恢复到过去的时间。

逻辑特性如下:

  • 闪回表
    您可以将一个表或一组表恢复到指定的较早时间点,而无需使数据库的任何部分脱机。 在许多情况下,闪回表消除了执行更复杂的时间点恢复操作的需要。 闪回表在恢复表的同时自动维护关联的属性,例如当前索引、触发器和约束,而不需要您查找和恢复特定于应用程序的属性。

  • 闪回DROP
    您可以反转 DROP TABLE 语句的效果。

除了 Flashback Drop 之外的所有逻辑闪回特性都依赖于撤销数据。 主要用于为 SQL 查询和回滚事务提供读取一致性,撤消记录包含重建数据所需的信息,因为它存在于过去的时间并检查自过去时间以来的更改记录。

闪回丢弃依赖于一种称为回收站的机制,数据库使用该机制来管理丢弃的数据库对象,直到它们占用的空间被新数据需要为止。 没有分配给回收站的固定空间量,也不能保证丢弃的对象在回收站中保留多长时间。 根据系统活动,丢弃的对象可能会在回收站中保留数秒或数月。

18.1.4.3 About Undo and Flashback Database Operations for PDBs

多租户容器数据库 (CDB) 可以使用共享撤消或本地撤消。 RMAN 用于执行闪回数据库操作的技术取决于 CDB 撤消配置的类型。

当 CDB 使用本地撤消时,在可插拔数据库 (PDB) 上执行闪回数据库操作非常简单,因为只需要修改与该 PDB 相关的数据文件

在使用共享撤销的 CDB 中,一组表空间由所有 PDB 共享。 多个 PDB 的撤消数据可能混合在撤消表空间中,甚至在单个数据块中。 因此,RMAN在对PDB进行闪回数据库操作时,会自动使用一个辅助实例来恢复共享的undo表空间和root中的某些表空间,然后将数据恢复到需要的时间点。 此过程可能涉及恢复相对少量数据的备份。 当您对 PDB 执行闪回数据库操作到干净的 PDB 还原点时,不需要辅助实例或还原备份。

默认情况下,辅助实例创建在快速恢复区。 您可以在 FLASHBACK DATABASE 命令中使用 AUXILIARY DESTINATION 子句来指定辅助实例的备用位置。

18.1.5 About Managing Redo Corruption in CDBs

RMAN 提供了管理 PDB 中数据块重做损坏的方法。

在极少数情况下,多租户容器数据库 (CDB) 中的重做日志可能会损坏。 在这种情况下,如果受影响的数据块仅驻留在一个可插拔数据库 (PDB) 中,则您可以执行以下操作之一:

  • 在 PDB 上执行闪回操作到损坏之前的时间点,然后使用 RESETLOGS 打开 PDB
  • 将 PDB 执行时间点恢复到损坏之前的时间点,然后使用 RESETLOGS 打开 PDB

在主数据库上执行这些步骤之一后,此主数据库的任何备用数据库也可以跳过损坏的重做,前提是您在 PDB 上执行 PITR 或闪回后使备用数据库能够跟随主数据库所需的步骤。

18.2 Rewinding a Table with Flashback Table

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

要将表倒回到以前的时间点:

18.2.1 Prerequisites for Flashback Table

要执行闪回表操作,表必须符合闪回条件并且执行该操作的用户必须具有所需的权限。

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

  • 您必须已被授予 FLASHBACK ANY TABLE 系统特权,或者您必须具有对该表的 FLASHBACK 对象特权。
  • 您必须对表具有 READ 或 SELECT、INSERT、DELETE 和 ALTER 权限。
  • 要将表闪回到还原点,您必须具有 SELECT ANY DICTIONARY 或 FLASHBACK ANY TABLE 系统特权或 SELECT_CATALOG_ROLE 角色。

要使对象有资格被闪回,必须满足以下先决条件:

  • 该对象不得包含以下类别:属于集群的表、物化视图、高级队列 (AQ) 表、静态数据字典表、系统表、远程表、对象表、嵌套表或单个表分区或 子分区。
  • 在当前时间和目标闪回时间之间不得更改表的结构
    以下数据定义语言 (DDL) 操作会更改表的结构:升级、移动或截断表; 向表添加约束,向集群添加表; 修改或删除列; 添加、删除、合并、拆分、合并或截断分区或子分区(添加范围分区除外)。
  • 必须在表上开启行移动,表示发生闪回后rowid发生了变化。
    存在此限制是因为如果应用程序存储了闪回之前的 rowid,则无法保证这些 rowid 对应于闪回之后的相同行。 如果你的应用程序依赖于 rowids,那么你就不能使用 Flashback Table。
  • 撤消表空间中的撤消数据必须及时向后延伸足够远以满足闪回目标时间或 SCN。
    您可以执行闪回表的时间点由撤消保留期(撤消数据在被回收之前保留的最短时间)和表空间特性决定。 撤消数据包含有关数据块在更改之前的信息。 闪回操作使用撤销来重新创建原始数据。
    为确保为闪回表操作保留撤消信息,Oracle 建议将撤消表空间的 UNDO_RETENTION 参数设置为 86400 秒(24 小时)或更长。

注意:FLASHBACK TABLE … TO BEFORE DROP 是使用 Flashback Drop 功能,而不是 Flashback Table,因此不受这些先决条件的约束。

18.2.2 Performing a Flashback Table Operation

要在一个或多个表上使用闪回表功能,请使用带目标时间或 SCN 的 FLASHBACK TABLE SQL 语句。

  1. 确保满足“闪回表的先决条件”中描述的先决条件。
  2. (可选)要在闪回表操作期间保持数据库触发器处于启用状态,请参阅“在闪回表期间保持触发器处于启用状态”。
  3. 作为普通用户或具有 SYSDBA 或 SYSBACKUP 权限的本地用户,将 SQL*Plus 连接到包含该表的 PDB。 标识当前数据库 (CDB) SCN。
  4. 标识要将表返回到的时间、SCN 或还原点
-- 查询还原点
SELECT NAME, SCN, TIME FROM V$RESTORE_POINT;
  1. 确保存在足够的撤消数据以将表倒回到指定的目标。
-- 如果设置了 UNDO_RETENTION 初始化参数,并且开启了撤销保留保证(在undo表空间上设置)
-- 则可以用以下查询确定撤消数据保留多长时间
SELECT NAME, VALUE/60 MINUTES_RETAINED
FROM   V$PARAMETER
WHERE  NAME = 'undo_retention';
  1. 确保为使用闪回表倒带的所有对象启用行移动
ALTER TABLE hr.temp_employees ENABLE ROW MOVEMENT;
  1. 判断要闪回的表是否对其他表有依赖。 如果存在依赖关系,则决定是否也闪回这些表
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';
  1. 对要闪回的对象执行 FLASHBACK TABLE 语句。
    注意:时间戳到 SCN 的映射并不总是准确的。 当您将时间戳与 FLASHBACK TABLE 语句一起使用时,表闪回的时间最多可能与为 TO_TIMESTAMP 指定的时间相差大约 3 秒。 如果需要准确的时间点,则使用 SCN 而不是时间。
  2. 可选,查询表以检查数据。

默认情况下,数据库在执行闪回表操作之前禁用受影响表上的触发器。 操作后,数据库将触发器返回到操作前的状态(启用或禁用)。

要在表闪回期间保持触发器处于启用状态,请将 ENABLE TRIGGERS 子句添加到 FLASHBACK TABLE 语句中。

18.3 Rewinding a DROP TABLE Operation with Flashback Drop

您可以使用 FLASHBACK TABLE … TO BEFORE DROP 语句从回收站中检索对象。

18.3.1 About Flashback Drop

Flashback Drop 反转 DROP TABLE 操作的效果。 Flashback Drop 比可在这种情况下使用的其他恢复机制(例如时间点恢复)更快,并且不会导致停机或丢失最近的事务。

删除表时,数据库不会立即删除与表关联的空间。 相反,该表被重命名,并与任何关联的对象一起放入回收站。 系统生成的回收站对象名称是唯一的。 您可以查询回收站中的对象,就像您可以查询其他对象一样。

闪回操作从回收站中检索表。 检索删除的表时,您可以指定表的原始用户指定名称或系统生成的名称

当您删除一个表时,该表及其所有依赖对象一起进入回收站。 同样,当您执行 Flashback Drop 时,通常会一起检索对象。 当您从回收站恢复表时,依赖对象(如索引)不会取回它们的原始名称; 他们保留系统生成的回收站名称。 Oracle 数据库检索表上定义的所有索引(位图连接索引除外),以及表上定义的所有触发器和约束(引用其他表的参照完整性约束除外)。

由于空间压力,某些依赖对象(例如索引)可能已被回收。 在这种情况下,无法从回收站中检索回收的依赖对象。

18.3.2 Prerequisites of Flashback Drop

在执行闪回删除操作之前必须满足先决条件。

Flashback Drop和回收站相关操作需要的用户权限如下:

  • DROP
    任何对对象具有 DROP 权限的用户都可以删除该对象,将其放入回收站。
  • FLASHBACK TABLE … TO BEFORE DROP
    此语句的权限与 DROP 的权限相关联。 也就是说,任何可以删除对象的用户都可以执行闪回删除以从回收站中检索删除的对象。
  • PURGE
    清除回收站的权限与 DROP 权限相关联。 任何拥有 DROP TABLE、DROP ANY TABLE 或 PURGE DBA_RECYCLE_BIN 权限的用户都可以从回收站中清除对象。
  • READ 或 SELECT 和 FLASHBACK 回收站中的对象
    用户必须对回收站中的对象具有READ 或SELECT 和FLASHBACK 权限才能查询回收站中的对象。 在对象被删除之前对其具有 READ 或 SELECT 权限的任何用户将继续对回收站中的对象具有 READ 或 SELECT 权限。 用户必须具有 FLASHBACK 权限才能查询回收站中的任何对象,因为这些对象来自数据库的过去状态。

对象必须满足以下先决条件才有资格从回收站中检索:

  • 回收站仅适用于非系统、本地管理的表空间。 如果一个表位于非系统的、本地管理的表空间中,但它的一个或多个依赖段(对象)位于字典管理的表空间中,那么这些对象将受到回收站的保护。
  • 在其上定义了细粒度审计 (FGA) 和虚拟专用数据库 (VPD) 策略的表不受回收站保护。
  • 分区索引组织表不受回收站保护。
  • 该表不得在空间回收操作期间被用户或 Oracle 数据库用PURGE命令清除。

18.3.3 Performing a Flashback Drop Operation

使用 FLASHBACK TABLE … TO BEFORE DROP 语句从回收站中恢复对象。 您可以指定回收站中表的名称或原始表名称。

SHOW RECYCLEBIN;
SELECT object_name AS recycle_name, original_name, type FROM recyclebin;
SELECT * FROM  "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0";
-- 注意:如果您有必要的权限,那么您也可以对回收站中的表使用闪回查询
-- 但只能使用回收站名称而不是原始表名称。 您不能对回收站中的对象使用数据操作语言 (DML) 或 DDL 语句。
FLASHBACK TABLE "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0" TO BEFORE DROP;
FLASHBACK TABLE "BIN$gk3lsj/3akk5hg3j2lkl5j3d==$0" TO BEFORE DROP 
  RENAME TO hr.emp_demo;
SELECT INDEX_NAME FROM USER_INDEXES WHERE  TABLE_NAME = 'EMPLOYEE_DEMO';
ALTER INDEX "BIN$JKS983293M1dsab4gsz/I249==$0" RENAME TO I_EMP_DEMO;
-- 如果检索到的表在放入回收站之前具有引用约束,则重新创建它们。
-- 此步骤必须手动执行,因为回收站不会保留表上的引用约束。

您可以创建并删除多个具有相同原始名称的对象。 所有丢弃的对象都存储在回收站中。
原理是虽然对象名相同,但对象在回收站中的名字不同。并且可以通过创建时间确定对象。

或者亦可以逐个回复,因为最近删除的具有此原始名称的表以其原始名称首先从回收站中检索。

18.4 Rewinding a Database with Flashback Database

闪回数据库通过将数据库返回到之前时间点的状态来逆转不需要的更改。

18.4.1 Prerequisites of Flashback Database

闪回数据库的工作原理是撤消对运行命令时存在的数据文件的更改。 必须满足先决条件才能执行闪回数据库操作。

要使用 FLASHBACK DATABASE 命令将数据库内容返回到闪回窗口内的时间点,您的数据库必须先前已配置闪回日志记录。 要将数据库返回到有保证的还原点,您必须事先定义有保证的还原点

请注意以下重要先决条件:

  • 当前没有数据文件丢失或损坏。 您只能使用 FLASHBACK DATABASE 倒回 Oracle 数据库对数据文件所做的更改,而不是修复介质故障。
  • 您不是要从意外删除的数据文件中恢复或撤消对数据库名称的更改。
  • 您没有尝试使用 FLASHBACK DATABASE 返回到恢复或重新创建控制文件之前的时间点。 如果从备份中恢复或重新创建数据库控制文件,则所有累积的闪回日志信息都将被丢弃。
  • 您没有尝试使用 FLASHBACK DATABASE 来撤消兼容性更改。

18.4.2 Performing a Flashback Database Operation

您可以使用 FLASHBACK DATABASE 命令将整个多租户容器数据库 (CDB) 倒回到过去的某个时间点。

本主题介绍执行数据库闪回的基本技术,使用时间表达式、正常或保证还原点的名称或 SCN 指定所需的目标时间点。 它做出以下假设:

  • 您正在将数据库倒回到当前数据库化身中的某个时间点。
  • FLASHBACK DATABASE 命令中使用的 SCN 指的是数据库化身的直接祖先路径中的 SCN。 如果先前使用 RESETLOGS 选项打开数据库后未放弃化身,则该化身位于此路径中。

对整个 CDB 执行闪回数据库操作:

  1. 确保满足“闪回数据库的先决条件”中描述的先决条件。
  2. 将 SQL*Plus 连接到目标 CDB 并确定 FLASHBACK DATABASE 命令所需的 SCN、还原点或时间点
-- 获取闪回数据库窗口中最早的SCN
SELECT OLDEST_FLASHBACK_SCN, OLDEST_FLASHBACK_TIME
FROM V$FLASHBACK_DATABASE_LOG;
-- 获取当前的SCN
SELECT CURRENT_SCN FROM V$DATABASE;
-- 查询可用的保证还原点
SELECT NAME, SCN, TIME, DATABASE_INCARNATION#,
       GUARANTEE_FLASHBACK_DATABASE
FROM   V$RESTORE_POINT
WHERE  GUARANTEE_FLASHBACK_DATABASE='YES';
 
NAME                   SCN TIME                  DATABASE_INCARNATION# GUA
--------------- ---------- --------------------- --------------------- ---
BEFORE_CHANGES     5753126 04-MAR-12 12.39.45 AM                     2 YES

-- 注意:如果闪回窗口没有足够远地回溯到过去以达到所需的目标时间,
-- 并且如果您在所需的时间没有保证的还原点,那么您可以通过使用数据库时间点恢复
  1. 一致关闭数据库,确保它没有被任何实例打开,然后挂载它
SHUTDOWN IMMEDIATE;
STARTUP MOUNT;
  1. 重复此过程步骤 2 中的查询

数据库关闭时会生成一些闪回日志记录数据。 如果由于快速恢复区的空间压力而删除了闪回日志,那么您的目标 SCN 可能无法访问。
5. 以具有 SYSDBA 或 SYSBACKUP 权限的普通用户身份连接到 root
6. 要查看预配置的通道,请运行 RMAN的SHOW 命令。因为在闪回操作期间,RMAN 可能需要从备份中恢复归档的重做日志。

SHOW ALL;
  1. 运行FLASHBACK DATABASE命令对整个CDB执行闪回操作到指定时间点。您可以使用 SCN、时间表达式或 CDB 还原点来指定目标时间。
  2. 在 SQL*Plus 中以只读方式打开 CDB 并运行一些查询来验证数据库内容
ALTER DATABASE OPEN READ ONLY;

如果您对数据库的状态感到满意,则从第 9 步结束该过程。如果您对数据库的状态不满意,请跳至第 10 步。

  1. 如果您对结果满意,则执行以下互斥操作之一
-- 操作A
-- 通过使用 RESETLOGS 选项打开数据库,使数据库可用于更新。
SHUTDOWN IMMEDIATE
STARTUP MOUNT
ALTER DATABASE OPEN RESETLOGS;
-- 注意:执行此 OPEN RESETLOGS 操作后,将放弃 FLASHBACK DATABASE 的目标 SCN 之后对数据库的所有更改。 
-- 您可以使用“将数据库倒带到一个被遗弃的化身分支中的一个 SCN”中的技术,将数据库返回到该 SCN 范围,同时它们仍保留在闪回窗口中。

-- 操作B
-- 使用 Oracle Data Pump Export 对状态已损坏的对象进行逻辑备份。
-- 然后,使用 RMAN 将数据库恢复到当前时间:
RECOVER DATABASE;
-- 此步骤通过将重做日志中的所有更改重新应用到数据库并将其返回到最近的 SCN 来取消闪回数据库的影响。
-- 重新打开数据库读/写后,您可以使用数据泵导入实用程序导入导出的对象。
  1. 如果您发现您使用了错误的还原点、时间或 SCN 进行闪回,则挂载数据库并执行以下互斥选项之一
-- 操作A
-- 如果您选择的目标时间在过去还不够远,则使用另一个 FLASHBACK DATABASE 命令将数据库倒回更远的时间
FLASHBACK DATABASE TO SCN 42963;  #earlier than current SCN 

-- 操作B
-- 如果您选择的目标 SCN 距离过去太远,则使用 RECOVER DATABASE UNTIL 将数据库及时前移到所需的 SCN:
RECOVER DATABASE UNTIL SCN 56963; #later than current SCN 

-- 操作C
-- 如果要完全取消 FLASHBACK DATABASE 命令的影响,则可以使用不带 UNTIL 子句或 SET UNTIL 命令的 RECOVER DATABASE 命令执行数据库的完全恢复:
RECOVER DATABASE;
-- RECOVER DATABASE 命令将所有更改重新应用到数据库,将其返回到最近的 SCN。
  1. 打开 PDB,因为打开 CDB 时不会自动打开 PDB
ALTER PLUGGABLE DATABASE ALL OPEN;
ALTER PLUGGABLE DATABASE my_pdb OPEN;

18.4.3 Performing a Flashback Database Operation for PDBs

您可以使用 FLASHBACK DATABASE 命令对单个可插拔数据库 (PDB) 执行闪回数据库操作。 仅修改与该 PDB 相关的数据文件。 CDB 中的其余 PDB 不受影响,可以使用。

本主题介绍执行 PDB 闪回的基本技术,使用时间表达式、正常或保证还原点的名称或 SCN 指定所需的目标时间点。 它做出以下假设:

  • 您正在将 PDB 倒回到当前数据库化身中的某个时间点。
  • FLASHBACK DATABASE 命令中使用的 SCN 是指 PDB 化身的直接祖先路径中的 SCN。

要为 PDB 执行闪回数据库操作:

  1. 以具有 SYSDBA 或 SYSBACKUP 权限的普通用户身份连接到 root,如使用 RMAN 建立数据库连接中所述。
  2. 确保 CDB 已打开
  3. 确定闪回数据库命令所需的 SCN、还原点或时间点
  4. 确保必须对其执行闪回数据库操作的 PDB 已关闭。 其他 PDB 可以打开并运行
  5. 对指定的 PDB 执行闪回数据库操作到所需的时间点
FLASHBACK PLUGGABLE DATABASE my_pdb TO SCN 24368 AUXILIARY DESTINATION '+data';
FLASHBACK PLUGGABLE DATABASE my_pdb TO RESTORE POINT before_appl_changes AUXILIARY DESTINATION '/temp/aux_dest';
FLASHBACK PLUGGABLE DATABASE my_pdb TO TIME "TO_DATE('03/20/15','MM/DD/YY')";
  1. 对于使用共享撤消的 PDB,您可以选择包含 AUXILIARY DESTINATION 子句来指定辅助实例的位置,该辅助实例存储作为闪回数据库操作的一部分恢复的数据文件。 如果省略该子句,则在快速恢复区中创建辅助实例。
  2. 使用 RESETLOGS 打开 PDB
ALTER PLUGGABLE DATABASE my_pdb OPEN RESETLOGS;

18.4.4 Performing a Flashback Operation on a PDB to an Ancestor or Orphan Incarnation

略。

18.4.5 Monitoring Flashback Database

数据字典视图包含用于监视闪回数据库的信息。

当您使用闪回数据库将数据库倒回到过去的目标时间时,闪回数据库会确定哪些块在目标时间之后更改并从闪回日志中恢复它们。 这称为还原阶段(restore phase)。 此阶段完成后,闪回数据库然后使用重做日志重新应用在将这些块写入闪回日志后所做的更改。 这称为恢复阶段(recovery phase)

可以通过查询 V$SESSION_LONGOPS 视图来监视恢复阶段闪回数据库的进度。 opname 是闪回数据库。 在 TOTALWORK 列下是必须读取的闪回日志的兆字节数。 以下示例中的 SOFAR 列列出了当前已读取的兆字节数。

-- Tracking Flashback Database Progress - Restore Phase

SQL> SELECT sofar, totalwork, units FROM v$session_longops WHERE opname = 'Flashback Database';
 
SOFAR  TOTALWORK  UNITS
-----  ---------- --------------------------------
   17          60 Megabytes

可以通过查询视图 V$RECOVERY_PROGRESS 来监视恢复阶段闪回数据库的进度。

18.5 Performing Database Point-in-Time Recovery

略。

18.6 Performing Point-in-Time Recovery of Application PDBs

略。

18.7 Performing Point-in-Time Recovery of Sparse Databases

略。

18.8 Flashback and Database Point-in-Time Recovery Scenarios

略。

猜你喜欢

转载自blog.csdn.net/stevensxiao/article/details/128784141