利用闪回撤消事务

本教程描述了如何使用闪回事务撤消数据库中的事务。

大约 20 分钟

主题

本教程包括下列主题:

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

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

概述

什么是闪回事务撤消?

闪回事务撤消是一个逻辑恢复选项,可以在数据库在线时回滚目标事务及其相关事务。相关事务通过写后写 (WAW) 关系(其中,事务会修改目标事务更改的同一数据)或主键约束关系(其中,事务会重新插入目标事务删除的同一主键值)联系在一起。闪回事务利用撤消和为撤消块生成的重做来创建并执行补偿事务,以便将受影响的数据恢复到原始状态。

返回主题列表

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

1.

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

2.

下载 flatxn.zip 文件并将其解压缩到您的工作目录(即 wkdir)中。

返回主题列表

创建测试环境

要设置测试环境并为该 OBE 创建事务,执行以下步骤:

1.

导航到工作目录,并以 SYS 用户身份执行 flatxn_archivelog.sh 脚本。

./flatxn_archivelog.sh

该脚本会将 HR 用户解除锁定,并启用 ARCHIVELOG 模式。

2.

使用 SQL*Plus,以 SYS 用户身份连接到数据库,并运行 flatxn_setup1.sql 脚本。

sqlplus / as sysdba
@flatxn_setup1.sql


该设置脚本将数据库和 HR 用户设置为利用闪回撤消事务。注意 ALTER DATABASEGRANT 命令。

[Enter] 继续执行脚本的下一步。

3.

该脚本将以 HR 用户身份连接到数据库,并创建第一个测试事务,该事务的内容是插入五个行。

[Enter] 继续执行脚本的下一步。

4.

该脚本将继续创建第二个测试事务,该事务的内容是更新您刚才插入的两个行。这将创建一个写后写 (WAW) 相关性。如果事务更新或删除的行已经由相关事务插入或更新,则说明存在 WAW 相关性。

[Enter] 继续执行脚本的下一步。

5.

该脚本将继续创建第三个事务,该事务的内容是更新三个行,其中一行已经在前一个事务中更新。此操作将创建另一个 WAW 相关性。

[Enter] 继续执行脚本的下一步。

5.

该脚本将继续创建第四个事务,该事务的内容是更新一个在事务 1 中插入的行。此操作将创建另一个 WAW 相关性。

[Enter] 继续执行脚本的下一步。

6.

最后,脚本将以 SYS 用户身份连接到数据库,并切换存档日志。闪回事务至少需要一个存档日志来分析重做。

[Enter] 退出脚本。

返回主题列表

事务可以具有写后写 (WAW) 相关性,这意味着,事务更新或删除的行数据已经由前一个事务插入或更新。在本部分中,您希望撤消一个问题事务及其导致错误更改的 WAW 相关事务。执行以下步骤:

1.

输入以下 URL 登录企业管理器数据库控制(将 <hostname> 更改为本地主机或指定的主机名)。

https://<hostname>:1158/em

2.

要登录企业管理器,输入以下详细信息,然后单击 Login

User Name:sys
Password:oracle
以:SYSDBA 连接

3.

您怀疑 HR.REGIONS 表包含问题事务的更改,并希望查看完整的表数据。单击 Schema 选项卡页面,

然后单击 Tables

4.

要查看 HR 模式用户所属的所有表,在 Schema 域中输入 HR,然后单击 Go 按钮。

5.

HR 表将显示。首先,选择 HR.REGIONS 表,然后从 Actions 下拉列表中选择 View Data。单击 Actions 下拉列表后面的 Go 按钮,以查看 HR.REGIONS 表中的数据。

6.

在查看表的内容时,您认为不应该包含红色方框中的行。单击 OK

7.

返回到表列表。选择 HR.REGIONS 表,然后从 Actions 下拉列表中选择 Flashback Transaction,并单击 Actions 的 Go 按钮。

8.

检查您的查询条件。您可以指定确信的执行错误更改的时间段。对于本例,保留默认的时间段(最后一小时)。然后单击 Next

将显示 Processing:Mining Transactions 窗口,同时为给定时间段处理重做日志。

9.

在 Flashback Transaction:Select Transaction 页面上,选择更新了 2 个区域的事务的 Transaction ID 链接。

10.

在 Select Transaction:Show Details 页面上,查看错误的 UPDATE 命令,然后单击 OK

11.

单击 Next 识别所有相关事务,并撤消所有需要的更改。

将显示 Processing:Flashback Transaction 窗口

12.

在 Flashback Transaction:Show Dependencies 页面上,单击第一个 Transaction ID 链接

13.

在 Show Dependencies:Details 页面上,查看补偿事务。注意,没有执行任何补偿事务。还要注意,区域 #10 的更新被标记为“[exec=no]”,这意味着不会执行它,因为它具有相关事务。您将在下一步中修正这个错误,方法是请求系统不执行所有相关事务。单击 OK

14.

在 Flashback Transaction:Show Dependencies 页面上,单击 Change Recovery Option

15.

在 Show Dependencies:Change Recovery Option 页面上,选择 Cascade,这也会撤消错误的相关事务更改,然后单击 OK

将显示 Processing:Flashback Transaction 窗口

16.

在 Flashback Transaction:Show Dependencies 窗口中,单击 Next

17.

仔细查看信息,然后单击 Finish

18.

闪回事务已成功执行。单击 OK

19.

您可以查看 HR.REGIONS 表目前包含的内容。选择 HR.REGIONS 表,然后从 Actions 下拉列表中选择 View Data,并单击 Go

20.

事务 2、3 被撤消,但事务 4 保留(区域名仍然设置为“Still called Venus”),这是因为事务 2 和 4 之间没有 WAW 相关性。

返回主题列表

您可以执行以下步骤来清理环境:

1.

从 SQL*Plus 会话中,执行 flatxn_cleanup1.sql 脚本:

2.

现在,您希望运行 flatxn_cleanup.sh 来关闭存档日志。执行以下命令:

./flatxn_cleanup.sh 

返回主题列表

在本教程中,您学习了如何撤消具有 WAW 相关性的事务。

返回主题列表

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