OGG中的附加日志

附加日志(supplemental log)可以指示数据库在日志中添加额外信息到日志流中,以支持基于日志的工具,如逻辑standby、streams、GoldenGate、LogMiner。可以在数据库和表上设置。

1.数据库级设置,分两类:

1.1最小附加日志(minimal supplemental logging):

DATA选项启用最小附加日志。

启用最小日志可以确保LogMiner(或其他任何基于LogMiner的产品)可以支持行链接、簇表、索引组织表等。
语法如下:
alter database {add|drop} supplemental log data;

1.2标识键日志(identification key logging):

DATA(all,primary key,unique,foreign key) columns选项启用最小日志及列数据日志。

在源库日志为变化来源同步其他数据库的情况下,比如逻辑备用数据库,受影响的数据行必须以列数据标识(而不是rowid),必须启用此种附加日志。
语法如下:
alter database {add|drop} supplemental log {data(all,primary key,unique,foreign key) columns};

缺省情况下,Oracle不启用以上任何附加日志。当使用ALL,PRIMARY,UNIQUE或FOREIGN附加日志时最小补全日志默认开启(即检查结果为IMPLICIT)。 在删除所有导致IMPLICIT最小化附加日志的附加日志后,最小化附加日志变为NO。

查询当前设置

SELECT supplemental_log_data_min min,
       supplemental_log_data_pk pk,
       supplemental_log_data_ui ui,
       supplemental_log_data_fk fk,
       supplemental_log_data_all allc
  FROM v$database;


MIN PK UI FK ALLC
YES NO NO NO NO
 

2.表级附加日志设置,分两类

2.1可以通过以下语句设置命名日志组:

语法:

alter table table_name
add supplemental log group group_a(column_a [no log],column_b,...) [always];

NO LOG选项用于指定在日志中排除哪些列。

在命名日志组中,至少存在一个无”NO LOG“的定长列。比如,对LONG列使用 no log选项,可以在更改LONG列时,记录其他列的内容(LONG列本身不能存在日志里)。

ALWAYS选项, 在更新时,日志组中的所有列都会记录在日志中。

这就是所谓的”无条件“日志组,有时也叫”always log group“。如果不指定该选项,只有在日志组中的任何列被修改时,所有列才会出现在日志中。这就是所谓的”有条件“日志组。

说明:同一列可以在多个日志组中存在,但日志中只记录一次;同一列在“无条件”与“有条件”日志组中存在时,该列将“无条件”记录。

2.2可以通过以下语句设置所有列或主键/外键/唯一键组合日志组:

语法:

alter table table_name
add supplemental log data(all,primary key,unique,foreign key) columns;

Oracle将生成无条件或有条件日志组。对于无条件日志组,日志中将记录该日志组中的所有列;对于有条件日志组,只有日志组中的列有变化时,才会记录日志组中的所有列。

如果指定“ALL”列,日志中将包含所有最大大小固定长度的列。这种日志是系统创建的无条件日志组。
如果指定“PRIMARY KEY”列,只要有更新,组成主键的所有列都会记录在日志中。这种日志是系统创建的无条件日志组。

Oracle使用如下顺序确定附加记录哪些列:
*组成主键的列(主键有效,或rely且非DISABLED or INITIALLY DEFERRED状态)
*最小的、至少有一个非空列的唯一索引
*记录所有标量列
如果指定“UNIQUE”列,如果任何组成唯一键或位图索引的列被修改,组成该唯一键或位图索引的其他列都会记录在日志中。这种日志是系统创建的有条件日志组。

如果指定“FOREIGN KEY”列,如果任何组成外键的列被修改,组成该外键的其他列都会记录在日志中。这种日志是系统创建的有条件日志组。

2.3表级测试
drop table test;
create table test(x int,y int);

–增加附加日志

alter table test
add supplemental log data(all,primary key,unique,foreign key) columns;
  
select * from dba_log_groups;
OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE      ALWAYS      GENERATED
SYS   SYS_C0037555   TEST       ALL COLUMN LOGGING  ALWAYS      GENERATED NAME
SYS   SYS_C0037556   TEST       PRIMARY KEY LOGGING ALWAYS      GENERATED NAME
SYS   SYS_C0037557   TEST       UNIQUE KEY LOGGING  CONDITIONAL GENERATED NAME
SYS   SYS_C0037558   TEST       FOREIGN KEY LOGGING CONDITIONAL GENERATED NAME
 
select * from dba_log_group_columns;
no row selected

–删除附加日志

alter table test
drop supplemental log data(all,primary key,unique,foreign key) columns;
 
select * from dba_log_groups;
no row selected
 
select * from dba_log_group_columns;
no row selected

–增加命名附加日志

alter table test
add supplemental log group group_a(x,y);
 
select * from dba_log_groups;
OWNER LOG_GROUP_NAME TABLE_NAME LOG_GROUP_TYPE ALWAYS GENERATED
SYS GROUP_A TEST USER LOG GROUP CONDITIONAL USER NAME
 
select * from dba_log_group_columns;
OWNER LOG_GROUP_NAME TABLE_NAME COLUMN_NAME POSITION LOGGING_PROPERTY
SYS   GROUP_A        TEST       X           1        LOG
SYS   GROUP_A        TEST       Y           2        LOG
 
alter table test
drop supplemental log group group_a;

Oracle 附加日志

select supplemental_log_data_min, supplemental_log_data_pk, supplemental_log_data_ui from v$database;

如果某列的值为YES就是开了那种附加日志。

执行
alter database add supplemental log data;

可以开最小附加日志(supplemental_log_data_min)。

执行了alter database add supplemental log data;语句后需要把数据库重新启动。

取消附加日志
alter database drop supplemental log data;

1、10g需要激活补充日志
select supplemental_log_data_pk,supplemental_log_data_ui from v$database;
alter database drop supplemental log data (primary key, unique index) columns;
alter database add supplemental log data;

2、将redo日志文件添加到logmnr分析日志列表
exec sys.dbms_logmnr.add_logfile(logfilename=>‘redo日志1’, options=>sys.dbms_logmnr.new);
exec sys.dbms_logmnr.add_logfile(logfilename=>‘redo日志2’, options=>sys.dbms_logmnr.addfile);
exec sys.dbms_logmnr.add_logfile(logfilename=>‘redo日志n’, options=>sys.dbms_logmnr.addfile);

3、启动并分析redo日志
exec sys.dbms_logmnr.start_logmnr(options => sys.dbms_logmnr.dict_from_online_catalog);

4、查看分析结果
spool c:\log.txt
select * from v$logmnr_contents ;
spool off

5、停止logmnr
exec sys.dbms_logmnr.end_logmnr

6、取消补充日志
alter database drop supplemental log data (primary key) columns;
alter database drop supplemental log data (unique) columns;
alter database drop supplemental log data;

转自:http://blog.itpub.net/27633655/viewspace-1081558/


oracle附加日志的作用

为什么GOLDENGATE使用时,一定要开启附加日志?

大家想,如果我在源端做UPDATE时,目标端怎么知道我修改的是哪行数据呢!那我们用什么来标识我们修改的这行数据?ROWID?明显不行哈~~
用主键呗 ,但是主键又不存在于我们的REDO LOG中,那么就需要将主键作为附加信息添加到REDO LOG中。这样在目标端分析REDO LOG时,就知道是怎么个回事了!
大家开启Supplemental log后,再去DUMP REDO LOG出来看看就晓得了哈~~

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值