orcale增量全量实时同步mysql可支持多库使用Kettle实现数据实时增量同步
1. 时间戳增量回滚同步
假定在源数据表中有一个字段会记录数据的新增或修改时间,可以通过它对数据在时间维度上进行排序。通过中间表记录每次更新的时间戳,在下一个同步周期时,通过这个时间戳同步该时间戳以后的增量数据。这是时间戳增量同步。
但是时间戳增量同步不能对源数据库中历史数据的删除操作进行同步,我就使用orcale物化视图的方式进行删除更新操作
说明:
- 源数据表 需要被同步的数据表
- 目标数据表 同步至的数据表
- 中间表 存储时间戳的表
2. 前期准备
在两个数据库中分别创建数据表,并通过脚本在源数据表中插入500万条数据,完成后再以每秒一条的速度插入新数据,模拟生产环境。
源数据表结构如下:
CREATE TABLE "OIM"."YG_TQ_FD_BASICINFO"
( "ID" NUMBER(10,0) NOT NULL ENABLE,
"DECLAREDATE" VARCHAR2(16),
"UPDATEDATE" VARCHAR2(16),
"SECODE" VARCHAR2(40) NOT NULL ENABLE,
"FRONTSYMBOL" VARCHAR2(40),
"BACKSYMBOL" VARCHAR2(40),
"SYMBOLCOMP" VARCHAR2(40),
"SNAMECOMP" VARCHAR2(100),
"ENABLED" VARCHAR2(20) NOT NULL ENABLE,
"FDSNAME" VARCHAR2(100) NOT NULL ENABLE,
"FDTYPE" VARCHAR2(100),
"FDNAME" VARCHAR2(200),
"FDTOTUNIT" NUMBER(16,4),
"FDNATURE" VARCHAR2(40),
"INVESTSTYLE" VARCHAR2(40),
"INVESTGOAL" CLOB,
"INVRULE" CLOB,
"FDSTYLE" VARCHAR2(20),
"FOUNDDATE" VARCHAR2(16),
"LISTDATE" VARCHAR2(16),
"ENDDATE" VARCHAR2(16),
"KEEPERCODE" VARCHAR2(16),
"KEEPERNAME" VARCHAR2(200),
"TRUSTEECODE" VARCHAR2(16),
"TRUSTEENAME" VARCHAR2(200),
"MANAGERNAME" VARCHAR2(400),
"DECISIONRULE" CLOB,
"DECISIONPROC" CLOB,
"DISTRIBUTPRIN" CLOB,
"INVESTRANGE" CLOB,
"INVESTPOLICY" CLOB,
"INVESTSTD" CLOB,
"RISKTYPE" CLOB,
"RISKINDEX" CLOB,
"FDINTRO" CLOB,
"FDEVOLUTION" CLOB,
"DISCLOSUREPEOPLE" VARCHAR2(60),
"DISCLOSUREPHONE" VARCHAR2(100),
"EXISTBEGDATE" VARCHAR2(16),
"EXISTENDDATE" VARCHAR2(16),
"PRIEXISTENDDATE" VARCHAR2(16),
"EXSITPERIOD" NUMBER(16,2),
"EXCHANGE" VARCHAR2(20) NOT NULL ENABLE,
"FDSERIESCODE" VARCHAR2(12),
"FDSERIESNAME" VARCHAR2(200),
"TRASTYPE" VARCHAR2(20),
"EMONOVERDATE" VARCHAR2(20),
"SUBCONFDATE" VARCHAR2(20),
"REDCONFDATE" VARCHAR2(20),
"REDPAYDATE" VARCHAR2(20),
"OUTSUBBEGDATE" VARCHAR2(16),
"OUTSUBENDDATE" VARCHAR2(16),
"INSUBBEGDATE" VARCHAR2(16),
"INREDENDDATE" VARCHAR2(16),
"FDINVCATEGORY" VARCHAR2(20),
"FDMETHOD" VARCHAR2(20) NOT NULL ENABLE,
"MEMO" CLOB,
"TOTSHARE" NUMBER(18,6),
"ISSHARESTAT" NUMBER(10,0) NOT NULL ENABLE,
"ISSTAT" NUMBER(10,0) NOT NULL ENABLE,
"ISVALID" NUMBER(10,0) NOT NULL ENABLE,
"TMSTAMP" RAW(8) NOT NULL ENABLE,
"ENTRYDATE" DATE,
"ENTRYTIME" VARCHAR2(16),
"TRADPLACE" VARCHAR2(20),
"SECURITYID" VARCHAR2(40) NOT NULL ENABLE,
"NAVPUBTYPE" VARCHAR2(20),
"PROFITPAYTYPE" VARCHAR2(20),
"OPERATEPERIOD" NUMBER(10,0),
"OPERATEPERIODUNIT" VARCHAR2(20),
"FSYMBOL" VARCHAR2(40) NOT NULL ENABLE,
"KEEPERSNAME" VARCHAR2(100) NOT NULL ENABLE,
"KEEPERINITIALS" VARCHAR2(20) NOT NULL ENABLE,
"LIQUBEGINDATE" VARCHAR2(16),
"LIQUENDDATE" VARCHAR2(16),
"CREDITLINEID" NUMBER(10,0),
CONSTRAINT "PK_YG_TQ_FD_BASICINFO" PRIMARY KEY ("ID")
USING INDEX PCTFREE 10 INITRANS 2 MAXTRANS 255 COMPUTE STATISTICS
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "OIMTS" ENABLE
) SEGMENT CREATION IMMEDIATE
PCTFREE 10 PCTUSED 40 INITRANS 1 MAXTRANS 255
NOCOMPRESS LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT)
TABLESPACE "OIMTS"
LOB ("INVESTGOAL") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("INVRULE") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("DECISIONRULE") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("DECISIONPROC") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("DISTRIBUTPRIN") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("INVESTRANGE") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("INVESTPOLICY") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("INVESTSTD") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("RISKTYPE") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("RISKINDEX") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("FDINTRO") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("FDEVOLUTION") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
LOB ("MEMO") STORE AS BASICFILE (
TABLESPACE "OIMTS" ENABLE STORAGE IN ROW CHUNK 8192 RETENTION
NOCACHE LOGGING
STORAGE(INITIAL 65536 NEXT 1048576 MINEXTENTS 1 MAXEXTENTS 2147483645
PCTINCREASE 0 FREELISTS 1 FREELIST GROUPS 1
BUFFER_POOL DEFAULT FLASH_CACHE DEFAULT CELL_FLASH_CACHE DEFAULT))
3. 作业流程
- 开始组件
- 建时间戳中间表
- 获取中间表的时间戳,并设置为全局变量
- 抽取两个数据表的时间戳及时间戳以后的数据进行比对,并根据比对结果进行删除、新增或修改操作
- 删除物化视图中的需要删除的数据
- 更新时间戳
4. 创建作业
作业的最终截图如下:
4.1 创建作业和DB连接
打开Spoon工具,新建作业,然后在左侧主对象树DB连接中新建DB连接。创建连接并测试通过后可以在左侧DB连接下右键共享出来。因为在单个作业或者转换中新建的DB连接都是局域数据源,在其他转换和作业中是不能使用的,即使属于同一个作业下的不同转换,所以需要把他们共享,这样DB连接就会成为全局数据源,不用多次编辑。
4.2 建时间戳中间表
这一步是为了在目标数据库建中间表ETL_POSITION,并插入初始的时间戳字段。因为该作业在生产环境是循环调用的,该步骤在每一个同步周期中都会调用,所以在建表时需要判断该表是否已经存在,如果不存在才建表。
SQL代码和组件配置截图如下:
create table ${SCHEMA_NAME}.ETL_POSITION
(
table_name VARCHAR2(100),
last_position_time TIMESTAMP(6),
last_position number(30),
progress_history VARCHAR2(200),
current_progress VARCHAR2(30),
target_url VARCHAR2(400),
target_table_name VARCHAR2(100),
schema_name VARCHAR2(100)
);
-- Add comments to the table
comment on table ${SCHEMA_NAME}.ETL_POSITION
is 'ETL事件唯一标示';
-- Add comments to the columns
comment on column ${SCHEMA_NAME}.ETL_POSITION.table_name
is '表的名称';
comment on column ${SCHEMA_NAME}.ETL_POSITION.last_position_time
is '最后一次同步的日期';
comment on column ${SCHEMA_NAME}.ETL_POSITION.last_position_time
is '最后一次同步的位置ID';
comment on column ${SCHEMA_NAME}.ETL_POSITION.progress_history
is ' UNKNOW, MARK, FULLING, INCING, CLEAR, FAILED, SUCCESS;';
comment on column ${SCHEMA_NAME}.ETL_POSITION.current_progress
is '当前状态';
comment on column ${SCHEMA_NAME}.ETL_POSITION.target_url
is '目标表的URL(为了多数据源复制)';
comment on column ${SCHEMA_NAME}.ETL_POSITION.target_table_name
is '目标表表名(为了多数据源复制)';
comment on column ${SCHEMA_NAME}.ETL_POSITION.schema_name
is '表所在空间';
-- Create/Recreate indexes
create unique index ${SCHEMA_NAME}.ETL_POWEIYI on ${SCHEMA_NAME}.ETL_POSITION (TABLE_NAME, SCHEMA_NAME, TARGET_URL,TARGET_TABLE_NAME);
-- 判断是否有事件表
select * from all_tables where TABLE_NAME = 'ETL_POSITION' AND OWNER='${SCHEMA_NAME}'
创建物化视图
CREATE MATERIALIZED VIEW LOG ON ${SCHEMA_NAME}.${TABLE_NAME} with primary key, sequence;
判断是否有物化视图
select * from all_mview_logs where master = '${TABLE_NAME}' and log_owner = '${SCHEMA_NAME}'
在作业中设置变量
具体看代码吧
orcale增量全量实时同步mysql可支持多库使用Kettle实现数据实时增量同步的更多相关文章
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包【转】
引文:我们公司是做自己使用产品,迭代更新周期短,每次都花费较多时间和精力打包做增量更新,发现了一篇文章用于 自动构建svn增量/全量 系统程序升级包,收藏之,希望可以通过学习,更加简化我们的工作. 文 ...
- solr-DIH:dataimport增量全量创建索引
索引创建完毕,就要考虑怎么定时的去重建, 除了写solrj,可以定时调用下面两条url进行增量或者全量创建索引 全量:http://ip:port/webapp_name/core_name/da ...
- 利用ant脚本 自动构建svn增量/全量 系统程序升级包
首先请允许我这样说,作为开发或测试,你一定要具备这种 本领.你可以手动打包.部署你的工程,但这不是最好的方法.最好的方式就是全自动化的方式.开发人员提交了代码后,可以自动构建.打包.部署到测试环境. ...
- HBase备份还原OpenTSDB数据之Export/Import(增量+全量)
前言 本文基于伪分布式搭建 hadoop+zookeeper+hbase+opentsdb之后,文章链接:https://www.cnblogs.com/yybrhr/p/11128149.html, ...
- 增量+全量备份SVN服务器
#!/bin/bash # 获取当前是星期几 DAY=$(date +%w) # 获取当前的日期 DATE=$(date '+%Y-%m-%d-%H-%M') # 获取当前版本库中最新的版本 CURR ...
- RDS备份到OSS增量+全量
一.前言 阿里云的RDS备份是占用使用量的,你购买200G那备份使用量是100G左右,导致备份一般也就存半个月,2个全备份. 那半个月后之前的也就删除了,如果要持续保留更久将花费不少的金钱.所以这里用 ...
- Linux 网站文件和数据库全量备份 一键脚本(支持FTP,Google Drive)
原文连接: https://teddysun.com/469.html 此文为转载,建议查看秋水大神的原文,排版更容易查看,另外,建议查看脚本源码,方便了解脚本运行过程, 脚本已测试,大神的脚本一如既 ...
- Mysql备份系列(3)--innobackupex备份mysql大数据(全量+增量)操作记录
在日常的linux运维工作中,大数据量备份与还原,始终是个难点.关于mysql的备份和恢复,比较传统的是用mysqldump工具,今天这里推荐另一个备份工具innobackupex.innobacku ...
- 【MySQL】全量+增量的备份/恢复
生产环境中,有时需要做MySQL的备份和恢复工作.因MySQL是在运行过程中的,做全量备份需要时间,全量备份完成后又有数据变动,此时需要增量备份辅助.如果想恢复数据到一个空库(例如数据迁移或者上云等更 ...
随机推荐
- RSA 算法-MSDN文档
RSA 算法 若要生成密钥对,可以从创建名为 p 和 q 的两个大的质数开始. 这两个数相乘,结果称为 n. 因为 p 和 q 都是质数,所以 n 的全部因数为 1. p. q 和 n. 如果仅考虑小 ...
- vsftpd配置文件丢失
deeplinux 卸载vsftpd重装,配置文件/etc/vsftpd.conf不能自动安装,解决办法如下: apt-get remove vsftpd --purge apt-get instal ...
- 在mac电脑上写入文件到NTFS格式的移动硬盘的解决办法
需求背景: 今天我在Mac电脑A上下载了11G的资料,想传给Mac电脑B,试用了AirPort.文件共享.远程操作等,传输速度都慢得要死,虽然是在同一个局域网下,两台电脑挨的非常的近,但是还是传得超级 ...
- iOS--崩溃日志的格式化分析---格式化crash日志
工作中难免或碰到crash,如果是开发环境,碰到简单的crash还能重现下,如果不能重现的话,我们只能去分crash文件了. 首先看下面的crash问题,说句实话一看这个我是拒绝的,这怎么找原因啊,头 ...
- REST构架风格介绍:状态表述转移(转)
本文总结了一些REST风格构架设计的经验,介绍了REST架构的语言生态环境,状态表述转移,无状态服务器等特点,并通过举例Google来说明REST风格的味道. REST(Representationa ...
- 关于BETA、RC、ALPHA、Release、GA等版本号的意义
关于BETA.RC.ALPHA.Release.GA等版本号的意义 转载 2016年06月19日 00:04:00 2049 0 1 . 最近由于工作需要经常要去SVN上拉开源项目的源码,对项目 ...
- Jquery仿IGoogle实现可拖动窗口(源码)
google可谓是ajax的特效用的淋漓尽致,google suggest, google map,igoogle 可拖动窗口等等...今天仿照iGoogle做了一个简单的小demo. 这个的demo ...
- selenium测试(Java)-- 一组元素操作(十一)
利用下面的例子来编写测试脚本 页面代码: <!DOCTYPE html> <html> <head> <meta http-equiv="conte ...
- 测试x264编码器的低延时编码和非延时编码
最近在学x264的编码,经过大量的测试,编码1080P的视频,编码10000帧数据. 在设置为低延时编码的时候: 编码线程0,一帧耗时:7.000000 ms.编码线程0,一帧耗时:8.000000 ...
- MJRefresh原理分析
MJRefresh是流行的下拉刷新控件.前段时间为了修复一个BUG.读了它的源代码.本文总结一下实现的原理 下拉刷新的基本原理 大部分的下拉刷新控件.都是用contentInset实现的.默认情况下. ...