跨oracle实例比较和同步数据

跨oracle实例比较和同步数据,oracle,compare,Oracle,Compare,我有三个oracle环境。如果我在我的开发环境中对数据进行更改,我希望能够将这些更改转移到其他环境中 挑战在于其他环境中的数据将不具有相同的主键。因此,比较必须查看表中的其他列。如果该表引用了另一个表,则还必须包含该表中的列 例如,表A可能有4列,它们都是其他表的ID,因此操作表A需要引用这些其他表。有人能推荐这种产品吗 更新要求:系统目前的状况无法改变。ID将永远不会同步。同步必须只在需要时发生(在我们每两个月更新一次之后)。无法通过DB链接进行同步(尽管开发人员系统可以通过DB链接读取数据)

我有三个oracle环境。如果我在我的开发环境中对数据进行更改,我希望能够将这些更改转移到其他环境中

挑战在于其他环境中的数据将不具有相同的主键。因此,比较必须查看表中的其他列。如果该表引用了另一个表,则还必须包含该表中的列

例如,表A可能有4列,它们都是其他表的ID,因此操作表A需要引用这些其他表。有人能推荐这种产品吗

更新要求:系统目前的状况无法改变。ID将永远不会同步。同步必须只在需要时发生(在我们每两个月更新一次之后)。无法通过DB链接进行同步(尽管开发人员系统可以通过DB链接读取数据)。我完全可以编写SQL来完成这一切,它只是一种容易出错(和打字错误)的东西,如果有第三方应用程序可以帮我解决这个问题,我宁愿把钱花在这上面

根据要求更新:所有系统均为11g Enterprise。数据量非常小,带宽不是问题。同步每两个月进行一次。基本上,我们有规则告诉我们的UI如何行为。这些规则存储在各种表中。我们不时地改变这些规则。这可能是数千条记录,但不是数万条。我们不希望像人们希望的那样从“实时”数据进行同步。我需要能够做的是指定两个数据库实例和相关的表,然后生成一个SQL脚本,有效地将更改从数据库a移动到数据库B。鉴于数据的性质,我一直在考虑简单地截断目标表并将数据sqlloading到其他环境中。这并不像听起来那么简单,因为有一个“live”表引用了这些记录,可能需要一些特定的更新(我也在积极研究这种可能性,只是不像听起来那么简单)

下面的代码将提供我的意思的示例。您会注意到ID,而这些ID在不同的环境中并不一致,这正是造成此问题的原因

drop table mydata;
drop table MYTOWN;
drop table MYJOB;
drop table MYEMPLOYER;
drop table mystate;

create table MYJOB
(MYJOBID varchar2(1000)  NOT NULL PRIMARY KEY,
MYJOB varchar2(1000));

create table MYEMPLOYER
(MYEMPLOYERID  varchar2(1000)  NOT NULL PRIMARY KEY,
MYEMPLOYER  varchar2(1000));


create table MYSTATE
(MYSTATEID  varchar2(1000)  NOT NULL PRIMARY KEY,
MYSTATE varchar2(1000));

create table MYTOWN
(MYTOWNID varchar2(1000)  NOT NULL PRIMARY KEY,
MYTOWN varchar2(1000),
MYSTATEID varchar2(1000),
CONSTRAINT MYSTATE_FK FOREIGN KEY (MYSTATEID) REFERENCES MYSTATE (MYSTATEID) ENABLE);


create table MYDATA
(MYDATAID varchar2(1000)  NOT NULL PRIMARY KEY,
MYTOWNID varchar2(1000),
MYJOBID varchar2(1000),
MYEMPLOYERID varchar2(1000),
CONSTRAINT MYTOWN_FK FOREIGN KEY (MYTOWNID) REFERENCES MYTOWN (MYTOWNID) ENABLE,
CONSTRAINT MYJOB_FK FOREIGN KEY (MYJOBID) REFERENCES MYJOB (MYJOBID) ENABLE,
CONSTRAINT MYEMPLOYER_FK FOREIGN KEY (MYEMPLOYERID) REFERENCES MYEMPLOYER (MYEMPLOYERID) ENABLE
);


