关于数据库数据同步的问题

今天遇到一个要求,需要将数据库间的数据同步,之前没有弄过,百度了一下,知道了可以用DBLink,然后新建好了一个DBLink,然后就是编写一个定时任务调用同步语句,

定时任务比较简单,关键是存储过程比较繁琐,于是百度了一下数据库同步的便捷方法,了解了可以用oracle数据库可以marge语句,十分便利,so,花了十分钟写好了同步的

存储过程,然后对这个同步语句进行一定的优化,根据一个数据库的最新的时间节点与另一个数据库最晚的时间节点进行判断与是否要更新,编写一个博文,以做总结和记录,

后期有遇到或想了解的可以在留言,语句比较简单,就是根据表的主键进行判断,有则插入,无则添加,下面就是语句内容

CREATE OR REPLACE PROCEDURE PROCEDURE1 AS
BEGIN
  --单位PAK_GCCOMP
merge into  PAK_GCCOMP b using (select * from pak_gccomp@scjg where row_addtime>(select row_addtime from(select * from (select * from
pak_gccomp order by row_addtime desc) where rownum=1))) c on (b.PCOMP_ID=c.PCOMP_ID)
when matched then
update set b.COMP_ID=c.COMP_ID, b.COMP_NAME=c.COMP_NAME,b.COMP_ZZXL=c.COMP_ZZXL,b.COMP_ZZXL_NAME=c.COMP_ZZXL_NAME,b.COMP_LXR=c.COMP_LXR,b.COMP_LXR_PHONE =c.COMP_LXR_PHONE,b.COMP_FZR=c.COMP_FZR,b.COMP_FZR_PHONE=c.COMP_FZR_PHONE,b.COMP_LWFZR =c.COMP_LWFZR,
      b.COMP_LWFZR_PHONE=c.COMP_LWFZR_PHONE, b.GC_ID=c.GC_ID,b.GC_CONTENT=c.GC_CONTENT,b.ROW_ADDUSERID=c.ROW_ADDUSERID,b.ROW_ADDUSER=c.ROW_ADDUSER,b.ROW_ADDTIME =c.ROW_ADDTIME,b.IS_USERD=c.IS_USERD,b.BACC_ID=c.BACC_ID,b.PCOMP_ID_B =c.PCOMP_ID_B
when not matched then
insert values (c.pcomp_id,c.COMP_ID, c.COMP_NAME,c.COMP_ZZXL,c.COMP_ZZXL_NAME,c.COMP_LXR,c.COMP_LXR_PHONE,c.COMP_FZR,c.COMP_FZR_PHONE,c.COMP_LWFZR,
        c.COMP_LWFZR_PHONE, c.GC_ID,c.GC_CONTENT,c.ROW_ADDUSERID,c.ROW_ADDUSER,c.ROW_ADDTIME,c.IS_USERD,c.BACC_ID,c.PCOMP_ID_B);
commit;

--班组PAK_GROUP
merge into  PAK_GROUP b using (select * from PAK_GROUP@scjg where row_addtime>(select row_addtime from(select * from (select * from
PAK_GROUP order by row_addtime desc) where rownum=1))) c on (b.GROUP_ID=c.GROUP_ID)
when matched then
update set b.GROUP_NAME=c.GROUP_NAME,b.ROW_ADDUSER=c.ROW_ADDUSER, b.ROW_ADDUSERID=c.ROW_ADDUSERID,b.ROW_ADDTIME=c.ROW_ADDTIME,b.GC_ID=c.GC_ID,b.PERSION_ID=c.PERSION_ID, b.PCOMP_ID=c.PCOMP_ID,b.PERSION_WORKTYPE=c.PERSION_WORKTYPE
when not matched then
insert values (c.GROUP_ID, c.GROUP_NAME,c.ROW_ADDUSER,c.ROW_ADDUSERID,c.ROW_ADDTIME,c.GC_ID,c.PERSION_ID, c.PCOMP_ID,c.PERSION_WORKTYPE);
commit;

