问题描述:

已知:OGG在同步无主键的表时,OGG会自动设置表的全字段为主键,若目标表字段多于源表,同步过程中replicat进程可以读取insert操作但无法进行update/delete操作,从而导致replicat进程abend。

探究Oracle12c引入了一个新特性——隐藏字段,若将目标表多的字段隐藏,ogg是否能进行正常同步。

环境准备:

在同一数据库中不同用户下进行ogg同步,源端用户oggs,目标端用户oggt。

源端创建A表结构:

SQL>create table oggs.A(id number,name varchar2(12));

目标端创建A表结构:

SQL>create table oggt.A(id number,name varchar2(12),time timestamp(6) invisible);

注:seletc * from…不会出现隐藏字段,必须显示select隐藏字段 才能显示。

OGG进程配置:

extract进程配置

extract ex

dynamicresolution

userid oggs,password oggs

exttrail ./dirdat/as

table oggs.A;

pump进程配置

extract pu

RMTHOST 127.0.0.1, MGRPORT 7909

RMTTRAIL ./dirdat/at

table oggs.A;

replicat进程配置

REPLICAT re

DBOPTIONS INTEGRATEDPARAMS(parallelism 6)

USERID oggt, PASSWORD oggt

MAP oggs.A, target oggt.A, colmap(useDefaults, oggtime=@datenow());

启动测试:

1启动源端ex、pu进程,目标端re进程;

在启动ex过程中OGG报错: ERROR OGG-02022 Logmining server does not exist on this Oracle database.

***解决方案:GGSCI>register extract ex database

2源端A表插入数据:

SQL> insert into oggs.A values(1,'a');

1 row inserted

SQL> commit;

Commit complete

SQL> select * from oggs.A;

ID NAME

---------- ------------

1 a

3目标端查询数据是否插入:

SQL> select id,name,time from oggt.A;

ID NAME TIME

---------- ------------ --------------------------------------------------------------------------------

1 a 20-9月 -19 02.06.22.000000 下午

4源端update数据:

SQL> update oggs.A set name='b' where id=1;

1 row updated

SQL> commit;

Commit complete

SQL> select * from oggs.A;

ID NAME

--------- ------------

1 b

5目标端查询数据是否更新:

SQL> select id,name,time from oggt.A;

ID NAME TIME

--------- ------------- --------------------------------------------------------------------------------

1 a 20-9月 -19 02.06.22.000000 下午

6查看目标端OGG replicat进程报告:

GGSCI>view report re

2019-09-20 14:15:28 ERROR OGG-01296 Error mapping from OGGS.A to OGGT.A.

2019-09-20 14:15:34 ERROR OGG-01668 PROCESS ABENDING.

Report at 2019-09-20 14:15:34 (activity since 2019-09-20 14:06:22)

From Table OGGS.A to OGGT.A:

# inserts: 1

# updates: 0

# deletes: 0

# discards: 1

显示插入一个数据,丢弃一个数据。

结果:同步失败。

*若给re进程重新配置,添加指定keycols(id,name)

REPLICAT re

DBOPTIONS INTEGRATEDPARAMS(parallelism 6)

USERID oggt, PASSWORD oggt

MAP oggs.A, target oggt.A, keycols(id,name),colmap(useDefaults, time=@datenow());

*重启re进程,目标端查询数据:

SQL> select id,name,time from oggt.A;

ID NAME TIME

---------- ------------ --------------------------------------------------------------------------------

1 b 20-9月 -19 02.29.07.000000 下午

GGSCI>view report re

Report at 2019-09-20 14:36:31 (activity since 2019-09-20 14:29:07)

From Table OGGS.A to OGGT.A:

# inserts: 1

# updates: 1

# deletes: 0

# discards: 0

显示插入一个数据,更新一个数据。

结果:同步正常进行

结论:在同步无主键的表时,即使将目标表的多出的字段隐藏,若不指定keycols,同样会导致OGG 同步update、delete失败。

因此,在同步没有主键的表时,且目标字段与源字段数量不同,此时需在进程中配置keycols或在同步开始之前在数据库中为需要同步的表设定主键。

