近期在给一客户配置GoldenGate,在个表添加supplemental log时,即执行add trandata时,有大量的表报如下错误:
GGSCI (racdb1) 148> add trandata ▇▇▇▇▇▇▇▇▇▇
2013-07-10 10:24:55 WARNING OGG-00869 No unique key is defined for table ▇▇▇▇▇▇▇▇▇▇'.
All viable columns will be used to represent the key, but may not guarantee uniqueness. KEYCOLS may be used to define the key.
2013-07-10 10:24:55 WARNING OGG-01387 Table ▇▇▇▇▇▇▇▇▇▇ has no valid key columns,
added unconditional supplemental log group for all table columns.
Logging of supplemental redo log data is already enabled for table ▇▇▇▇▇▇▇▇▇▇.
OGG-00869 是由于表不存在primary key或unique index所致,倒不会有太大影响。但OGG-01387错误引起了我的注意,不清楚其究竟,所以不敢忽略它,因此查询MOS得知,是因为该类的表的列的数量均超过了33列。
如果一张表,其列的数量超过33列(含),且没有primary key的话,则在执行add trandata命令时,会报OGG-01387错误,看提示说supplemental redo log data已经被启用,其实你查询 dba_log_group_columns可以得到验证。
实际情况是,这样的表存在200多个,确实挺恐怖的,有的表的列数高达200余个(不清楚这样的设计是不是存在缺陷?),于是我通过生成sql脚本的方式,给这些特殊的表启用supplemental redo log data。
举一个例子,如表 SCOTT.EMP存在超过33个列,且没有主键的话,那么手动添加supplemental redo log data的方法是:
alter table scott.emp add supplemental log group ggs_emp_1(col1,col2,...,col33) always;
add table scott.emp add supplemental log group ggs_emp_2(col34,col35....) always;
额外提供一个验证表supplemental log添加是否成功的语句:
select owner,table_name
from all_tables
where owner in ('SCOTT')
and table_name not in (select distinct table_name
from dba_log_group_columns
where owner in ('SCOTT'));