--进出场PAK_LWGX
merge into  PAK_LWGX b using (select * from PAK_LWGX@scjg where row_addtime>(select row_addtime from(select * from (select * from
PAK_LWGX order by row_addtime desc) where rownum=1))) c on (b.LWGX_ID=c.LWGX_ID)
when matched then
update set b.LWGX_NO=c.LWGX_NO,b.LWGX_STIME=c.LWGX_STIME, b.LWGX_ETIME=c.LWGX_ETIME,b.LWGX_PAYMETHOD=c.LWGX_PAYMETHOD,b.ROW_ADDUSER=c.ROW_ADDUSER,b.ROW_ADDUSERID=c.ROW_ADDUSERID, b.ROW_ADDTIME=c.ROW_ADDTIME,b.PERSION_ID=c.PERSION_ID,b.COMP_ID=c.COMP_ID,b.GROUP_ID=c.GROUP_ID,b.GC_ID=c.GC_ID
when not matched then
insert values (c.LWGX_ID,c.LWGX_NO,c.LWGX_STIME,c.LWGX_ETIME,c.LWGX_PAYMETHOD,c.ROW_ADDUSER,c.ROW_ADDUSERID,c.ROW_ADDTIME,c.PERSION_ID,c.COMP_ID,c.GROUP_ID,c.GC_ID);
commit;

--人员PAK_PERSION
merge into  PAK_PERSION b using (select * from PAK_PERSION@scjg where row_addtime>(select row_addtime from(select * from (select * from
PAK_PERSION order by row_addtime desc) where rownum=1))) c on (b.PERSION_ID=c.PERSION_ID)
when matched then  --b.PERSION_ID=c.PERSION_ID,
update set b.PERSION_NAME=c.PERSION_NAME,b.PERSION_TEL=c.PERSION_TEL,b.PERSION_CODE=c.PERSION_CODE,b.PERSION_BIRTHDAY=c.PERSION_BIRTHDAY,b.PERSION_SEX=c.PERSION_SEX,b.PERSION_NATION=c.PERSION_NATION, b.PERSION_ADDR=c.PERSION_ADDR,b.ROW_ADDUSER=c.ROW_ADDUSER,b.ROW_ADDUSERID=c.ROW_ADDUSERID,b.ROW_ADDTIME=c.ROW_ADDTIME,b.PERSION_IMGURL=c.PERSION_IMGURL,b.PERSION_PHONE=c.PERSION_PHONE
when not matched then
insert values (c.PERSION_ID,c.PERSION_NAME,c.PERSION_TEL,c.PERSION_CODE,c.PERSION_BIRTHDAY,c.PERSION_SEX,c.PERSION_NATION,c.PERSION_ADDR,c.ROW_ADDUSER,c.ROW_ADDUSERID,c.ROW_ADDTIME,c.PERSION_IMGURL,c.PERSION_PHONE);
commit;    

--考勤表PAK_ATTENDANCE
merge into  PAK_ATTENDANCE b using PAK_ATTENDANCE@scjg c on (b.id=c.id)
when matched then
update set b.idcardnum=c.idcardnum,b.createtime=c.createtime, b.name=c.name,b.serialnumber=c.serialnumber,b.importtype=c.importtype,b.bacc_id=c.bacc_id, b.workplace=c.workplace
when not matched then
insert values (c.id, c.idcardnum, c.createtime, c.name,c.serialnumber,c.importtype,c.bacc_id, c.workplace);
commit;  

--企业端用户信息SF_AUTH_APPUSER
merge into  SF_AUTH_APPUSER@scjg b using (select * from SF_AUTH_APPUSER where row_addtime>(select row_addtime from(select * from (select * from
SF_AUTH_APPUSER@scjg order by row_addtime desc) where rownum=1))) c on (b.APPUSER_ID=c.APPUSER_ID)
when matched then
update set  b.APPUSER_LOGID=c.APPUSER_LOGID, b.APPUSER_NAME=c.APPUSER_NAME,b.APPUSER_ALIASNAME=c.APPUSER_ALIASNAME,b.APPUSER_DOMAIN=c.APPUSER_DOMAIN,b.APPUSER_DDEPT=c.APPUSER_DDEPT,b.APPUSER_MPHONE =c.APPUSER_MPHONE,b.APPUSER_EMAIL=c.APPUSER_EMAIL,b.APPUSER_LASTLOGIN=c.APPUSER_LASTLOGIN,b.APPUSER_ROOT=c.APPUSER_ROOT,b.APPUSER_PWD =c.APPUSER_PWD,
      b.APPUSER_CHANGEPWD=c.APPUSER_CHANGEPWD, b.APPUSER_CHANGEPWDDATE=c.APPUSER_CHANGEPWDDATE,b.APPUSER_LOGERROR=c.APPUSER_LOGERROR,b.APPUSER_TRYLOG=c.APPUSER_TRYLOG,b.APPUSER_BEGINDATE=c.APPUSER_BEGINDATE,b.APPUSER_OUTSERVICEDATE =c.APPUSER_OUTSERVICEDATE,b.APPUSER_GBID=c.APPUSER_GBID,b.APPUSER_DEFAULTPAGE=c.APPUSER_DEFAULTPAGE,
      b.APPUSER_INDEXPORTAL =c.APPUSER_INDEXPORTAL,b.APPUSER_RELATION=c.APPUSER_RELATION, b.VALID_FLAG=c.VALID_FLAG,b.ROW_ADDUSER=c.ROW_ADDUSER,b.ROW_ADDTIME=c.ROW_ADDTIME,b.ROW_ADDUSERID=c.ROW_ADDUSERID,b.DDEPT_ORDER =c.DDEPT_ORDER,b.ROW_EDITUSER=c.ROW_EDITUSER,b.ROW_EDITTIME=c.ROW_EDITTIME,b.ROW_EDITUSERID=c.ROW_EDITUSERID,
      b.ROW_STATUS=c.ROW_STATUS,b.APPUSER_ORDER=c.APPUSER_ORDER,b.GCUSER_STATUS=c.GCUSER_STATUS,b.IS_BJ=c.IS_BJ
