文笔有限大家凑合看看。。。
前段时间公司在做一个数据仓库,但是这个数据仓库很奇怪,他需求把实时变化的数据同步到本库。这个大大的增加了工作的难度。
当时让我提方案,我提出了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的方案