多设备同步表数据_自己写的跨数据库的表同步工具

博主分享了一款用Java编写的数据库同步工具,旨在解决数据采集过程繁琐、脚本复用性低的问题。该工具支持跨数据库的数据和表结构同步,具备增量更新、日志记录等功能,并可与调度工具结合使用。文章提到,虽然Java在百万级别数据抽取上速度稍快,但开发成本较高,相比之下Python更为节省时间。项目已投入生产,有兴趣的读者可获取源码并参与贡献。
摘要由CSDN通过智能技术生成

阅读本文大概需要 3.6 分钟。

近期在做数据集市,遇到的痛点如下:

1、数据采集过程繁琐,重复的脚本编写太多。从不同的数据库抽取数据,需要为不同的数据库写卸数脚本,再传输到数据集市文件服务器,再入库,每一环节都需要调度。

2、不同的数据库写不同的 shell 脚本,没法复用,开发效率低。

于是我写了这个数据库同步工具,如果你是做数据仓库或数据集市的,可能对你有所帮助。

为什么我使用 Java 不使用 Python,因为服务器都已经有了 Java,但没有 Python,安装 Python 需要编译,就需要 root 权限,这就需要运维帮忙,还需要有正当的理由,想想太麻烦就使用 Java 吧。我想说的是,百万级别的数据抽取,Java 虽然快了几秒,但写 Java 耗费了我不少业余时间,Python 开发肯定更节省自己的时间。

你也许会说 Python 也有免安装的版本,是的,虽然解决了 Python 解释器的编译安装问题,但部分三方库仍然需要编译,这就可能遇到缺失 so 文件,dll 文件,在没有网络的环境下,十分麻烦。有网络的情况下,这都不是问题,Python 依然是我最常用的编程语言。 

程序介绍

java 程序编写,真正跨平台。本程序的最大用处就是构建集市或数仓所需要的基础层数据源。

简单的传入一定的参数,即可跨数据库实现以下功能:

  1. 两个表之间数据的同步,可以增量或全量更新。

  2. 两个表表结构的同步,包括自动建表,原表扩字段长度或增加字段,目标表也做相同动作。

  3. 支持指定原表或目标表的字段序列,更灵活。默认按目标表的字段序列查询原表的字段序列。

  4. 支持视图到表的数据抽取。

  5. 日志记录、插入记录数统计、耗时统计。

结合调度工具,您可以轻松搭建一个数据仓库或集市。

目前项目已经投入生产使用 ,欢迎感兴趣的朋友一起加入。

程序的使用方法

数据库的信息写在配置文件中,计划支持各种主流关系型数据库,如 MysqL、Db2、Oracle、PostgreSQL。

程序运行前确保已安装 java 1.8 或后续版本,已经安装 maven,如果没有请安装一下,网上到处都是安装教程。然后 clone 源码,打包:
git clone https://gitee.com/somenzz/database-sync.gitcd database-sync
mvn packagecd target
java -jar database-sync-1.1.jar
程序名称叫 database-sync,运行方式是这样的:
(py37env) ➜  target git:(master) ✗ java -jar database-sync-1.1.jar
Usage:
java -jar database-sync-1.0.jar [options] {fromDB} {fromSchema} {fromTable} {toDB} {toSchema} {toTable} [whereClause]
options:
        --version or -v  :print version then exit
        --help or -h     :print help info then exit
        --simple or -s   :use insert into table A select * from B mode, ignore table's structure
        --from_fields={col1,col2} or -ff={col3,col4}   :specify from fields
        --to_fields={col1,col2} or -tf={col3,col4}   :specify to fields
帮助说明:[] 中括号里的内容表示选填,例如 [options] 表示 options 下的参数不是必须的。1、其中 options 参数解释如下: --simple 或者 -s : 简单模式,此时只进行数据传输,不进行表构的同步。 --from_fields=col1,col2 或者 -ff=col1,col2 : 指定原表的字段序列,注意 = 前后不能有空格。 --to_fields=col3,col4 或者 -tf=col3,col4 : 指定目标表的字段序列,注意 = 前后不能有空格。2、whereClause 表示 where 条件,用于增量更新,程序再插入数据前先按照 where 条件进行清理数据,然后按照 where 条件从原表进行读取数据。whereClause 最好使用双引号包起来,表示一个完整的参数。如:"jyrq='2020-12-31'"{} 大括号里的内容表示必填。 fromDb 是指配置在 config.json 的数据库信息,假如有以下配置文件:
{"postgres":{"type":"postgres","driver":"org.postgresql.Driver","url":"jdbc:postgresql://localhost:5432/apidb","user": "postgres","password":"aaron"
    },"aarondb":{"type":"mysql","driver":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://localhost:3306/aarondb?useSSL=false&characterEncoding=utf8&serverTimezone=UTC","user": "aaron","password":"aaron"
    }
}
则 fromDb、toDb 可以是 aarondb 或者 postgres。
  • fromSchema 读取数据的表的模式名,可以填写 "".

  • fromTable 读取数据的表明,必须提供。

  • toSchema 写入数据表的模式名,可以填写 "",可以和 fromSchema 不同.

  • toTable 写入数据表的表名,必须提供,当写入表不存在时,自动按读取表的表结构创建,可以和 fromTable 不同。

配置文件说明

配置文件位于 config/config.json,如下所示:
{"sjwb":{"type":"db2","driver":"com.ibm.db2.jcc.DB2Driver","url":"jdbc:db2://192.168.1.*:50000/wbsj","user": "****","password":"****","encoding":"utf-8"
    },"dw_test":{"type":"db2","driver":"com.ibm.db2.jcc.DB2Driver","url":"jdbc:db2://192.168.169.*:60990/dwdb","user": "****","password":"****","encoding":"gbk"
    },"postgres":{"type":"postgres","driver":"org.postgresql.Driver","url":"jdbc:postgresql://10.99.**.**:5432/apidb","user": "****","password":"****","encoding":"utf-8"
    },"aarondb":{"type":"mysql","driver":"com.mysql.cj.jdbc.Driver","url":"jdbc:mysql://localhost:3306/aarondb?useSSL=false&characterEncoding=utf8&serverTimezone=UTC","user": "****","password":"****","encoding":"utf-8"
    },"buffer-rows": 100000
}
配置文件说明: buffer-rows 表示读取多少行时一块写入目标数据库,根据服务器内存大小自己做调整,100000 行提交一次满足大多数情况了。 encoding 用于表结构同步,相同的字段,utf-8 库的字符串长度应该是 gbk 库字符串长度的 2 倍,这样才可以解决字符串含有中文的问题,为什么是 2 倍?为了字符串的长度不会出现小数位。

编写目的

提高数据库间表的同步效率,如果是轻加工,就丢掉低效的 datastage 和 kettle 吧。

获取源代码

关注「Python七号」后台回复「同步」获取源码。

92da4694ba737aea1bc09d7accfcfff5.png

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值