when not matched then
insert values (c.APPUSER_ID,c.APPUSER_LOGID,c.APPUSER_NAME,c.APPUSER_ALIASNAME,c.APPUSER_DOMAIN,c.APPUSER_DDEPT,c.APPUSER_MPHONE,c.APPUSER_EMAIL,c.APPUSER_LASTLOGIN,c.APPUSER_ROOT,c.APPUSER_PWD,
      c.APPUSER_CHANGEPWD,c.APPUSER_CHANGEPWDDATE,c.APPUSER_LOGERROR,c.APPUSER_TRYLOG,c.APPUSER_BEGINDATE,c.APPUSER_OUTSERVICEDATE,c.APPUSER_GBID,c.APPUSER_DEFAULTPAGE,
      c.APPUSER_INDEXPORTAL,c.APPUSER_RELATION,c.VALID_FLAG,c.ROW_ADDUSER,c.ROW_ADDTIME,c.ROW_ADDUSERID,c.DDEPT_ORDER,c.ROW_EDITUSER,c.ROW_EDITTIME,c.ROW_EDITUSERID,
      c.ROW_STATUS,c.APPUSER_ORDER,c.GCUSER_STATUS,c.IS_BJ);
commit;

--PAK_BANK_ACCOUNT
merge into  PAK_BANK_ACCOUNT@scjg b using (select * from PAK_BANK_ACCOUNT where ADD_TIME>(select ADD_TIME from(select * from (select * from
PAK_BANK_ACCOUNT@scjg order by ADD_TIME desc) where rownum=1))) c on (b.bacc_id=c.bacc_id)
when matched then
update set b.BANK_BRANCHNAME=c.BANK_BRANCHNAME,b.BANK_ACCOUNT=c.BANK_ACCOUNT, b.BANK_MONEY=c.BANK_MONEY,b.BANK_ID=c.BANK_ID,b.APPUSER_LOGID=c.APPUSER_LOGID,b.IS_IMP=c.IS_IMP, b.LZZGY1_PHONE=c.LZZGY1_PHONE,b.LZZGY1_NAME=c.LZZGY1_NAME,b.STAFF_COMPFZR=c.STAFF_COMPFZR, b.STAFF_NAME=c.STAFF_NAME,b.STAFF_PHONE=c.STAFF_PHONE,b.YEZHU=c.YEZHU,b.PHONE_YEZHU=c.PHONE_YEZHU, b.STAFF_COMPFZRPHONE=c.STAFF_COMPFZRPHONE,
b.JS_COMP_NAME=c.JS_COMP_NAME,b.SG_COMP_NAME=c.SG_COMP_NAME,b.ADD_USER=c.ADD_USER,b.ADD_TIME=c.ADD_TIME,b.BACC_NAME=c.BACC_NAME,b.IS_BSJ=c.IS_BSJ,b.BANK_AREA=c.BANK_AREA,b.PROJECT_ID=c.PROJECT_ID,b.BANK_STATE=c.BANK_STATE,b.QXFLAG=c.QXFLAG
when not matched then
insert values (c.bacc_id,c.BANK_BRANCHNAME,c.BANK_ACCOUNT,c.BANK_MONEY,c.BANK_ID,c.APPUSER_LOGID,c.IS_IMP,c.LZZGY1_PHONE,c.LZZGY1_NAME,c.STAFF_COMPFZR,c.STAFF_NAME,c.STAFF_PHONE,c.YEZHU,c.PHONE_YEZHU,c.STAFF_COMPFZRPHONE,c.JS_COMP_NAME,c.SG_COMP_NAME,c.ADD_USER,c.ADD_TIME,c.BACC_NAME,c.IS_BSJ,c.BANK_AREA,c.PROJECT_ID,c.BANK_STATE,c.QXFLAG);
commit; 

