Oracle不同数据库之间同步处理方案

背景:项目中遇到的问题 , 需要二区两台数据库之间同步一些表 , 以及导出sql文件同步至三区数据库 。
1 SQL文件目录新建SQL文件生成的目录D:mptmsudataDNLTBDIR 。
二区数据库中执行下列语句:
create or replace directory DNL_TB_DIRas 'D:mptmsudataDNLTBDIR';2 数据库修改1)新建二区数据库服务器到二区数据库服务器的数据库DATABASE LINK文件 。
二区数据库中执行下列语句:
create public database link XQDNJLconnect to YPTMSusing '192.168.10.8/mptmsu';2)二区数据库服务器新建表DNL_TBJL 。
二区数据库中执行下列语句:
-- Create tablecreate table DNL_TBJL(id VARCHAR2(25) not null,tables VARCHAR2(25) not null,czlx VARCHAR2(25),sql VARCHAR2(2000) not null,time DATE not null,bak VARCHAR2(128) not null)tablespace MPTMSUpctfree 10initrans 1maxtrans 255storage(initial 64Knext 1Mminextents 1maxextents unlimited);-- Add comments to the columnscomment on column DNL_TBJL.idis 'ID';comment on column DNL_TBJL.tablesis '同步表名';comment on column DNL_TBJL.czlxis '操作类型';comment on column DNL_TBJL.sqlis 'SQL内容';comment on column DNL_TBJL.timeis '操作时间';3 触发器在二区数据库服务器说新建相关表的触发器 , 触发器实现的功能是东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)内 。
下面以AEMTINFO表为例 , 具体的触发器代码如下:
create or replace trigger SYN_AEMTINFOafter insert or update or delete on AEMTINFOfor each row/*------------------------------------------------------------------功 能:东区2区向西区、东区3区传送数据库变化功能说明:东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)内 。-------------------------------------------------------------*/declareintegrity_error exception;errno integer;errmsg char(200);tmp varchar2(1000);tmpval varchar2(1000);val varchar2(4000);id varchar2(20);dnltb utl_file.file_type;beginif inserting theninsert into AEMTINFO@XQDNJL(EMTID,SID,SNAME,STIME,ETIME,INTERVAL,EARGS,ADDDATE,REMARK,FLAG)values (:NEW.EMTID, :NEW.SID, :NEW.SNAME, :NEW.STIME, :NEW.ETIME, :NEW.INTERVAL, :NEW.EARGS, :NEW.ADDDATE, :NEW.REMARK, :NEW.FLAG);select 'insert into AEMTINFO (EMTID,SID,SNAME,STIME,ETIME,INTERVAL,EARGS,ADDDATE,REMARK,FLAG)values ('||''''||:NEW.EMTID||''''||','||''''||:NEW.SID||''''||','||''''||:NEW.SNAME||''''||','||'to_date('||''''||to_char(:NEW.STIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||'to_date('||''''||to_char(:NEW.ETIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||''''||:NEW.INTERVAL||''''||','||''''||:NEW.EARGS||''''||','||'to_date('||''''||to_char(:NEW.ADDDATE,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||''''||:NEW.REMARK||''''||','||''''||:NEW.FLAG||''''||');'into valfrom dual;select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||lpad(DNL_TBXL.nextval, 3, '0')into idfrom dual;insert into DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)values(id,'AEMTINFO', 'INSET', val, sysdate, id);dnltb := utl_file.fopen('DNL_TB_DIR', 'INSET-'||'AEMTINFO-'||id || '.sql', 'w');utl_file.put_line(dnltb, val);utl_file.put_line(dnltb, 'commit;');utl_file.put_line(dnltb, 'exit;');utl_file.fclose(dnltb);elsif updating thenupdate AEMTINFO@XQDNJLset EMTID = :NEW.EMTID,SID = :NEW.SID,SNAME = :NEW.SNAME,STIME = :NEW.STIME,ETIME = :NEW.ETIME,INTERVAL = :NEW.INTERVAL,EARGS = :NEW.EARGS,ADDDATE = :NEW.ADDDATE,REMARK = :NEW.REMARK,FLAG = :NEW.FLAGwhere emtid = :OLD.emtid;select 'update AEMTINFO set '||'EMTID = '||''''||:NEW.EMTID||''''||','||'SID = '||''''||:NEW.SID||''''||','||'SNAME = '||''''||:NEW.SNAME||''''||','||'STIME = '||'to_date('||''''||to_char(:NEW.STIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||'ETIME = '||'to_date('||''''||to_char(:NEW.ETIME,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||'INTERVAL = '||''''||:NEW.INTERVAL||''''||','||'EARGS = '||''''||:NEW.EARGS||''''||','||'ADDDATE = '||'to_date('||''''||to_char(:NEW.ADDDATE,'yyyy-mm-dd hh24:mi:ss')||''''||','||'''yyyy-mm-dd hh24:mi:ss'''||'),'||'REMARK = '||''''||:NEW.REMARK||''''||','||'FLAG = '||''''||:NEW.FLAG||''''|| 'where emtid = '||:OLD.emtid||';'into valfrom DUAL;select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||lpad(DNL_TBXL.nextval, 3, '0')into idfrom dual;insert into DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)values(id,'AEMTINFO', 'UPDATE', val, sysdate, id);dnltb := utl_file.fopen('DNL_TB_DIR', 'UPDATE-'||'AEMTINFO-'||id || '.sql', 'w');utl_file.put_line(dnltb, val);utl_file.put_line(dnltb, 'commit;');utl_file.put_line(dnltb, 'exit;');utl_file.fclose(dnltb);elsif deleting thendelete from AEMTINFO@XQDNJL where emtid = :OLD.emtid;tmp := :OLD.emtid;tmpval := 'delete from AEMTINFO where emtid=';val := concat(tmpval, tmp || ';');select (select to_char(sysdate, 'yyyyMMddHH24miss') from dual) ||lpad(DNL_TBXL.nextval, 3, '0')into idfrom dual;insert into DNL_TBJL(id, tables,czlx, SQL, TIME, BAK)values(id,'AEMTINFO', 'DELETE', val, sysdate, id);dnltb := utl_file.fopen('DNL_TB_DIR', 'DELETE-'||'AEMTINFO-'||id || '.sql', 'w');utl_file.put_line(dnltb, val);utl_file.put_line(dnltb, 'commit;');utl_file.put_line(dnltb, 'exit;');utl_file.fclose(dnltb);end if;exceptionwhen integrity_error thenraise_Application_error(errno, errmsg);end;


推荐阅读