# dwh-soft **Repository Path**: iloveuever/dwh-soft ## Basic Information - **Project Name**: dwh-soft - **Description**: 用来存放dwh服务同步组件的程序包 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 20 - **Forks**: 5 - **Created**: 2024-02-15 - **Last Updated**: 2025-12-22 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # dwh-soft #### 介绍 用来存放dwh服务同步组件的程序包
这是一款基于 mysql 数据库迁移或实时同步到 postgresql 的中间服务组件(可断网执行,安全隔离,无需外网接入,免费绿色软件)
该程序主要用于解决 mysql/mariadb 同步到 PG\Mysql\greenplum\cloudBerryDb 等场景的用途,目的是把PG当成读库来操作,全程自动化,类似于读写分离的效果
![软件效果图](rjjs.png) #### 软件架构 使用java开发的二进制程序包,基于web应用程序架构。
无需连接外网,可断网模式运行,本机启动即可运行的web应用程序包
类似于阿里云的 dts 数据同步服务(腾讯、字节跳动都有类似服务),也可以用于 mysql 数据不停机服务线下、线上的迁移和实时同步,或海外机房同步等,可节约大量资金
架构补充
前端框架采用的是MIT协议的 [pearAdmin UI](https://gitee.com/pear-admin/Pear-Admin-Layui)
后端框架采用 [quarkus](https://gitee.com/mirrors/Quarkus) 框架 + 数据操作组件 [edb](https://github.com/MrYang-Jia/edb)
#### 安装教程 ##### 机器要求(1CPU + 100MB内存 极低要求即可使用!!!) 1cpu 100MB内存 即可启动 (建议一个任务预留50MB内存动态分配)
**亮点: 实践经验,我司线上生产单点服务,10分钟内同步最多的批量数据是 2千万以上数据量,10分钟内使用批处理的同步模式完成,无1缺失,多字段完美同步,内存仅仅消耗100MB以内,无内存泄漏
** ##### 绿色软件直接启动,无需任何配置和限制 windows ```properties # 下载 dwh-1.3.6-windows.zip 解压后,放到您指定的目录下启动即可 # 如果需要修改默认端口号,则需要通过 cmd 或 linux控制台指定端口号(Dquarkus.http.port) , 否则直接启动即可 # 默认端口访问地址: http://127.0.0.1:11306/dwh/login ./dwh-1.3.6.exe -Dquarkus.http.port=11306 ``` linux centos7(推荐) ```properties # 建议使用 centos7 或以上版本 # 下载 dwh-1.3.6-linux.zip 解压后,放到您指定的目录下启动即可 # 设置文件为可启动文件 chmod 777 ./dwh-1.3.6 # 使用screen后台模式 - 也可不需要,直接后台模式挂起非jobs模式也可保持持续运行 yum -y install screen # 启动一个窗口 screen -S dwh # 启动服务(无需后台挂起 ctrl+z ,然后后台模式 bg ,建议直接 【 nohup bg %1 & 】 或 移除jobs队列 【 disown %1 】) ./dwh-1.3.6 -Dquarkus.http.port=11306 # screen会话中:快捷键 ctrl+a+d ,退出会话,将会话切换到后台运行,这样子退出sshd控制台时,服务能正常运行,不影响服务的运行 # 打开登录页面 http://127.0.0.1:11306/dwh/login ``` ##### 登录页面地址 (端口号可改) 浏览器打开> http://127.0.0.1:11306/dwh/login
##### 初始账号密码 初始化admin账号密码(可修改): dwh/123456
#### 使用说明 软件请放心免费使用,至于使用年限限制,只是为了限制被人售卖的问题

首次使用时,输入初始化账号密码: dwh/123456 ,
然后打开【数据同步】-【任务管理】,点击【创建任务】创建迁移同步任务即可
第一次使用时,直接迁移测试用的小数据库,然后点击同步即可。
当然,如果您熟悉了这套软件,也可以直接用于生产迁移数据,但是建议是从有读写分离的负载库上迁移,减少数据库的影响
同时也支持,您自己手工指定对应的 binlog 日志节点,进行指定数据同步
[dwh mysql同步软件介绍](https://mp.weixin.qq.com/s?__biz=MjM5MTY2MjcxMQ==&mid=2247483659&idx=1&sn=d0a1b3a57d698b8f901646fad0bda89d&chksm=a6b3561391c4df05b74a71ffce1fbdd15f0dcb6dca9995e407c10d5e65667bf805051e539f79)
[软件使用讲解](https://www.bilibili.com/video/BV1zj421X7ni/)
[dwh同步软件使用教程-图文](https://mp.weixin.qq.com/s?__biz=MjM5MTY2MjcxMQ==&mid=2247483684&idx=1&sn=ea48be3562ac9369ce7abacd6de2263d&chksm=a6b3563c91c4df2a31f63c823bd4f40ad5ef3e627b6446230756843aa7983f8e518265d8de6d) #### 参与贡献 因为刚开始,所以短期内可能不会有太大变动的内容,有紧急诉求的伙伴,可以通过公众号单独在后台留下联系方式,我看到后会及时联系 [公众号](https://mp.weixin.qq.com/s?__biz=MjM5MTY2MjcxMQ==&mid=2247483659&idx=1&sn=d0a1b3a57d698b8f901646fad0bda89d&chksm=a6b3561391c4df05b74a71ffce1fbdd15f0dcb6dca9995e407c10d5e65667bf805051e539f79) #### 特技 mysql 无人值守全量全库自动同步到Postgresql数据库,实现异构数据库读库功能
mysql 实现数据迁移、同步到 mysql、mariadb、postgresql、greenplum、cloudBerryDb、kafka等数据存储点
一键增加Mysql常用兼容函数 if、ifnull、group_concat、find_in_set、sysdate()、date_format
ps: kafka 模块没有经过严格验证,后续我再完善下,其他模块都是经过了百分百的时间论证过的结果,总耗时5年左右完成的稳定异构数据库同步,目前这个版本是第三代版本,所以实际上还有很多同步模块的功能并没有实现,但是这个工具的价值就在于异构数据库的同步,有其他诉求的可以留言,有场景化了,才继续延申扩展
#### mysql 数据类型支持 ![img.png](img.png) #### greenplum / cloudBerryDb 特殊说明 由于 cloudBerryDb 是基于 greenplum 的一些基础版本规则构建的,所以两者可以认为是等同的分布式数据库,其中 cloudBerryDb 底层是PG14版本,优于GP6,测试性能比GP6高7倍以上
目前同步时,默认以 mysql 的主键表位主键进行分布式hash键值分布,如果同步时也同步索引,则自动构建基于主键的分布式索引
如果修改主键时,会自动构建新的分布式键,但是原索引会全部移除,因为所有的索引是依照主键去构建的,然后再重新迁移节点数据
如果是无主键的表,则会使用hash随机分布节点数据
特别说明,如果需要使用gis数据类型的,需要额外安装相关 postgis 库的插件,尤其是分布式数据库 cloudBerryDb 对应的库为 [cloudberrydb_gis](https://github.com/cloudberrydb/postgis) #### 若依系统怎么迁移到PG/greenplum/cloudBerryDb上? 具体信息可以参考当前目录底下的 【若依加速PG版文件/README.md】 #### 部分软件截图 > ##### 登录页(后续可能会移除时间限制) ![dly.png](dly.png) > ##### 首页 > ![sy-01.png](sy-01.png) ![sy_02.png](sy_02.png) > ##### 系统损耗监控 > ![sh_1.png](sh_1.png) > ##### 同步功能页 ![tby.png](tby.png) 2024-10-19 增加表单类型的配置页,方便用户快速配置同步任务
> ##### 导入功能页 ![dry.png](dry.png) ![drjg.png](drjg.png) > ##### 导入管理 ###### 导入时,极端情况下发生的异常界面显示如下 ![dry.png](drgl-01.png) ###### 正确处理导入异常的功能模块,快速对齐导入,避免停电、异常中断时如何快速处理问题的解决能力
【库表对齐】 -> 【重导所有未完成表】 ![dry.png](drgl-02.png) > ##### 同步功能属性项 ###### 主打一个省心、智能,自动将同类型数据迁移同步到第三方库 ``` 1、自动全库全表数据同步 2、可配置ETL同步信息覆盖自动功能 3、可过滤DDL操作功能 4、可过滤DML写入操作,例如过滤delete,持续保留历史数据 5、避免一些特殊原因导致数据丢失,例如更新失败时转数据插入,做数据补全 6、支持批量写入、更新、删除等操作 7、支持中断同步时自动提醒功能 8、pg11以上版本同步时,支持后台模式并行构建索引 9、支持库表字段小写转写功能,从而支持异库库表字段忽略大小写的查询能力 10、支持 binlog 或 gtid 两种同步方式,推荐 gtid 同步模式,适合运维管理和数据回放 11、支持数仓一键配置,便于线下仓库不断存储历史数据,不会因为线上间隔性回收数据或rename table导致数据断层 12、支持单线程IDEMPOTENT批量合并写入模式,海量数据平稳写入 ``` ![tbgn.png](tbgn.png) > ##### 一键数仓配置 ![sc01.png](sc01.png) > ##### 系统告警通知功能 ##### 支持 钉钉BOT、微信BOT、Http接口调用、阿里云短信、邮件通知等方式 ![tzgn.png](tzgn.png) > ##### 异常定位 ![ycdw.png](ycdw.png) > ##### 断网自动重连 ![ycdw.png](cqrz.png) 2024.10.19 断网自动重连功能,发现如果是io异常时,则会自动重连,间隔3分钟,如果有设置告警提醒,则会再每间隔5次则会发送一次告警信息进行推送
#### 可关注公众号私信 ![gzh.png](gzh.png) #### 重要补充说明,因为每次上传新的包,这个空间会越来越大,所以会不断删库,重新创建库然后上传版本包,避免大家下载的时候项目太大 #### 历史更新记录 2024-11-25
1、修正binlog包因为网络问题,可能导致的数据丢失问题,直接断开,重新同步即可
2、修正源表结构无法自定义添加的问题,因为某些情况下,同步断开很久,导致线上的表结构信息无法对上,需要手工维护映射,以便当前节点能正常同步
2024-11-30
1、修复创建任务时,任务编码为空未进行校验的bug
2、调整断线重连为10次一次提醒
2024-12-05
1、修正可运行列表的任务里表结构缓存无法刷新的bug
2025-01-22
1、增加导入管理页面的纠错比对导入表的功能,并允许异常表一键重导功能
2、修复同步数据时,如果是mysql库同步,出现主键键值修改的情况下,导致数据更新报错的问题。(postgresql模式下无影响,主要是 ` 字符和 " 字符操作影响)
2025-04-26
1、修复set、enum类型数据同步问题
2、修复无符号bigint同步到pg时,超出bigint最大值时无法继续同步的问题
3、修复每分钟新增、修改、删除大批量数据,例如百万数据的情况下,可能性死锁的问题,同时极大提高同步速度,修复了同表死锁的问题点
4、调整内部实现逻辑,优化同步速度,使用 虚拟线程、异步线程锁、异步原子锁释放等手段提高写入、并行更新的速度
2025-05-12
1、调整使用时间为 2027.02.01 ,基本半年会调整1次,每次基本会有1年左右的时长
2、修复新功能百万数据批量分钟级同步写入时,数据存在表情符号导致写入异常的问题
2025-06-09
1、新增数仓功能配置,由于生产会定期进行表备份操作,使用rename、delete、trunc table等操作,导致旧表累计数据的时候会产生断层现象,所以基于此操作原理,规避该操作,持续留存,方便一直保留以做全量备份和数仓分析使用,然后线下则可以灵活的单独重新划分存储区域等,减少数据同步作业的复杂度,让开发人员和运维人员省心又省又省力
2025-06-14
1、新增1.2.8 ARM LINUX 二进制版本
2025-06-22
1、修复批量更新开启时插入冲突时无法有效写入当前日志的bug
2、调整批量更新为 IDEMPOTENT 模式,并且更新冲突时也有效,幂等主键冲突+数据冲突模式都生效,以此规避数据丢失的风险
3、修复同步时,如果遇到非空键值为时间字段,并且数据为0或null时,自动转换成 1970年 或 00:00:00 的时间
2025-07-03
1、修正并行写入和更新时无队列模式,导致短时效应更新在前插入再后的问题
2、在并行时引入队列模式,保证数据的有序性
2025-07-25
1、新增同步时区调整参数,可以根据不同时区的时差进行调参
2、新增 IDEMPOTENT 合并写入模式,1个线程批量合并写入,冲突时,移除旧数据再写入新数据,以此保持一致性
2025-08-01
1、修复合并模式批量写入报错时,移除写入数据的bug,模拟 IDEMPOTENT 模式,如发生二次异常无法修正时,可使用默认模式进行数据修正,不丢数据
2、修正rename table table_1 to t1,table_2 to t2 丢失部分ddl操作的场景,但是不建议执行ddl语句时多表操作一句话同时执行的语句,不便于复盘
2025-11-18
1、关于初始化时,ddl 语句遇到非时间戳字段,填写默认值为 default current_timestamp 等行为,统一改写为 default '0' (这个一般是表设计错误导致的,非date、非time字段)
2、处理同步时,PG的索引名不能超过63个字符串的问题,只能做截断处理,随机生成字符串,解决索引构建的问题
2025-12-17
1、关于转义字符的特殊处理 ``` 只有 MySQL/SQLite 默认认 \ 为转义符,其余主流数据库(PG/Oracle/SQL Server/DB2)都默认把 \ 当普通字符,核心统一用 '' 转义单引号即可兼容所有库 ``` 2、关于 合并写入 的bug修复,将所有的同批次的插入语句转换成删除语句进行物理移除,然后再写入合并,这样子就可以使用批量sql进行数据写入和更新,避免数据同步失败时,或数据断开时,导致无法继续使用 合并模式 写入数据的bug,俗称合并大事务,确保每一条数据能正常不丢失的方式落地
2025-12-22
1、修复大事务同步时,事件标记无法写入成功,导致同步位显示异常的bug