一、什么是Supplemental Logging,具体是做什么用的呢?
要回答这个问题,我们就必须先搞明白,为什么我们需要Supplemental Logging!事实上,目前最有可能用到Supplemental Logging的也只有逻辑standby和streams这两项特性(10g以后如果希望logminer能够分析出所有操作,建议也要启用Supplemental Logging),这两项特性的数据应用都属于逻辑应用,类似source database执行update语句之类,结果也要反映到target database,如何准确判断出source端修改的列,在target端中应该更新到哪条记录上呢?根据rowid?显然不靠谱啊,都说了是逻辑的,块的位置完全不一样,rowid已无用武之地~~~你想说,能否通过表中的唯一键?在更新表中记录时,将主键或唯一键做为附加的信息,与被修改的列一起存入redolog中,对于没有主键唯一键的表,则将表中所有列统统组合做为附加信息存入redolog,这样target端在分析redolog时,就知道该更新表中的哪些记录了!
这就是Supplemental Logging。
数据库启用了Supplemental Logging之后,对于修改操作,oracle就会同时附加一些能够唯一标识修改记录的列到redolog中,对于拥有主键或唯一键的表,这个操作最简单,只需要附加主键或唯一键即可,这样生成的redo也是最小的,当然这只是一个理想状态,现实情况下某些表可能无法创建主键/唯一键,或者历史原因确无主键/唯一键,这种情况下oracle会将所有列(提示,非log,long之类大字段类型的列)都做为附加信息记录到redo中,这种情况下redo有可能增长迅速,并且在target端应用时也会受到一些影响。因此oracle建议最好为每个涉及到复制的表都创建主键或者唯一键。
默认情况下,oracle不提供任何Supplemental Logging。
对于选择的列和那些用于精确定位的附加列的组合,oracle对其做了定义叫做supplemental log group。
oracle对supplemental log group做了分类,目的是更精确的设置redolog中都记录些什么信息,分如下两类:
1、Unconditional Supplemental Log Groups:无条件记录指定列的前映像,而不管发生修改操作的是不是指定列。
2、Conditional Supplemental Log Groups:只有至少一个指定列发生修改操作时被触发,并记录下修改列的前映像。
supplemental logging又分为数据库级别和表级。
二、数据库级supplemental logging
数据库级有两种类型:minimal supplemental logging和identification key logging,其主要区别就在于写入redolog中的数据详尽程度不同。
Minimal supplemental logging不会强加太多的信息到redo log;identification key logging会强加大量的信息到redo log。使用LogMiner,oracle建议至少开启minimal supplemental logging。
启用数据库级别的minimal supplemental logging
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA;
数据库级别的Identification Key Logging
1、ALL system-generated uncondititional supplemental log group
一行被更新,所有列都写入redo log(除LOBs, LONGS, ADTs)
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
2、PRIMARY KEY system-generated uncondititional supplemental log group
一行被更新,主键写入redo log,即使没有更新主键。
如果表没有主键,但是有一个或多个non-null unique索引,oracle选择一个unique索引的键值写入到redo log;
如果表既没有主键,也没有non-null unique索引,则所有列(除LONG and LOB)都写入到redo log,等价于ALL。因此oracle建议如果使用数据库primary key supplemental logging,所有或大部分表应
该有主键或唯一索引。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
3、UNIQUE system-generated conditional supplemental log group
唯一索引或bitmap 索引中的任何一列改变,则唯一索引键或bitmap索引键写入到redo log。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
4、FOREIGN KEY system-generated conditional supplemental log group
外键的任何一列被修改,则外键写入到redo log
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (FOREIGN KEY) COLUMNS;
注意:
如果数据库处于open状态,启用了identification key logging,游标缓冲区的所有DML游标都会无效,可能会影响到性能。
如果是数据库级别启用了identification key logging,则minimal supplemental logging被隐式开启。
When you enable identification key logging at the database level, minimal supplemental logging is enabled implicitly.
Supplemental logging语句是累积的,如果执行了如下两个语句,则primary key和unique key supplemental logging都开启。
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (PRIMARY KEY) COLUMNS;
ALTER DATABASE ADD SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
如何禁用Supplemental Logging?drop子句。
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA (UNIQUE) COLUMNS;
ALTER DATABASE DROP SUPPLEMENTAL LOG DATA;
三、表级Supplemental Logging
和数据库级一样,只不过仅限于指定的表,如:
ALTER TABLE HR.EMPLOYEES ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS;
另外oracle允许用户自己定义supplemental log groups,如:
ALTER TABLE HR.EMPLOYEES
ADD SUPPLEMENTAL LOG GROUP emp_parttime (EMPLOYEE_ID, LAST_NAME,
DEPARTMENT_ID) ALWAYS;
ALTER TABLE HR.EMPLOYEES
ADD SUPPLEMENTAL LOG GROUP emp_fulltime (EMPLOYEE_ID, LAST_NAME,
DEPARTMENT_ID);
注意:
一列可以属于多个supplemental log group,但前镜像只会记录到redo log一次;
如果你对一列指定无条件和有条件的supplemental log,则这些列会无条件记录到redo log。