--PAK_BANK_GC
merge into  PAK_BANK_GC@scjg b using PAK_BANK_GC c on (b.BGC_ID=c.BGC_ID)
when matched then
update set b.GC_ID=c.GC_ID,b.BACC_ID=c.BACC_ID
when not matched then
insert values (c.BGC_ID,c.GC_ID, c.BACC_ID);
commit; 

--PAK_ACCOUNT;
merge into  PAK_ACCOUNT b using (select * from PAK_ACCOUNT@scjg where row_addtime>(select row_addtime from(select * from (select * from
PAK_ACCOUNT order by row_addtime desc) where rownum=1))) c on (b.ACCOUNT_ID=c.ACCOUNT_ID)
when matched then
update set  b.GROUP_ID=c.GROUP_ID, b.PERSION_ID=c.PERSION_ID,b.ACCOUNT_NO=c.ACCOUNT_NO,b.ACCOUNT_MONTH=c.ACCOUNT_MONTH,b.ACCOUNT_DAYS=c.ACCOUNT_DAYS,b.SALARY_SUM =c.SALARY_SUM,b.SALARY_NUM=c.SALARY_NUM,b.ROW_ADDUSER=c.ROW_ADDUSER,b.ROW_ADDUSERID =c.ROW_ADDUSERID,
      b.ROW_ADDTIME=c.ROW_ADDTIME, b.FILE_ID=c.FILE_ID,b.GC_ID=c.GC_ID,b.TASK_CODE=c.TASK_CODE
when not matched then
insert values (c.ACCOUNT_ID,c.GROUP_ID, c.PERSION_ID,c.ACCOUNT_NO,c.ACCOUNT_MONTH,c.ACCOUNT_DAYS,c.SALARY_SUM,c.SALARY_NUM,c.ROW_ADDUSER,c.ROW_ADDUSERID,
      c.ROW_ADDTIME, c.FILE_ID,c.GC_ID,c.TASK_CODE);
commit;

--PAK_PERSION_BANK
merge into  PAK_PERSION_BANK b using (select * from PAK_PERSION_BANK@scjg where row_addtime>(select row_addtime from(select * from (select * from
PAK_PERSION_BANK order by row_addtime desc) where rownum=1))) c on (b.BANK_ID=c.BANK_ID)
when matched then
update set  b.BANK_TYPE=c.BANK_TYPE, b.BANK_CODE=c.BANK_CODE,b.PERSION_ID=c.PERSION_ID,b.GC_ID=c.GC_ID,b.ROW_ADDTIME=c.ROW_ADDTIME
when not matched then
insert values (c.BANK_ID,c.BANK_TYPE, c.BANK_CODE,c.PERSION_ID,c.GC_ID,c.ROW_ADDTIME);
commit;

END PROCEDURE1;

ps。lz目前是一个刚入门小白,看见很多前辈大神有记录的好习惯,遂有意向见贤思齐,然后后期会坚持养成这个好习惯

2017.08.17

时间: 2024-10-29 04:10:58

关于数据库数据同步的问题的相关文章

[db2数据库数据同步解决方案]DB2数据库数据同步更新方法及设备与流程

技术总结 本发明实施例提供了DB2数据库数据同步更新方法及设备.所述方法包括:根据待同步更新表创建数据详细地址存储列,对待同步更新表上S锁,获取源端DB2数据库当前的日志序列号LSN作为待同步更新表的起始LSN,释放S锁:获取待同步更新表的结果集,将结果集发送至目标端数据库入库,获取源端DB2数据库当前LSN作为待同步更新表的结束LSN:接收源端同步更新服务发送的初始化数据,在目标端数据库将ROWID插入数据详细地址存储列,初始化待同步更新表的数据:启动数据实时同步更新服务,将源端DB2数据库的

Oracle数据库数据同步方案

一.比较原始的方案:触发器/Job/快照+dblink的方式,可实现同步和定时刷新: 二台不同的数据库服务器,从一台数据库服务器A的一个用户读取另一台数据库服务器B下某个用户的数据,可以通过dblink来完成. 二.通过物化视图定时刷新来实现数据同步.物化视图刷新方式有增量刷新和完全刷新两种模式: 三.高级复制,分为多主复制和物化视图复制两种模式.其中多主复制能进行双向同步复制和异步复制:物化视图用于单向复制,定时刷新,与第二条类似: 四.流复制,可实现实时和非实时同步: 五.GoldenGat