验证ogg同步数据库表无主键表且目标表包含隐藏字段的更多相关文章

  1. sqlserver 批量修改数据库表主键名称为PK_表名

    1.我们在创建sqlserver得数据表的主键的时候,有时会出现,后面加一串随机字符串的情况,如图所示: 2.如果你有强迫症的话,可以使用以下sql脚本进行修改,将主键的名称修改为PK_表名. --将 ...

  2. 一个7重嵌套表EF添加语句,注意子表赋值过程中只需写子表主键赋值,不需要写子表外键=父表主键。EF创建时会自动将子表外键设为与父表主键相等

    AIRPORT_HELIPORT tt = new AIRPORT_HELIPORT()            {                AIRPORT_HELIPORT_UUID = Gui ...

  3. 利用rowid删除数据库中无主键的相同记录

    数据库中表没有添加主键,误插入了两条数据,现在需要删除其中一条记录. 利用rowid号,因为表中的每一行数据都有一个rowid,这个rowid 号是不同的,用select可以查询出来. select ...

  4. Postgres——pgadmin复制无主键单表至本地数据库

    数据库中存在无主键单表gongan_address_all ,需要将余杭区数据导出成另外一张表,因为数据量太大,sql语句效率太差. 通过sql语句查询出余杭区数据,并导出成csv,sql等格式,再导 ...

  5. SQLSERVER清空(Truncate)被外键引用的数据表

    前言:我们知道SQLSERVER清空数据表有两种方式Delete和Truncate,当然两者的不同大家也都知道(不清楚的可以MSDN).不过这个错误“Cannot truncate table  be ...

  6. 使用GUID作为数据表主键的好处(转)

    http://blog.itpub.net/3875/viewspace-789520/ 分类: 数据库开发技术 使用GUID作为数据表主键的好处 [@more@] 使用GUID作为数据表主键的好处 ...

  7. mysql之字段的修改,添加、删除,多表关系(外键),单表详细操作(增删改)

    字段的修改.添加和删除 create table tf1( id int primary key auto_increment, x int, y int ); #修改 alter table tf1 ...

  8. django中有外键关系两张表的相互查找方法

    两张通过外键联系的表,如何在一张表上根据另一张表上的属性查找满足条件的对象集? 1  平常查找表中数据的条件是python中已有的数据类型,通过名字可以直接查找.如果条件是表中外键列所对应表的某一列, ...

  9. SSIS 系列 - 在 SSIS 中使用 Multicast Task 将数据源数据同时写入多个目标表,备份数据表,以及写入Audit 信息

    转自http://www.cnblogs.com/biwork/p/3328838.html 在 SSIS Data Flow 中有一个 Multicast 组件,它的作用和 Merge, Merge ...

随机推荐

  1. python中#!含义

    LINUX 上的 Shebang 符号(#!) #!这个符号叫做 Shebang 或者 Sha-bangShebang 通常在 Unix 系统脚本的中第一行开头使用指明执行这个脚本文件的解释程序 使用 ...

  2. Huffman Tree (哈夫曼树学习)

    WPL 和哈夫曼树 哈夫曼树,又称最优二叉树,是一棵带权值路径长度(WPL,Weighted Path Length of Tree)最短的树,权值较大的节点离根更近. 首先介绍一下什么是 WPL,其 ...

  3. blockingqueue.h

    #include <mutex> #include <condition_variable> #include <deque> template <typen ...

  4. ArcGIS 生成要素轮廓线掩膜

    先说效果: 生成轮廓之前:

  5. qt 静态库中貌似不能使用静态属性

    今天一个问题搞的很郁闷,原本好好的工程,这两天加了几个类之后链接不通过了. 发现过程略去不说,最后去掉了类中的static属性,编译通过了.具体原因没时间仔细查了,反正尽量避免在静态链接库里使用sta ...

  6. flutter 项目中,开发环境、多接口域名、多分支的配置

    flutter 项目中,开发环境.多接口域名.多分支的配置 开发环境:配置成多个入口文件.比如:main.dart.main_develop.dart.main_preview.dart 多域名:每个 ...

  7. tomcat和apache的区别--http server vs application server

    1. Apache是web服务器,Tomcat是应用(java)服务器,它只是一个servlet容器,是Apache的扩展. 2. Apache和Tomcat都可以做为独立的web服务器来运行,但是A ...

  8. day006-python函数

    一.定义函数 def 函数名(): 函数体代码 例: #定义函数 def email(): print('send email') #调用执行函数 email() 二.函数的返回值 def email ...

  9. FFT代码详解

    关于FFT原理部分的介绍,在网上已经有很多了,所以在此只讲代码实现部分的内容. 原理可以参考https://www.cnblogs.com/RabbitHu/p/FFT.html 推荐看完它的原理解释 ...

  10. 未能找到 System.Web.Helpers

    This question is a bit old but here's a simple solution - Microsoft seemed to just move this library ...