读书人

利用Oracle快照dblink解决数据库表同步

发布时间: 2012-07-23 09:42:20 作者: rapoo

利用Oracle快照dblink解决数据库表同步问题

本实例已完全通过测试,单向,双向同步都可使用.

名词解释:源?? ——被同步的数据库
?????????????? 目的——要同步到的数据库

前6步必须执行,第6以后是一些辅助信息

?

1、在目的数据库上,创建dblink

CREATE OR REPLACE TRIGGER BST114.TRI_TEST_USER_AFRAFTER DELETE OR INSERT OR UPDATEON BST114.SN_TEST_USER REFERENCING NEW AS NEW OLD AS OLDFOR EACH ROWdeclare    tmp_id number(10):=-1;begindbms_output.put_line('begin');if inserting then      --select id into tmp_id from test_user where id=:new.id;          for p in(select id from test_user where id=:new.id)      loop        tmp_id:=p.id;      end loop;            dbms_output.put_line(tmp_id||'===------------');      if (tmp_id=-1) then          insert into test_user(id,name,age)          values(:new.id,:new.name,:new.age);      end if;end if;if updating then     dbms_output.put_line('updated');     for p in(select name,age from test_user where id=:old.id)     loop         if (p.name!=:new.name) or (p.age!=:new.age) then              update test_user set name=:new.name,age=:new.age where id=:old.id;         end if;     end loop;end if;if deleting then      dbms_output.put_line('deleted');      delete from test_user where id=:old.id;end if;dbms_output.put_line('end');end TRI_test_user_AFR;--为防止双向同步触发器死循环,所以要在触发器中增加一些判断,阻止死循环.

?

以上同步原理
1.首先创建一个dblink,可以访问远程数据库
2.在本地创建一个快照,映射远程数据表,当远程数据表有变化时,会反应到快照中.
3.由于快照类似于视图表,所以在本地为快照创建一个触发器,当快照有变化时,会触发相应事件.
4.在触发器中写同步数据的代码.

?

附:快照刷新时间参数说明
一天的秒数=24小时*60分钟*60钞
所以要想在30秒后刷新,参数应该这样写 sysdate+30/(24*60*60)
1分钟==sysdate+60/(24*60*60)

一天的分钟数=24小时*60分钟
一分钟也可以这样写 sysdate+1/(24*60)
30分钟==sysdate+30/(24*60)
60分钟==sysdate+60/(24*60)

以此类推
1小时==sysdate+1/24==sysdate+60/(24*60)
1天==sysdate+1
一个月==sysdate+30

?

读书人网 >其他数据库

热点推荐