使用 Total Recall

注意:闪回数据存档特性是 Total Recall 选件的一部分。

本教程将介绍如何创建、监视和维护闪回数据存档,该存档用于跟踪并存储对表中行的所有事务变更。您将创建一些“错误的事务”,然后使用 UPDATE 命令恢复原始数据。

大约 40 分钟

主题

本教程包括下列主题:

将光标置于此图标上可以加载和查看本教程的所有屏幕截图。 (警告:因为此操作会同时加载所有屏幕截图,所以网速较慢时,响应时间可能会比较长。)

注意:此外,您还可以在下列步骤中将光标放在每个单独的图标上,从而仅加载和查看与该步骤相关的屏幕截图。可以通过单击各个屏幕截图将其隐藏。

概述

闪回数据存档能够自动跟踪和存储一条记录在其生命周期内的所有事务变更。该特性还提供了对历史数据的无缝访问。AS OF 查询显示某个时间点之前的数据,而 VERSIONS 查询显示数据随时间变化的情况。闪回数据存档可为超出撤销数据的时间段提供闪回功能。您可以使用闪回数据存档生成合规性报表和审计报表,并进行数据分析与决策支持。

返回主题列表

开始本教程之前,您应该:

1.

通过完成在 Linux 上安装 Oracle Database 11g 第 2 版教程来安装数据库。

2.

flada.zip 文件下载并解压缩到您的工作目录中。

注意:该 OBE 中的文件适用于 Linux 环境。两个文件:flada_setup.sql 和 flada_tbs2.sql 都必须使用 CREATE TABLESPACE 命令将数据文件规范更改为 Windows 文件名格式才能在 Windows 环境中运行。

返回主题列表

在本节中,您将扮演两个不同的角色:

要跟踪和存储对 HR.EMPLOYEES 表的所有事务变更,您需要创建、配置和使用闪回数据存档。执行以下步骤:

1.

使用 SQL*Plus,以 SYS 用户身份连接到数据库,并从文件所在的目录中运行 flada_setup.sql 脚本。

sqlplus / as sysdba
@flada_setup.sql

该设置脚本会创建一个小型表空间,并使用口令 HR 解除对 HR 用户的锁定。默认情况下,此口令区分大小写。

2.

要为 HR 用户赋予创建、维护和删除闪回数据存档的管理权限,请以 SYS 用户身份执行以下命令:

GRANT FLASHBACK ARCHIVE ADMINISTER TO hr;

3.

在 SQL*Plus 中,使用口令 HR、以 HR 用户身份连接。注意:需要以大写方式输入口令。

connect hr/HR

4.

要创建闪回数据存档,执行以下命令:

CREATE FLASHBACK ARCHIVE fla1
TABLESPACE fla_tbs1
QUOTA 10M
RETENTION 1 YEAR
/

空间需求取决于所选的保留期限以及所跟踪的表的活动。

5.

要为 EMPLOYEES 表启用该闪回数据存档,执行以下命令:

ALTER TABLE hr.employees
FLASHBACK ARCHIVE fla1
/

6.

要查看 Fox 先生的工资,并将其工资增加 3000 元,请执行 flada_dml.sql 脚本。这将在闪回数据存档中生成活动。

@flada_dml.sql

查询 Fox 先生的工资以确认当前值。按 [Enter] 继续

在上一个屏幕截图中,您可以看到当前工资。按 [Enter] 进行一系列更新。

在上一个屏幕截图中,您可以看到提交的更新。按 [Enter] 重新查询更新的记录。

[Enter] 继续

在上一个屏幕截图中,您可以看到最新更新的 Fox 先生的工资。按 [Enter] 退出脚本。

7.

由于创建了闪回数据存档,您可以查看截至任意时间点的记录。浏览“查看关于闪回数据存档的数据字典信息”课程,获得关于如何查询“创建”时间的示例。

选择一个时间,该时间在创建闪回数据存档之后,但在执行错误的 DML 之前。要查看 Fox 先生截至该时间的员工记录,执行以下查询(使用您选择的历史日期代替 '10' MINUTE,格式示例为:'50' SECOND, '10' DAY, '5' MONTH):

