数据库表同步的三种⽅法
1、前⾔:
最近项⽬准备上线,要先做⼀下并⾏,所以要把调⽤接⼝的请求 请求到⽣产环境的同时也请求到并⾏环境。我刚开始,写了⼀个程序,多线程去⽣产数据库(接⼝有记录表,记录请求报⽂)取到请求报⽂,然后再拼接成curl请求命令,请求到并⾏环境,结果跑了没半天就差点⼉把⽣产数据库搞挂。原因是,我的程序每五分钟调⽤⼀次,调⽤会获取11个数据库连接,结果因为⽣产上数据量⼤,五分钟没有处理完成,另⼀个调度就调起来了,这样⼀下午累积下来,产⽣了上百个连接,⽣成cpu飙到了%90以上,触发了告警,领导收到了告警短信才发现了问题。
之后应领导要求,我的并⾏程序不能直接连接⽣产库,需要异步处理(需要数据库做中转),那么就涉及到⼀个如何获取⽣产数据库中的报⽂数据的问题。通过上⽹查询,⼤体有三个⽅案:
生活的点点滴滴1.1 使⽤触发器
在接⼝报⽂记录表上添加⼀个触发器,每次请求的报⽂插⼊⽣产记录表的同时触发器插⼊到中转数据库。
优点:编程简单,只需要⼏⾏
缺点:会影响⽣产数据库性能,同时该触发器需要配合dblink,可能存在潜在危险。
-- ⼀个简单的oracle触发器
青岛极地海洋世界门票CREATE OR REPLACE TRIGGER MY_TGR
BEFORE INSERT ON jd.ims_json_soap_1_0
FOR EACH ROW--对表的每⼀⾏触发器执⾏⼀次,插⼊test_b的同时插⼊test_a
BEGIN
insert into cd.ims_json_soap_1_0(name,age,school,home,ext)values(:NEW.name,:NEW.age,:NEW.school,:NEW.home,:);
END;
1.2 使⽤canal
canal是阿⾥巴巴提供的⼀个开源⼯具,通过监听数据库binlog⽇志,解析出语句,然后执⾏,该程序对于mysql很友好,但是oracle(归档⽇志)貌似⽀持部分.太新的版本应该还不⽀持,这个还没有尝
试。
1.3 使⽤kettle
kettle是⼀款国外的开源ETL⼯具,使⽤的时候只需要下载解压就可以使⽤,数据抽取速度可以达到每秒上万条数据的同步。
王珞丹演的电影2、kettle的使⽤
排放污染物申报登记统计表2.1 下载安装kettle
意思的拼音我这⾥使⽤的是pdi-ce-7.1.0.0-12
2.2 表同步⽣成ktr⽂件
因为⽣产数据是实时有调⽤记录插⼊的,所以我的同步⽅案是增量同步。通过⽬标表的最新时间到⽣产源表⾥⾯获取最新的记录
2.2.1 最终转换效果
2.2.2 MaxDate
获取⽬标表(中转数据库中的表)最⼤时间做为⼀个表输⼊。
有功功率和无功功率2.2.3 常规(⽣产数据库)
注意下⾯的从步骤插⼊数据,sql语句中的问号会在执⾏的时候替换为下⾯的MaxData(该名字需要和
上⼀步中的步骤名称保持⼀致)
2.2.4 表输出
这⾥其实还可以使⽤ 插⼊/更新 但是这种⽅式相对慢⼀些,但是更灵活,可以⾃定义同步的字段,由于我这⾥表结构都是相同的,所以我采⽤表输出的⽅式,这样的效率更⾼。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论