- 最后登录
- 2016-6-27
- 在线时间
- 134 小时
- 威望
- 351
- 金钱
- 2586
- 注册时间
- 2012-3-16
- 阅读权限
- 60
- 帖子
- 188
- 精华
- 6
- 积分
- 351
- UID
- 309
|
1#
发表于 2012-7-19 16:14:14
|
查看: 9228 |
回复: 7
源表结构:
id,vl
目标表结构:
id,vl1
1)案例1:
配置文件如下:
extract extl
userid [email=ggate@ggdb01,password]ggate@ggdb01,password[/email] ggate
rmthost 10.1.19.90, mgrport 7801
rmttrail /home/oracle/gg_trail/rl
dynamicresolution
ddl include objname cgb.* objtype 'table'
--DDL INCLUDE ALL OPTYPE CREATE OBJTYPE 'table'
--DDLERROR RESTARTSKIP 100000 SKIPTRIGGERERROR 100000
DDLOPTIONS ADDTRANDATA,REPORT
table cgb.*;
sequence cgb.*;
replicat repl
SETENV (ORACLE_HOME = "/u01/app/oracle/app/product/11.2.0/db")
SETENV (ORACLE_SID = "ggdb02")
userid [email=ggate@ggdb02,password]ggate@ggdb02,password[/email] ggate
assumetargetdefs
SOURCEDEFS /home/oracle/gg_def/j1.def
reperror default,discard
discardfile /home/oracle/gg_log/repsz.dsc,append,megabytes 100
ddl include objname cgb.* objtype 'table'
--DDL INCLUDE ALL OPTYPE CREATE OBJTYPE 'table'
DDLERROR DEFAULT IGNORE
DDLOPTIONS REPORT
--MAP cgb.j1, TARGET cgb.j1,
--COLMAP (usedefaults,
--vl1 = vl);
map cgb.*, target cgb.*;
从上面可以看出配置文件是存在问题的,源表和目标表的第二个字段名称不一样,但配置文件确指定了assumetargetdefs选项。
在源端数据库插入一条记录:
insert into cgb.j1(id,vl) values(1,'a');
此时查看目标端的数据库记录:
select id,vl1 from cgb,j1 where id=1;
结果发现一条id=1,vl1=null的记录
2)案例2:
配置文件如下:
replicat repl
SETENV (ORACLE_HOME = "/u01/app/oracle/app/product/11.2.0/db")
SETENV (ORACLE_SID = "ggdb02")
userid [email=ggate@ggdb02,password]ggate@ggdb02,password[/email] ggate
assumetargetdefs
--SOURCEDEFS /home/oracle/gg_def/j1.def
reperror default,discard
discardfile /home/oracle/gg_log/repsz.dsc,append,megabytes 100
ddl include objname cgb.* objtype 'table'
--DDL INCLUDE ALL OPTYPE CREATE OBJTYPE 'table'
DDLERROR DEFAULT IGNORE
DDLOPTIONS REPORT
--MAP cgb.j1, TARGET cgb.j1,
--COLMAP (usedefaults,
--vl1 = vl);
map cgb.*, target cgb.*;
和上一个案例不同的地方只是取消了SOURCEDEFS
在源端数据库插入一条记录:
insert into cgb.j1(id,vl) values(1,'a');
此时查看目标端的数据库记录:
select id,vl1 from cgb,j1 where id=1;
这次更加奇怪了,结果发现一条id=1,vl1=a的记录,也就是记录完全正确的同步过去了
问题:
为什么列名错误映射也能成功插入数据,比如insert into cgb.j1(id,vl1) values(1,'a')这条记录,按rep的配置(assumetargetdefs)目标端应该映射为insert into cgb.j1(id,vl1) values(1,'a')才对吧,这样在目标端执行应该会报错才对啊,为什么还能成功插入呢? |
|