create sequence mydataid_seq;

insert into myemployer values ('937436',    'Bank Of America');
insert into myemployer values  ('43',   'Google');
insert into myemployer values  ('2',    'Toms Taxi');

insert into myjob  values ('8','Programmer');
insert into myjob  values ('10','Cook');
insert into myjob  values ('5','Driver');

insert into mystate  values ('7643','MA');
insert into mystate  values ('23','CA');
insert into mystate  values ('54','NM');

insert into mytown  values ('4743','BOSTON','7643');
insert into mytown  values ('321','SANDIEGO','23');
insert into mytown  values ('92037','SANTA FE','54');

insert into mydata  values ('78','4743','8','937436');
insert into mydata  values ('23455','321','10','43');
insert into mydata  values ('901','92037','5','2');


--to select a unique row
select mt.mytown, ms.mystate, mj.myjob, me.myemployer
from mydata md, mytown mt, mystate ms, myemployer me, myjob mj
where md.mytownid=mt.mytownid
and mt.mystateid=ms.mystateid
and md.myjobid=mj.myjobid
and md.myemployerid=me.myemployerid;

--to delete a row
delete from mydata md where md.mydataid =
(select md.mydataid 
from mydata md, mytown mt, mystate ms, myemployer me, myjob mj
where md.mytownid=mt.mytownid
and mt.mystateid=ms.mystateid
and md.myjobid=mj.myjobid
and md.myemployerid=me.myemployerid
and mt.mytown='SANDIEGO'
and ms.mystate='CA'
and mj.myjob='Cook'
and me.myemployer='Google');

--to insert a row
insert into mydata (mydataid,mytownid, myjobid, myemployerid)
(select mydataid_seq.nextval, mt.mytownid, mj.myjobid, me.myemployerid
from mytown mt, mystate ms, myemployer me, myjob mj
where mt.mytown='SANTA FE'
and mj.myjob='Programmer'
and me.myemployer='Toms Taxi'
and ms.mystate='NM'
);
看看甲骨文戈登盖特。 也许这就像一个重武器解决方案

最佳解决方案取决于您的具体需求(多少数据?多久一次?必须进行多少转换?服务器之间的带宽?负载?等等…)

Oracle有许多复制选项

更新:

关于GoldenGate的建议仍然是实际的,但它不是廉价的解决方案

但是,如果您有一些编码技能和兴趣,那么可能更容易:

  • 使用db link并使用同步逻辑编写PLSQL包。然后,您可以在需要时调用它,或者定期将其作为作业/任务运行。中央数据库必须能够看到其他数据库,并且必须能够建立直接连接
  • 或者您可以编写一个外部应用程序,并在其中放置一个同步逻辑。数据库可以位于单独的DMZ中
  • 当然,您可以使用Oracle Streams(11g enterprise包括它),但我不能保证在您的情况下,如果没有额外的编码,它会工作。因此,这种方法可能会成为第一种复杂的方法

    有时,使用严格的复制解决方案需要更多的时间来设置和维护它们。在你的情况下,你只需要一次同步

    你可以找到一些现成的免费解决方案。但是,在大多数情况下,它们的质量很差。所以,我不推荐他们

    附言: 您可以使用两种方法解决数据不一致的问题:

  • 最简单:为每个数据库的键列使用具有不同起始值的oracle序列(不要忘记也设置最大值,以防止重叠)
  • 常规解决方案:重新设计数据模型,以包含有关office/server的信息

  • 您使用的是Oracle数据库的哪个版本(9i、10g、11g)和版本(标准版、企业版等)?我实在无法在其他系统上更改序列。这是我必须面对的情况。在我目前的情况下,我知道如何做到这一点的唯一方法是跨DB链接比较表,然后根据这些结果生成sql,这样我就可以在所有实例中运行该sql。再说一次,事情就是这样。我希望能找到一个第三方应用程序来实现这一点,因为编写这段代码并不困难,但相当耗费人力,而且有很大的打字空间。顺便说一句,这一点比我预想的要明显得多。我道歉。