商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

Oracle 11g新特性之事务管理

Oracle 企业管理器中的 LogMiner 界面

LogMiner 是 Oracle 数据库中一个经常受到忽视但功能却非常强大的工具。它可用于从重做日志文件中提取 DML 语句 — 引发事务的初始 SQL 以及甚至能取消事务的 SQL。(有关 LogMiner 的介绍及其工作方式,请参阅我在 Oracle 杂志上发表的文章“挖掘线索”。)至今为止,这一功能强大的工具由于缺少较简单的界面而得不到普遍认可。然而,在 Oracle 数据库 11g 中, Oracle 企业管理器具有一个使用 LogMiner 从重做日志提取事务的图形界面,这为使用这一工具检查和回滚事务带来了极大的便利。(注:与以前的版本相同,如果愿意,您可以继续使用 DBMS_LOGMNR 程序包执行命令行驱动的日志挖掘。)

下面我们来看一个示例。要启用日志挖掘,您只需针对数据库或至少是针对表启用的小型追加日志。闪回事务需要主键日志。要针对整个数据库启用它,请执行以下命令:

SQL> alter database add supplemental log data; Database altered. SQL> alter database add supplemental log data (primary key) columns; Database altered.
现在,请看以下由某个应用程序针对数据库执行的语句:
SQL> insert into res values (100002,sysdate,12,1); 1 row created. SQL> commit; Commit complete. SQL> update res set hotel_id = 13 where res_id = 100002; 1 row updated. SQL> commit; Commit complete. SQL> delete res where res_id = 100002; 1 row deleted. SQL> commit; Commit complete.
仔细观察这些语句:每个语句后都有一个提交语句,这表明每个语句都是一个事务。现在让我们看一下如何使用 Oracle 数据库 11g 数据库控制中的 LogMiner 检查事务。

 

在企业管理器屏幕中,从数据库主页进入 Availability 选项卡。

 

图 1

 

单击 Manage 下的 View and Manage Transactions。LogMiner 主界面显示,如下图所示:

 

图 2

 

您可以输入具体的时间范围或 SCN 范围来搜索事务。在上图中,我已经在 Query Time Range 中输入了一个时间范围进行搜索。在 Query Filter 中,我只用了 SCOTT 的事务,因为其曾用来执行过所有的 DML。在 Advanced Query 部分中,您可以输入其他任何过滤器。填完所有的域后,单击 Continue

这将激活日志挖掘进程对重做日志(在线的和存档的,必要的话)进行搜索,寻找用户 SCOTT 发布的事务。进程结束后,您将看到结果屏幕。

结果屏幕的顶端部分与下图类似:

 

图 3

 

结果表明,通过搜索找到两个由 SCOTT 发布的事务,这些事务影响了两条记录。

屏幕的底端部分显示了这些事务的详细信息。这是屏幕的局部视图。您可以看到,事务显示为 1 ins (表示“1 条插入语句”)。最左边一栏显示了事务标识符 (XID),是唯一标识事务的编号。

 

图 4

 

如果点击事务标识符,您可以看到相应事务的详细信息,如下图所示:

 

图 5

 

如您所见,您可以使用数据库控制搜索和识别事务。单击按钮 Previous TransactionNext Transaction 可以滚动浏览通过搜索找到的所有事务。

使用案例

如何使用这一特性?有几种方法。最重要的用途可能就是查清“谁”做了“什么”。如果由于性能原因您没有启用审计,或者仅仅是没有保留审计记录,您只需通过挖掘重做日志(在线的和存档的)在 LogMiner 界面中搜索相关线索即可。在搜索屏幕中,您可以在 Query Filter 下的 Advanced Query 域中输入附加过滤条件。

假设,您要查找一个插入、删除或更新了 RES_ID = 100002 的记录的事务。您可以使用 dbms_logmnr 程序包中的 column_present 函数在重做流中搜索具体的值,如下所示:

 

图 6

 

这个函数将会提取 SCOTT 模式下 RES 表的 RES_ID 列中包含 100002 的所有事务。

您还可以使用该特性掘出针对该数据库执行的 DDL 命令。要实现这一目的,选择 Query Filter 部分中的单选按钮 View DDL Only 即可。

收回选定的事务

在检查一个事务时,您想怎样处理这个事务?一种想法是将其撤消,因为此事务的执行有误,这或许是您查找该事务的首要原因。这非常简单。如果该事务是一个插入,您只需将其删除即可;如果它是一个更新,则撤消会将该行还原至前一个值。

然而,请仔细观察本例中使用的事务。第一个事务插入了一行。第二个事务更新了刚插入的行,而第三个事务将那一行删除了。第一个事务(插入)就是您要收回的事务。但是,问题是,那一行已经被后续的事务删除了,那么在本例中撤消事务是什么呢?

这就是 Oracle 数据库 11g 中 Dependent Transaction 视图特性的用途所在。单击 Flashback Transaction。经过一些搜索后,系统将显示类似下图的屏幕:

 

图 7

 

该屏幕将为您显示相关事务以及更新和删除。现在,在收回事务时,您还可以收回其依赖项。 要实现这一目的,从下面的列表中选择 Cascade 单选按钮,然后单击 OK 即可。

 

图 8

 

它会为您显示所需收回的不同事务。单击事务 ID 查看 Oracle 将执行什么 SQL 语句来撤消这个事务。

 

图 9

 

例如,要撤消插入,Oracle 必须执行删除,如上图所示。如果点击下一个事务(就在它的下面),您将看到收回下一个事务所需的详细操作:

 

图 10

 

这样,您就了解了操作构思。单击 Submit,所有这些事务都将一次性全部回滚。这是撤消事务及其依赖项最彻底的方法。
1 2 3 4
【内容导航】
第1页: LogMiner界面 第2页: 命令行界面
第3页: 一个演示 第4页: 管理闪回存档
©版权所有。未经许可,不得转载。
[责任编辑:ITPUB编辑]
[an error occurred while processing this directive]