oracle数据库实时同步(trigger的方式)

文笔有限大家凑合看看。。。

前段时间公司在做一个数据仓库,但是这个数据仓库很奇怪,他需求把实时变化的数据同步到本库。这个大大的增加了工作的难度。

当时让我提方案,我提出了OGG,dg,SymmetricDS,trigger,sqlldr,exp,megre ,dblink,sqlplus copy等方案

首先sqlldr和exp对于实时变化的表同步基本上是不可能的(除非一直不停的truncate),如果有哪位大神基于这两种做出来,希望能指点小弟

其次数据仓库是多元化的,而且跨机房,所以dg也可以否定

最后OGG是原厂的同步软件,效率最高。单被领导无情的否定,至于答案,大家都懂!

剩下SymmetricDS,trigger,megre,dblink,sqlplus copy等几个方案

SymmetricDS没用过不知道

sqlplus copy我觉得还不如dblink效率高,当时研讨说dblink走网络不安全,敢情sqlplus copy安全一样,╮(╯▽╰)╭,况且这两个也得truncate

最后就是megre和trigger了

我是很想使用trigger的,不过也被否认了

这里我大致谈一下我的思路

第一步:

首先对source进行一次导出(按时间点导出,具体什么方法自己拿捏)假设时间是1月1日

第二步:

将数据导入target库假设时间是1月1日

第三步:这个时候1月1日之前的某个数据改变了,我们1月2日导入数据时,是无法更新1月1日之前数据的

创建一个触发器记录改变数据的唯一可辨识值切不能改变的值,例如主键和合同编号

触发器举例:

create table crf_p2p_account_info_t (pri_number number,loan_contract varchar2(30));---创建附表记录变更值,记录的值一定要是唯一的切不可变更

create or replace trigger crf_p2p_account_info_tri
after update on crf_p2p_account_info for each row 
begin
  insert into crf_p2p_account_info_t (pri_number,loan_contract_no)
  values (:old.pri_number,:old.loan_contract_no);
  end;

当表发生update变更数据时,记录两条唯一值pri_number(主键),loan_contract_no(唯一值)到附表中crf_p2p_account_info_t

第四步:创建一张表结构一摸一样的表,用来记录改变后的值

create table crf_p2p_account_info_i as select * from crf_p2p_account_info where  1=2

弟五步,在源端创建过程,记录所有改变的值

create or replace procedure test_update 
is 
begin
for i in (select pri_number,loan_contract_no from crf_p2p_account_info_t) loop
insert into crf_p2p_account_info_i select * from crf_p2p_account_info where pri_number=i.pri_number and loan_contract_no=i.loan_contract_no;
commit;
end loop;
execute immediate 'truncate table crf_p2p_account_info_t';
end;


第6步:传输crf_p2p_account_info_i,crf_p2p_account_info_t表到目标数据库

创建存储过程

create or replace procedure test_update 
is 
begin
for i in (select pri_number,loan_contract_no from crf_p2p_account_info_t) loop
delete from crf_p2p_account_info where pri_number=i.pri_number and loan_contract_no=i.loan_contract_no;   ---先清除原表的数据

insert into crf_p2p_account_info select * from crf_p2p_account_info_i where pri_number=i.pri_number and loan_contract_no=i.loan_contract_no;
commit;
end loop;
execute immediate 'truncate table crf_p2p_account_info_t';
end;


希望大家有想法的可以一起讨论,哪天有时间写写megre的方案

你可能感兴趣的:(oracle数据库)