Flashback Oracle文档阅读
Posted dingdingfish
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 数据库开发指南解释了如何使用这个特性。 -
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.
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 包:
- 通过调用 DBMS_FLASHBACK.ENABLE_AT_TIME 或 DBMS_FLASHBACK.ENABLE_AT_SYSTEM_CHANGE_NUMBER 指定过去的时间。
- 执行常规查询(即没有特殊闪回功能语法(如 AS OF)的查询)。 不要执行 DDL 或 DML 操作。在指定的过去时间查询数据库。
- 通过调用 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,例如强制数字粉碎、访问历史数据、选择性数据恢复和审计。
以上是关于Flashback Oracle文档阅读的主要内容,如果未能解决你的问题,请参考以下文章