solr 简单搭建 数据库数据同步(待续)

原来在别的公司负责过文档检索模块的维护(意思就是不是俺开发的啦).所以就稍微接触和研究了下文档检索. 文档检索其实是全文检索,是通过一种技术把N多文档进行一定规律的切割归类,然后创建易于搜索的索引式文件,然后搜索具有某些规律的文档时,能够通过快速定位索引,然后根据索引提供的信息精确定位到文档从而实现迅速找到文档.这个文档一般成为条目. 上家公司的时候使用的是Lucene加上Zoie实现的.lucene是apache下的开源项目,不过并不是全文检索的实现,而是一个全文检索的引擎,是一个架构,是其他

Oracle Job定时任务详解、跨数据库数据同步

业务需求,需要与A公司做数据对接,我们公司用的Oracle,A公司用的SQL Server数据库,如何跨数据库建立连接呢?这里使用的是DBLink,不会配置的请看我的另外一篇博客:https://www.cnblogs.com/chenyanbin/p/11291752.html 如果做数据同步呢?上面我们已经通过DBLink与SQL Server建立连接了,那么我们就可以获取A公司表中的数据.在通过Oracle Job定时任务,具体JOB还有那些功能,这里不做详细介绍了,百度上一大堆,这里我们

关于不同软件间数据库数据同步的实现分析

目标:K3数据库中销售订单自动录入生产管理系统 方式:数据库触发器 过程: 1.导出分析K3数据库表结构,生产管理系统数据库表结构 2.制作K3前台项目--K3数据库中对应的列--生产管理系统数据库中对应的列--生产管理系统前台项目 3.了解K3的销售数据录入数据库的过程:订单表.订单详细表中数据插入时先后顺序 4.了解K3数据库可以直接向生产管理系统数据库传递哪些数据,间接传递那些数据(需从其他表取数据,需对数据进行分割.合并等) 5.触发器测试(从简单到复杂:旱冰鞋--滑板--自行车--电动

[db2数据库数据同步解决方案]db2数据库同步

db2look-dpayment-a-e-x-0cre_stp.sql db2-tvfcre_stp.sql db2look-i指定用户-w指定密码 2 db2move导出数据文件 db2moveexport db2move导出数据 db2moveimport truncatetable删除表中的所有行 要将数据倒入一个指定的schema的中需要修改 导入数据文件中的db2move.lst文件将里面的shema该改为需要导入数据的shema 3 导出一个指定schema的数据 db2moveoc

mysql 集群 数据同步

mysql集群配置在网站负载均衡中是必不可少的: 首先说下我个人准备的负载均衡方式: 1.通过nginx方向代理来将服务器压力分散到各个服务器上: 2.每个服务器中代码逻辑一样: 3.通过使用redis缓存来保存内存中数据,使用redis同步功能来同步不同服务器内存中的数据: 4.在通过mysql的集群配置来实现数据库数据同步: 这里我整理了几种数据同步方式: 一:主从服务器同步: 顾名思义:主服务器负责数据的增删改查,从服务器负责同步数据: 主服务器建立二进制文件:每产生语句变化或磁盘变化写入

Oracle 10g通过创建物化视图实现不同数据库间表级别的数据同步

摘自:http://blog.csdn.net/javaee_sunny/article/details/53439980 目录(?)[-] Oracle 10g 物化视图语法如下 实例演示 主要步骤 在A节点创建原表和物化视图日志 在B节点创建连接A节点的远程链接 在B节点处创建目标表和与目标表名称相同的物化视图 在B节点处刷新物化视图 升级采用存储过程定时任务JOB方式定时刷新物化视图 进一步优化 文章更新记录 参考文章 Oracle 10g 物化视图语法如下: create materia

【转】mysql数据库读写分离数据同步

转载请注明来源:mysql数据库读写分离数据同步 mysql数据库读写分离数据同步 我是用了两个xp(一个主的,一个从的)的系统测试成功的,linux系统我也做测试了,没有成功,不过我想我所遇到的问题是同一个问题,xp下的可以成功,linux下的应该也可以成功,稍候会测试,然后更新结果! PS:刚测试了下linux 可以同步成功,主服务器是xp,从服务器是centos,可以成功. 例: A机器 192.168.0.2 B机器 192.168.0.3 两个机器可以ping通,互相访问 先配置主服务