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.
在企业管理器屏幕中,从数据库主页进入 Availability 选项卡。
单击 Manage 下的 View and Manage Transactions。LogMiner 主界面显示,如下图所示:
您可以输入具体的时间范围或 SCN 范围来搜索事务。在上图中,我已经在 Query Time Range 中输入了一个时间范围进行搜索。在 Query Filter 中,我只用了 SCOTT 的事务,因为其曾用来执行过所有的 DML。在 Advanced Query 部分中,您可以输入其他任何过滤器。填完所有的域后,单击 Continue。
这将激活日志挖掘进程对重做日志(在线的和存档的,必要的话)进行搜索,寻找用户 SCOTT 发布的事务。进程结束后,您将看到结果屏幕。
结果屏幕的顶端部分与下图类似:
结果表明,通过搜索找到两个由 SCOTT 发布的事务,这些事务影响了两条记录。
屏幕的底端部分显示了这些事务的详细信息。这是屏幕的局部视图。您可以看到,事务显示为 1 ins (表示“1 条插入语句”)。最左边一栏显示了事务标识符 (XID),是唯一标识事务的编号。
如果点击事务标识符,您可以看到相应事务的详细信息,如下图所示:
如您所见,您可以使用数据库控制搜索和识别事务。单击按钮 Previous Transaction 和 Next Transaction 可以滚动浏览通过搜索找到的所有事务。
假设,您要查找一个插入、删除或更新了 RES_ID = 100002 的记录的事务。您可以使用 dbms_logmnr 程序包中的 column_present 函数在重做流中搜索具体的值,如下所示:
这个函数将会提取 SCOTT 模式下 RES 表的 RES_ID 列中包含 100002 的所有事务。
您还可以使用该特性掘出针对该数据库执行的 DDL 命令。要实现这一目的,选择 Query Filter 部分中的单选按钮 View DDL Only 即可。
在检查一个事务时,您想怎样处理这个事务?一种想法是将其撤消,因为此事务的执行有误,这或许是您查找该事务的首要原因。这非常简单。如果该事务是一个插入,您只需将其删除即可;如果它是一个更新,则撤消会将该行还原至前一个值。
然而,请仔细观察本例中使用的事务。第一个事务插入了一行。第二个事务更新了刚插入的行,而第三个事务将那一行删除了。第一个事务(插入)就是您要收回的事务。但是,问题是,那一行已经被后续的事务删除了,那么在本例中撤消事务是什么呢?
这就是 Oracle 数据库 11g 中 Dependent Transaction 视图特性的用途所在。单击 Flashback Transaction。经过一些搜索后,系统将显示类似下图的屏幕:
该屏幕将为您显示相关事务以及更新和删除。现在,在收回事务时,您还可以收回其依赖项。 要实现这一目的,从下面的列表中选择 Cascade 单选按钮,然后单击 OK 即可。
它会为您显示所需收回的不同事务。单击事务 ID 查看 Oracle 将执行什么 SQL 语句来撤消这个事务。
例如,要撤消插入,Oracle 必须执行删除,如上图所示。如果点击下一个事务(就在它的下面),您将看到收回下一个事务所需的详细操作:
这样,您就了解了操作构思。单击 Submit,所有这些事务都将一次性全部回滚。这是撤消事务及其依赖项最彻底的方法。
| 第1页: LogMiner界面 | 第2页: 命令行界面 |
| 第3页: 一个演示 | 第4页: 管理闪回存档 |