免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2246 | 回复: 1
打印 上一主题 下一主题

HA:求助,利用高级复制同步数据 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2008-05-30 13:44 |只看该作者 |倒序浏览
20可用积分
  我现在有一个HA的项目,我打算用oracle的高级复制功能同步数据,我在两边增加数据都可以同步到另边。
      可是我发现些问题:     
  有些表使用自增序列作主键,可是,两边数据同步后,主键不一致。这个情况怎么处理?
  我在update数据时,报ORA-01403,请问这和主键不一致有关吗?

因为,时间紧迫,所以,还请帮忙指教。

[ 本帖最后由 wmw888 于 2008-5-30 13:56 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2008-05-30 14:09 |只看该作者

找到答案

原文:http://q.163.com/lovejava/blog/m ... 6618920077210334379

相关问题:

数据库同步之后,随之而来的问题就是,如果数据库里每个表都是以自增ID为主键的话(oracle的自增字段为序列+触发器实现),而我们只设置表同步,序列是没有办法进行同步的,而序列是只要查询一次就会自增加1,如果sh数据插入一条不成功,而第二第成功的话,就会形成ID不一致现象,如下所示:

                    sh                                             bj

  表t_a,序列se_a,下一ID:1120         表t_a,序列se_a,下一ID:1120

插入失败:se_a也会+1为1121         而数据不成功也就不同步,bj还是1120

第二次插入成功:se_a+1为1122     数据成功同步,bj的se_a+1 为:1121

这样也就形成了北京和上海数据同步而ID不一致,如果你的表中使用了clob字段,这样的话clob字段也会为影响为null,

解决方案为:如果sh为主库,bj为负库,也就是说这个t_a的表只有上海为插入删除操作,北京只是查询,最简单的就是把北京的序列的触发器册除,即可;如果上海和北京都对t_a表都有插入删除操作,也就是双向同步,那就要使上海和北京的ID序列不一样就行,如北京以1开始,而上海以 900000001开始,再修改触发器:

原触发器为:select se_a.nextval into:new.id from dual;
修改为:if :new.id is null then
select se_a.nextval into:new.id from dual;
end if;

即可;
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP