背景:项目中遇到的问题,需要二区两台数据库之间同步一些表,以及导出sql文件同步至三区数据库。1SQL文件目录 新建SQL文件生成的目录D:mptmsudataDNLTBDIR。 二区数据库中执行下列语句:createorreplacedirectoryDNLTBDIRasD:mptmsudataDNLTBDIR;2数据库修改 1)新建二区数据库服务器到二区数据库服务器的数据库DATABASELINK文件。 二区数据库中执行下列语句:createpublicdatabaselinkXQDNJLconnecttoYPTMSusing192。168。10。8mptmsu; 2)二区数据库服务器新建表DNLTBJL。 二区数据库中执行下列语句:CreatetablecreatetableDNLTBJL(idVARCHAR2(25)notnull,tablesVARCHAR2(25)notnull,czlxVARCHAR2(25),sqlVARCHAR2(2000)notnull,timeDATEnotnull,bakVARCHAR2(128)notnull)tablespaceMPTMSUpctfree10initrans1maxtrans255storage(initial64Knext1Mminextents1maxextentsunlimited);AddcommentstothecolumnscommentoncolumnDNLTBJL。idisID;commentoncolumnDNLTBJL。tablesis同步表名;commentoncolumnDNLTBJL。czlxis操作类型;commentoncolumnDNLTBJL。sqlisSQL内容;commentoncolumnDNLTBJL。timeis操作时间;3触发器 在二区数据库服务器说新建相关表的触发器,触发器实现的功能是东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNLTBJL(id,tables,czlx,SQL,TIME,BAK)内。 下面以AEMTINFO表为例,具体的触发器代码如下:createorreplacetriggerSYNAEMTINFOafterinsertorupdateordeleteonAEMTINFOforeachrow功能:东区2区向西区、东区3区传送数据库变化功能说明:东区2区向西区直接通过DBLINK直接执行;东区2区向东区3区通过生成SQL文件到D:mptmsudataDNLTBDIR目录下;触发器的每次操作都记录到表格DNLTBJL(id,tables,czlx,SQL,TIME,BAK)内。declareintegrityerrorexception;errnointeger;errmsgchar(200);tmpvarchar2(1000);tmpvalvarchar2(1000);valvarchar2(4000);idvarchar2(20);dnltbutlfile。filetype;beginifinsertingtheninsertintoAEMTINFOXQDNJL(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);selectinsertintoAEMTINFO(EMTID,SID,SNAME,STIME,ETIME,INTERVAL,EARGS,ADDDATE,REMARK,FLAG)values(:NEW。EMTID,:NEW。SID,:NEW。SNAME,todate(tochar(:NEW。STIME,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),todate(tochar(:NEW。ETIME,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),:NEW。INTERVAL,:NEW。EARGS,todate(tochar(:NEW。ADDDATE,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),:NEW。REMARK,:NEW。FLAG);intovalfromdual;select(selecttochar(sysdate,yyyyMMddHH24miss)fromdual)lpad(DNLTBXL。nextval,3,0)intoidfromdual;insertintoDNLTBJL(id,tables,czlx,SQL,TIME,BAK)values(id,AEMTINFO,INSET,val,sysdate,id);dnltb:utlfile。fopen(DNLTBDIR,INSETAEMTINFOid。sql,w);utlfile。putline(dnltb,val);utlfile。putline(dnltb,commit;);utlfile。putline(dnltb,exit;);utlfile。fclose(dnltb);elsifupdatingthenupdateAEMTINFOXQDNJLsetEMTID: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。FLAGwhereemtid:OLD。emtid;selectupdateAEMTINFOsetEMTID:NEW。EMTID,SID:NEW。SID,SNAME:NEW。SNAME,STIMEtodate(tochar(:NEW。STIME,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),ETIMEtodate(tochar(:NEW。ETIME,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),INTERVAL:NEW。INTERVAL,EARGS:NEW。EARGS,ADDDATEtodate(tochar(:NEW。ADDDATE,yyyymmddhh24:mi:ss),yyyymmddhh24:mi:ss),REMARK:NEW。REMARK,FLAG:NEW。FLAGwhereemtid:OLD。emtid;intovalfromDUAL;select(selecttochar(sysdate,yyyyMMddHH24miss)fromdual)lpad(DNLTBXL。nextval,3,0)intoidfromdual;insertintoDNLTBJL(id,tables,czlx,SQL,TIME,BAK)values(id,AEMTINFO,UPDATE,val,sysdate,id);dnltb:utlfile。fopen(DNLTBDIR,UPDATEAEMTINFOid。sql,w);utlfile。putline(dnltb,val);utlfile。putline(dnltb,commit;);utlfile。putline(dnltb,exit;);utlfile。fclose(dnltb);elsifdeletingthendeletefromAEMTINFOXQDNJLwhereemtid:OLD。emtid;tmp::OLD。emtid;tmpval:deletefromAEMTINFOwhereemtid;val:concat(tmpval,tmp;);select(selecttochar(sysdate,yyyyMMddHH24miss)fromdual)lpad(DNLTBXL。nextval,3,0)intoidfromdual;insertintoDNLTBJL(id,tables,czlx,SQL,TIME,BAK)values(id,AEMTINFO,DELETE,val,sysdate,id);dnltb:utlfile。fopen(DNLTBDIR,DELETEAEMTINFOid。sql,w);utlfile。putline(dnltb,val);utlfile。putline(dnltb,commit;);utlfile。putline(dnltb,exit;);utlfile。fclose(dnltb);endif;exceptionwhenintegrityerrorthenraiseapplicationerror(errno,errmsg);end;4sql文件入库批处理 通过Windows系统自带的计划任务执行下面批处理实现数据入库 1)三区区数据库服务器新建表DNLSQLJL。 三区数据库中执行下列语句:CreatetablecreatetableDNLSQLJL(idVARCHAR2(25),tablesVARCHAR2(25),czlxVARCHAR2(25),sqlmlVARCHAR2(2000),sqlVARCHAR2(2000),timeDATE,bakVARCHAR2(128))tablespaceMPTMSUpctfree10initrans1maxtrans255storage(initial64Knext1Mminextents1maxextentsunlimited);AddcommentstothecolumnscommentoncolumnDNLSQLJL。idisID;commentoncolumnDNLSQLJL。tablesis同步表名;commentoncolumnDNLSQLJL。czlxis操作类型;commentoncolumnDNLSQLJL。sqlmlisSQL文件目录;commentoncolumnDNLSQLJL。sqlisSQL内容;commentoncolumnDNLSQLJL。timeis操作时间; 2)三区区数据库服务器新建计划任务定期执行DQ3QRKZXWJ。bat批处理。 3)DQ3QRKZXWJ。bat批处理调用DQ3QRKZXSQL。bat来执行入库操作。 DQ3QRKZXWJ。bat语句如下:echooffREMsetLoglogDQ3QRKSQLdate:0,4。date:5,2。date:8,2。logREMrem第一步dirD:mptmsudataDNLTBDIRbafindstr。sqlgt;D:mptmsudataDNLTBDIRDQ3QRKWJ。TXTremcdddp0forftokens13delims。iin(D:mptmsudataDNLTBDIRDQ3QRKWJ。TXT)dodp0DQ3QRKZXSQL。batijkLog21pauseexit DQ3QRKZXSQL。bat语句如下:echooffREMREMsetLoglogDQ3QRKSQLdate:0,4。date:5,2。date:8,2。logsetRQdate:0,4date:5,2setSQLWJD:mptmsudataDNLTBDIR123。sqlsetSQLJLD:mptmsudataDNLTBDIRsqljl。sqlREMsqlplussyptmsyptmsmptmsuSQLWJforftokens1delims;iin(SQLWJ)do(settmpsqligotoaa):aaechoinsertintoDNLSQLJL(ID,TABLES,CZLX,SQLML,SQL,TIME)values(3,2,1,D:mptmsudataDNLTBDIRRQ123。sql,tmpsql,SYSDATE);SQLJLechocommit;SQLJLechoexit;SQLJLsqlplussyptmsyptmsmptmsuD:mptmsudataDNLTBDIRsqljl。sqldelfqD:mptmsudataDNLTBDIRsqljl。sqlIFNOTEXISTD:mptmsudataDNLTBDIRRQmdD:mptmsudataDNLTBDIRRQmoveYSQLWJD:mptmsudataDNLTBDIRRQ