不同数据库之间的实时同步
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
最近一段时间前单位的同事问我有什么方法可以实现不同数据库之间表数据的同步,起初我告诉他可以用DATAGURAD,STREAM,物化视图等技术手段实现。但他告诉我需要同步数据的表并不多(有3-5张表需要同步)。我就想通过编写触发器实现要更为简单一些。通过几天的努力终于实现。通过一些简单的测试感觉效果还可以,特总结一下奉献给大家。之前论坛里有人问过此类问题,但很多高手都说可以用触发器实现,可是没有给出具体的实现方法。可能他们认为非常easy,呵呵!在这里我帖出实现的具体方法和触发器的代码给当前有此需求的兄弟。将来可能有此需求的兄弟可以将此作为备选方案,参考一下也可以。同时请论坛里的高手多指点,多给出改进意见。如果这篇文章对大家的工作有一定的帮助,那么希望大家能多给于支持。谢谢!我将把大家的支持化作持续、深入学习ORACLE的动力。
现在假设有两个数据库A,B,B库中的备用表需要和A库中的住表同步数据。主表和备用表表名相同(也可以不同),都叫a
1。首先建立在A库所在的机器建立访问B库的网络服务名prod,用NET-MANAGER完成
2。创建PUBLIC DATABASE LINK,先不指定用户名和密码
CREATE PUBLIC DATABASE LINK prod USING 'prod' 注意: 'prod'表示第1步中创建的网络服务名,以sys/system用户创建
3。在需要访问远程数据库用户下创建私有DATABASE LINK(同PUBLIC DATABASE LINK名称相同),要具有CREATE DATABASE LINK权限。指定用户和密码
CREATE DATABASE LINK prod CONNECT TO scott IDENTIFIED BY tiger 注意:scott用户必须在B库中存在且指定相应的密码,和这里给出的密码要一致。
4。创建触发器
a表为实验表,表结构为user_id number(3) username varchar2(20)
更新或插入主表记录时和备份表同步数据的触发器,其中表a是主表,a@prod是备份表,即B库中的a表
create or repalce trigger sync_data1
after insert or update on a
begin
merge into a@prod t2
using a t1 on(
er_id=er_id)
when matched then
update set ername=ername
when not matched then
insert (er_id,ername) values(er_id,ername)
end sync_data1;
删除主表记录时和备份表同步数据的触发器,其中a是主表,a@prod是备份表,即B库中的a表
create or replace trigger sync_data2
after delete on a
begin
delete from a@prod
where user_id in(
select user_id from a@prod
minus
select user_id from a);
end sync_data2;
或者
create or replace trigger sync_data2
after delete on a
begin
delete from a@prod
where rowid in(
select rowid from a@prod
minus
select rowid from a);
end sync_data2;
经过本人的实验,当对A库中的主表进行更新,插入,删除后B库的备份表能和主表中的数据保持一致。至于具体的环境还要充分分析表结构以及表之间的关系等,这些问题可以和大家一起探讨。有不明白的地方可以给我发站内短消息。最后本人目前很想找1份初级/中级DBA工作,但是由于我之前没有专职DBA工作经历以及以往的技术工作经历不被看好,在找工作过程中被很多人力和技术经理给拒绝了。在这里我帖出自己在ORACLE方面掌握的一些技能,如果论坛里那位兄弟所在的单位或朋友需要ORACLE技术人员,麻烦大家给帮忙推荐一下。待遇方面我要求不高,只希望能给个上手的机会。多年做技术工作的我相信自己有能力把DBA工作做好。在此一并谢过大家了!