利用闪回撤销事务

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

大约 20 分钟

主题

本教程包括下列主题:

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

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

概述

闪回事务撤销是什么?

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

返回主题列表

创建测试环境

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

1.

转到您的工作目录中,执行 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 登录 Enterprise Manager Database Control(将 <hostname> 更改为本地主机或指定的主机名)。

https://<hostname>:1158/em

2.

要登录 Enterprise Manager,输入以下详细信息,然后单击 Login

User Name:sys
Password:<您的口令>
Connect as: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 相关性的事务。

返回主题列表

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