让我们挖吧――Logminer(2)Supplemental Logging简介

我们继续看什么是Supplemental Logging。

Supplemental Logging,硬要翻译的话就是补充日志,我们知道,普通情况下,redo log用于数据库的恢复,那补充日志补充日志,补充了点什么呢?为什么要补充呢?

首 先是为什么要补充。Logminer的话呢是可以在source database上生成log(包括对应的dictionnary),然后在另一个database我们暂且称为logminer database上进行logminer的。而在v$logmnr_contents里呢,有这么一列ROWID来唯一确定某行,假设我们在 logminer database上使用source database的这个ROWID来定位更新的记录,可行吗?显然不行了,ROWID换到另一个库中就没有意义了,无法定位到某行,那这个时候我们就需要 一些额外的信息(比如主键),来帮助定位记录。

那这些额外的信息,具体说是redo log中需要记录的额外的列的组合我们称为Supplemental Logging Group,那Supplemental Logging Group又分为两类:

  • Unconditional supplemental log groups(无条件附加日志组): 只要该行被更新,那groups指定的列都会被记录。

  • Conditional supplemental log groups:(条件附加日志组) :只有groups指定的列被更新,groups指定的列才会被记录。

Supplemental Logging又被分为两个级别的,Database-Level Supplemental Logging和Table-Level Supplemental Logging。这个很好理解,一个是整库的设置,一个是特定的设置,比较简单,不详述。

Database-Level Supplemental Logging中又分成两种��……

Minimal Supplemental Logging,顾名思义,也就是对当前的redo log做一个最小的补充,那这个模式的话在生成redo log的时候不会有很大的额外的开销,这个模式保证了Logminer能分析链接的行和各种复杂的存储类型,例如簇表和IOT(索引组织表,这个必须是 10gR2版本)、LOB(没试过10gR2版本)。

SQL>ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

还 有一种就是Identification key logging,那对应的,这种模式就是对redo log做一个比较完整的补充了,会有额外的开销,这种模式的一个附加功能就是我之前举的例子必须开启这种模式才可以使用,也就是用logminer database来分析不同的数据库source database的日志内容。而且这种模式可以选择 all, primary key, foreign key, unique key表示在记录时记录多少列的信息。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;

需要注意的是,如果没有primary key,就加入唯一索引键,如果没有唯一索引键那就是ALL了。其他原理和开启方式类似。

而Table-Level Supplemental Logging也分成两种,identification key logging和user-defined conditional。前者和Database-Level完全一致,只是针对对象不同。而后者其实就是针对只添加某些列进入Supplemental Logging而已,不做详细介绍了。

那oracle具体是怎么做的,我不知道,不过我们可以来看看如果没有Supplemental Logging,Logminer会发生什么,还能用Logminer嘛?

SQL> select SUPPLEMENTAL_LOG_DATA_MIN from v$database;

SUPPLEME
--------
NO

(还有SUPPLEMENTAL_LOG_DATA_PK等对应我上面说的identification key 的类型,这里就不一一列举了)

SQL> select sql_redo,timestamp,username,session_info from v$logmnr_contents where table_name='LOGMNR_TEST';

SQL_REDO
--------------------------------------------------------------------------------
TIMESTAMP USERNAME
--------- ------------------------------
SESSION_INFO
--------------------------------------------------------------------------------
create table logmnr_test(id number);
08-DEC-11 UNKNOWN
UNKNOWN
可以看到sql_redo和timestamp是可以显示的,username和session_info显示的都是unknown,显然并不能获得完整的信息,不满意。

然后我们打开。

SQL> ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;

Database altered.

SQL> drop table logmnr_test;

Table dropped.

SQL> alter system archive log current;

System altered.

SQL> @logminer //重新分析一下,具体步骤下章给出

PL/SQL procedure successfully completed.

SQL> select sql_redo,timestamp,username,session_info from v$logmnr_contents where table_name='LOGMNR_TEST';

SQL_REDO
--------------------------------------------------------------------------------
TIMESTAMP USERNAME
--------- ------------------------------
SESSION_INFO
--------------------------------------------------------------------------------
drop table logmnr_test;
08-DEC-11 SYS
login_username=SYS client_info= OS_username=oracle Machine_name=localhost.locald
omain OS_terminal=pts/3 OS_process_id=350 [email protected]
ldomain (TNS V1-V3)

从这个简单的实验可以看出,打开Supplemental Logging是非常有必要的,信息全多了。不仅仅是为了簇表或者IOT,而是说打开这个模式可以使Logminer的信息更加全面,我们“挖”到的东西会更多。

了解了这个原理就应该知道,Logminer是不是能看到DML或者DDL是和Supplemental Logging无关的,只是和版本有关(8i貌似只能看DML),o小白用的是11g~

你可能感兴趣的:(职场,logging,休闲,LOGMINER,Supplemental)