SELECT employee_id, last_name, salary
FROM hr.employees
AS OF TIMESTAMP
(SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE last_name = 'Fox'
/

8.

通过查看查询执行计划,您可以确认是否正在使用闪回存档。执行 flada_explainplan.sql 脚本:

@flada_explainplan 

可以看到从 SYS_FBA_HIST_72390 表(您的表名称中的数字标识符可能不同)中检索到的历史信息。

9.

您意识到最近的工资更新是错误的。要将所选的历史日期(例如,10 分钟前)恢复到原始值,执行以下命令(使用您选择的历史日期代替 '10' MINUTE):

UPDATE hr.employees
SET salary =
(SELECT salary FROM hr.employees
AS OF TIMESTAMP (SYSTIMESTAMP - INTERVAL '10' MINUTE)
WHERE last_name = 'Fox'
)
WHERE last_name = 'Fox'
/

提交 UPDATE 并查询 Fox 先生的工资以确认工资已经恢复回原始值。

在上一个屏幕截图中,您可以看到 UPDATE 命令,该命令将使用一个历史数据行恢复十分钟前的值。(在此测试环境中,您最可能使用的是分钟。但在生产环境中,您可能需要使用 DAY、MONTHYEAR。)

返回主题列表

结合使用闪回数据存档和透明模式演变

在本节中,您将继续使用闪回数据存档,但是将会进行一些更改,以便在 HR.EMPLOYEES 表中添加、删除和重命名一些列。执行以下步骤:

1.

在 SQL*Plus 中,继续执行以下查询:

SELECT email, last_name, salary
FROM hr.employees
WHERE email LIKE 'T%'
/


您将会注意到每个人的电子邮件地址都是由首字母“T”后跟自己的姓氏组成的。

2.

执行以下 UPDATECOMMIT 命令将 @mycompany.com 附加到所有电子邮件地址的后面:

UPDATE hr.employees SET email = email||'@mycompany.com'
/
COMMIT
/

再次查询表以确认这一变更。

3.

假设正在实现新的电子邮件地址标准。稍后,当前电子邮件地址将存储到 old_email 列,同时原来的 email 列将更新为新的电子邮件地址。使用以下语句添加所需的列:

ALTER TABLE hr.employees
ADD (old_email varchar2(30))
/

4.

用当前的电子邮件地址填充新增加的列:

UPDATE hr.employees
SET old_email = email
/
COMMIT
/

5.

更新电子邮件地址以反映 firstname.lastname@mycompany.com 这一新电子邮件地址格式:

UPDATE hr.employees
SET email = first_name||'.'||last_name||'@mycompany.com'
/
COMMIT
/

6.

另外,还需要实现另一个新列来存储每个员工的总薪酬的计算值。使用以下语句添加一个新列:

ALTER TABLE hr.employees
ADD (total_comp number(8,2))
/

7.

使用 TOTAL_COMP 的计算值填充这个新列:

UPDATE hr.employees
SET total_comp = (1+NVL(commission_pct,0))*salary
/
COMMIT
/

8.

执行以下查询查看本教程开始以来 Fox 先生的记录的所有版本:

SELECT last_name, email, old_email, salary, total_comp, versions_endtime
FROM hr.employees
VERSIONS BETWEEN TIMESTAMP (SYSTIMESTAMP - INTERVAL '60' MINUTE) AND SYSTIMESTAMP
WHERE last_name = 'Fox'
ORDER BY versions_endscn
/

注意,本查询中使用了 versions_endtimeversions_endscn 两个伪列。versions_endtime 显示了记录的某个版本的到期时间。您可以看到最后一条记录的 versions_endtimeNULL,因为该视图是当前视图。versions_endscn 甚至在无法区分事务时间的情况下,也可以提供正确的事务顺序。

9.

old_email 列不再需要,可以使用以下语句将其删除:

ALTER TABLE hr.employees
DROP COLUMN old_email
/

10.

虽然以前的查询结果显示了 Fox 先生的记录随时间变化的情况,但是,如果也能知道员工表的变化情况也许会更加有用。执行以下语句获得这一信息:

SELECT * FROM tab
/

注意 SYS_FBA_DDL_COLMAP_nnnnn 表的名称(您的表名称中的数字标识符可能不同)。

11.

查询上一步中识别的表以确定系统更改号的范围,这个范围定义了表中存在的每个列:

SELECT column_name, startscn, endscn
FROM SYS_FBA_DDL_COLMAP_nnnnn
/

在上个屏幕截图中,endscnNULL 值表示对应的列仍然存在于表中。您可以使用 SCN_TO_TIMESTAMP 函数将 SCN 转换为时间戳。例如:

SELECT SCN_TO_TIMESTAMP(nnnnnn)
FROM DUAL
/

返回主题列表

在本节中,您将再次扮演两个不同的角色:

要查看关于闪回数据存档的元数据,执行以下步骤:

1.

在 SQL*Plus 会话中,以 SYS 用户身份连接到数据库。

connect / as sysdba

2.

执行 flada_list1.sql 脚本以公开与闪回数据存档有关的各种数据字典视图。

@flada_list1.sql

该脚本在几个时间点将暂停。按 [Enter] 继续之前,请检查每一阶段的输出。

脚本的首次查询列出了与闪回数据存档有关的数据字典视图。

3.

DBA_FLASHBACK_ARCHIVE 数据字典包含了有关闪回数据存档的信息,其中包括创建时间。

4.

DBA_FLASHBACK_ARCHIVE_TS 数据字典视图列出了与闪回数据存档关联的表空间。

5.

DBA_FLASHBACK_ARCHIVE_TABLES 数据字典视图显示了数据表及其对应的“历史”表之间的关系。

6.

非 DBA 用户(如 HR 用户)只能访问 USER 数据字典视图。

返回主题列表

要练习其他闪回数据存档维护任务,执行以下步骤:

1.

使用 SQL*Plus,以 HR 用户身份连接到数据库。

sqlplus hr/HR

2.

如果定义了保留期限,则会根据保留期限策略自动清除闪回数据存档中的数据。然而,您也可以使用以下命令显式地清除数据:

ALTER FLASHBACK ARCHIVE fla1
PURGE BEFORE TIMESTAMP
(SYSTIMESTAMP - INTERVAL '2' MINUTE)
/

在本例中,将清除两分钟之前的数据。

3.

执行 flada_tbs2.sql 脚本,创建一个 10 MB 的附加表空间。

@flada_tbs2.sql

4.

HR 用户身份为 FLA1 闪回数据存档添加 5 MBFLA_TBS2 表空间。执行以下命令:

connect hr/HR

ALTER FLASHBACK ARCHIVE fla1
ADD TABLESPACE fla_tbs2
QUOTA 5M
/

5.

某个特定闪回数据存档中的所有表都具有相同的保留时间。要将 FLA1 闪回数据存档的保留时间更改为两年,执行以下命令:

ALTER FLASHBACK ARCHIVE fla1
MODIFY RETENTION 2 YEAR
/

6.

某个表的闪回存档启用后,只有具有 FLASHBACK ARCHIVE ADMINISTER 系统权限或以 SYSDBA 身份登录的用户,才能将其禁用。要禁用 HR.EMPLOYEES 表的闪回数据存档,执行以下命令:

ALTER TABLE hr.employees NO FLASHBACK ARCHIVE
/

7.

要删除 FLA1 闪回数据存档,执行以下命令:

DROP FLASHBACK ARCHIVE fla1
/

删除闪回数据存档的同时也会删除内部的防篡改历史表。出于审计和安全性要求,您不能直接删除该内部表。

在删除闪回数据存档时不会删除用于存储它的表空间,因为这些表空间可能包含其他数据。

返回主题列表

在完成该 OBE 后,或者希望重新创建和使用闪回数据存档时,执行以下步骤:

1.

在 SQL*Plus 会话中,以 SYS 用户身份连接到数据库。

connect / as sysdba

2.

要删除表空间并锁定 HR 用户,执行 flada_cleanup.sql 脚本。

@flada_cleanup.sql

返回主题列表

在本教程中,您学习了如何:

创建和使用闪回数据存档
查看关于闪回数据存档的数据字典信息
修改闪回数据存档

返回主题列表

将光标置于该图标上可以隐藏所有的屏幕截图。