在做Oracle10g Logical Standby 或 Oracle Stream的时候, 大多数时候,我们需要设置 Supplemental Log(追加日志) , 这个主要是因为Logical Standby或 Oracle Stream 是使用解析日志的方式得出DDL , DML 语句, 然后Apply到Standby 或 从库中 。 由于普通redo 日志只是记录rowid 及更改前后的列的值即可对数据库进行恢复或roll forward 等动作, 但是 类似 logical stand DB不是根据rowid 来做recover, 所以需要在redo里记录PK or unique index的信息来定位操作的data 行, 而只有pk或unique index对应的列被更改时才会被记录,所以 Supplemental Log 出现了 。
物理Standby 在应用数据库块的时候,可以根据rowid 知道更新,插入或删除了哪些行, 但是 logical standby及stream 应用中都是采用解析log的方式Apply SQL , 而不是block , 源数据库上做的操作需要反映到目标数据库上的table, 这里需要注意, 主库的redo在备库中解析出来后每一行数据的变更都会生成一条SQL (比如主库中的一个批量更新SQL , 在备库可能是 1000 条SQL 语句) , 这就要求备库能够唯一区别出每一条数据 , 由于主库备库只是逻辑上一致,ROWID属于物理结构,是不一样的 (block位置也许完全不一样了), 那么备库需要能够唯一区别出一条数据只有通过pk 或 unique index 来进行判断 。
情况一: 对于有pk 或unique index 的table , 且pk 或 unique index 是由一个字段组成,不是组合索引。 如果每次更新的是PK列或unique index列, 那么可以不用启用 Supplemental Log , redo log 会附加记录这些pk 或unique index , 以便logical standby 等进行恢复的时候能知道哪些行被更新了 。 这样生成的redo log也是最小的。 但是如果更新的不是PK或unique index列,那么还是需要启用Supplemental Log 的, 以便记录PK/FK , unique index信息 。
情况二 : 对于有但只有组合的pk 或组合的unique index 的table (index由多个字段组成) , 那么需要启用 Supplemental Log , 如果更新了pk 中的部分字段, Supplemental Log 的作用就是将pk的其余部分也记录到redo log 中 。
情况三 : 对于没有pk 或 unique index 的table , 数据库需要启用Supplemental Logging, 对于更新操作, Oracle会同时附加一些能够唯一标识修改记录的列到redo log中 。 这种情况下oracle会将所有列(提示,非lob , long之类大字段类型的列) 都做为附加信息记录到redo中,这种情况下redo有可能增长迅速,并且在target端应用时也会受到一些影响。因此oracle建议最好为每个涉及到复制的表都创建主键或者唯一键。
对于选择的列和那些用于精确定位的附加列的组合,oracle也对其做了定义叫做supplemental log group。随后oracle又对supplemental log group做了分类,目的是更精确的设置redo log中都记录些什么信息,分如下两类:
a.Unconditional Supplemental Log Groups:无条件记录指定列的前映像,而不管发生修改操作的是不是指定列。 因此它还有个外号,叫"老记录日志组"。
b.Conditional Supplemental Log Groups:只有至少一个指定列发生修改操作时被触发,并记录下修改列的前映像。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/35489/viewspace-630259/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/35489/viewspace-630259/