Chinaunix
标题:
HA:求助,利用高级复制同步数据
[打印本页]
作者:
wmw888
时间:
2008-05-30 13:44
标题:
HA:求助,利用高级复制同步数据
我现在有一个HA的项目,我打算用oracle的高级复制功能同步数据,我在两边增加数据都可以同步到另边。
可是我发现些问题:
有些表使用自增序列作主键,可是,两边数据同步后,主键不一致。这个情况怎么处理?
我在update数据时,报ORA-01403,请问这和主键不一致有关吗?
因为,时间紧迫,所以,还请帮忙指教。
[
本帖最后由 wmw888 于 2008-5-30 13:56 编辑
]
作者:
wmw888
时间:
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;
即可;
欢迎光临 Chinaunix (http://bbs.chinaunix.net/)
Powered by Discuz! X3.2