RELEASES

更新日志

每个版本的更新说明与 jar 下载。当前最新版本 v2.0.0 —— 版本号与下载地址由本站后台「版本管理」维护,始终指向最新发布包

Latest

v2.0.0 · Spring Boot 4.1 平台升级

v2.0.0 发布于 2026-11-07

同一套功能,换到 Spring Boot 4 —— 全量迁移到 Spring Boot 4.1.2 / Spring Framework 7 / Hibernate 7 / Tomcat 11 / Jackson 3,功能范围与 v1.14.0 一致;对外格式、配置包、密文与元数据库都保持兼容,连接、同步项目、ETL 与专属迁移配置不需要迁移。

升级内容

  • Spring Boot 4.1.2:Spring Framework 7.0、Spring Security 7.1、Hibernate ORM 7.4、Tomcat 11、Jackson 3、Lettuce 7、MongoDB 同步驱动 5.8;javax.* 全部迁移到 jakarta.*,仍要求 Java 17+
  • 对外格式不变:Jackson 3 恢复 1.x 的 epoch 时间戳输出,配置包 meta.exportedAt 仍为 ISO-8601;Hibernate 7 的 Instant 固定映射为 TIMESTAMP;Spring Security 7 登录后保存的 URL 附带 ?continue,跳转与权限判定不变;存储密文与旧 Encryptors.delux 双向互读,已加密字段无需重新录入
  • 内嵌 H2 固定为 2.1.214:1.x 写下的 ./data/jync.mv.db 可原地升级(2.2+ 会报「Unsupported database file version」);外部 MySQL / PostgreSQL 元数据库不受影响
  • 依赖瘦身:移除运行期不会加载的构件,Web 依赖改用 spring-boot-starter-webmvc;2.0.0 最终约 106.6 MB(v1.14.0 为 88.9 MB)

修复与优化

  • Redis 缓存维护:重建缓存与「删除前缀键」移到缓存投影卡片旁,只对 Redis 目标的管理员显示;重建全程持有同步租约,忙时返回可翻译提示,不再与运行中的同步任务互踩,也不会误删相邻前缀的键
  • CDC 与配置包:CDC 重建在「位点已重置但消费者启动失败」时返回 503 并补写变更记录与审计;配置包导入拒绝缺少 Redis 目标的 REDIS 项目,JDBC 项目缺目标库改为导入成功并警告,同时清掉跨类型的陈旧目标 id
  • 专属控件不再串到通用页面:轮询专属的游标设置只在管理员且非 CDC 时出现;重置进度在 CDC 项目隐藏;Redis 项目不再渲染行数核对、目标预览、内容校验与第二套重建入口;ETL 的 MongoDB 续跑提示只对原生 MongoDB 源显示
  • 后端补齐与页面一致的守卫:Redis 项目的存储策略仍是轮询时,启动与立即同步被拒;被启用任务引用的 Redis 目标禁止编辑并提示任务名;保存 Redis 项目配置不再清空页面未渲染的选项、调度与性能字段
  • 配置正确性:Oracle 挖掘账号与口令只对「Oracle 源库」保存,连接改用其他类型后自动清空;Redis key 前缀留空自动补 jync:<id>:;项目运行中锁定端点后由隐藏字段原样提交已保存拓扑
  • 性能:Prometheus 抓取只查询项目 / 连接的 id 与名称,迁移首页只取计数,不再为两个标签字段加载带 @Lob 的整行实体
  • 平台适配:xdb 与 ojdbc8 / orai18n 统一到 23.26.3.0.0;清理 Boot 4 / Jackson 3 / Security 7 / Lettuce 7 的过期 API;设置页「运行时信息」新增 Spring Boot 与内嵌 Tomcat 版本
  • 一键升级支持 Gitee 分卷:Gitee 单附件上限 100 MB,本版 jar 超过上限,Gitee 发行版提供 jync.jar.part00 / part01;升级器原先只认完整 jync.jar,默认选中 Gitee 时会直接报「该版本未提供 jync.jar 下载附件」。现在优先用完整 jar,缺失时按数字序逐卷下载合并,再用 GitHub 同 tag 的完整 jar digest 交叉校验;缺号、重号或任一卷失败都不会动运行中的 jar

兼容性说明

  • 升级方式不变:替换 jync.jar 重启即可,运行环境仍需 Java 17 或更高版本;容器部署把镜像 tag 更新为 jync:2.0.0
  • 元数据库自动更新:升级前照常备份 ./data、外部元数据库与 application.yml;使用外部 MySQL / PostgreSQL 元数据库时建议先在副本上启动一次
  • H2 版本边界:内嵌 H2 固定为 2.1.214,不要自行换成 2.2 及以上
  • *IT 集成测试(Oracle / MySQL / PostgreSQL / ClickHouse / MariaDB / Redis / MongoDB 真库)不在 mvn test 默认范围,需显式运行
  • Gitee 分卷下载:Gitee 发行版因单附件 100 MB 上限提供 jync.jar.part00 / part01,手动下载后需 cat jync.jar.part00 jync.jar.part01 > jync.jar 合并;GitHub 与 GitCode 提供完整 jar。应用内「检查更新」会自动下载并合并,无需手动处理

测试

  • 5338 个测试:5337 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.14.0 · 应用内 HTTPS 与配置包迁移

v1.14.0 发布于 2026-11-07

证书与应用内的配置,都不再出界面 —— 系统配置页可以直接上传 TLS 证书让 Jync 自己提供 HTTPS,也可以把一整套连接与项目打成口令加密的配置文件搬到另一个元数据库;另新增元数据库连接测试器与 6 种列清洗规则。存量连接、同步项目、ETL 与专属迁移配置不需要改动。

新增

  • 应用内 HTTPS(TLS 证书上传):「系统管理 → 系统配置」新增「TLS 证书」卡,不必再改 nginx 或环境变量。支持密钥库(PKCS#12 / JKS + 口令)与 PEM(证书链与私钥可分开或合并;裸 DER .cer、PKCS#7 也能识别)两种上传方式;证书与加密后的密钥库口令存在数据目录 ./data/tls,不进元数据库、不进配置包。PEM 解析为单次前向扫描,畸形大文件不会卡住上传线程;续期重传表单用已保存的端口与重定向选择预填
  • 重启生效、事实分开显示:HTTPS 连接器在启动时创建,页面把「已保存 / 已生效 / 等待重启 / 移除待重启」四种状态分别展示,证书到期前 30 天给出提示;证书损坏或端口冲突导致启动失败时,可用 JYN_TLS_ENABLED=false 先救回实例。私钥与叶子证书用签名探测校验,防止「证书传对了、私钥来自别处」只能在重启时才发现
  • HTTP→HTTPS 307 重定向(可选):只信任严格校验过的 Host 或 app.tls.redirect-host,不采信 X-Forwarded-Host;非法 Host 返回 400,回环地址与 GET /login 探针始终可达;等待重启时不再把重定向误显示为「关」
  • 强制 HTTPS 页面可配:管理员可在系统配置页开关,无需改配置文件重启;取值优先级为「配置文件 > 数据库 > 默认」,5 秒 TTL 快照,其他节点在一个 TTL 内收敛。配置文件显式设置 app.security.require-https 时页面只读并显示来源;被 blocked 且 TLS 已禁用时提示指向配置文件,拒绝文案区分未配置证书、TLS 已禁用、证书过期与等待重启
  • 配置包导出/导入:把一个实例的连接、项目、任务等配置整体搬到另一个元数据库。单文件 .jync 使用 AES-256-GCM + PBKDF2-HMAC-SHA256(21 万次)口令加密;逻辑导出 13 张配置表,可选「包含同步进度与游标」,默认不带进度。包内 meta 携带导出端的加密密钥,导入时先用源密钥解密全部 enc: 值、再以目标部署密钥重新加密;解不开即中止,不写半套凭据
  • 导入安全约束:只接受空配置库;所有 id 丢弃并重映射;单例覆盖、用户按 username 合并(目标口令优先)、导入后必须仍有 ADMIN;明文请求导入会把强制 HTTPS 置为关并给出警告。导入恢复 baselineDone;重新编号的 PG / 崖山 CDC 项目按采集策略丢弃恢复的位点并自动重新全量,避免带着旧位点续接后被 park 成 ERROR。PG 槽名由 slot-prefix + project id 组成,换 id 后可能与旧实例的槽重名,迁移前请先停掉旧实例 CDC 或改前缀,旧槽与旧 YStream 服务需手工清理。导入事务提交后再重唤醒连接池、连接健康缓存与三类调度
  • 元数据库连接测试器:在页面上填入候选 JDBC 地址与驱动类,真的连一次并给出产品/版本与一段 POSIX 安全引用的 SPRING_DATASOURCE_* 环境变量块;四种 JDBC 方案白名单,只测试、不持久化
  • 列清洗新增 6 种规则:手机号、身份证、银行卡、姓名、邮箱的格式保留掩码,以及带可选盐的 SHA-256 哈希,规则总数达到 13 种。掩码按 code point 保留首字符,不会切断 emoji 代理对;哈希列在内容校验时自动跳过,只改写写入目标的值
  • 系统管理导航组:「系统配置」(仅管理员)与「系统信息」拆分为独立入口,新增 SYSTEM_SETTING_SAVE / CONFIG_EXPORT / CONFIG_IMPORT / SYSTEM_DB_TEST 审计事件,URL 一律脱敏,口令与密文不进日志、审计或页面消息;新增安全数据边界文档 ↗

修复与优化

  • CDC 基线不再强制创建二级索引:结构与数据仍强制开启,但索引开关在 CDC 模式下保持可见、按保存值执行,手工建表或自带索引的场景不再被覆盖

兼容性说明

  • 升级方式不变:数据库连接、同步项目、ETL 与专属迁移的存量配置不需要改动,替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.14.0。使用应用内 HTTPS 时 ./data 下会新增 data/tls 目录,升级前照常备份 ./data 与 application.yml
  • 配置包边界:不迁移变更日志、审计、性能采样、ETL/迁移运行历史、sync_task 租约行、chunk_checkpoint 与 TLS 证书;无主键表如果在全量装载进行中迁移,可能产生重复行,建议装载结束后再迁移
  • TLS 边界:保存后需重启生效,不支持运行时不重启热切换,也不内置 ACME 自动签发/续期;免费 DV 证书(90 天)续期后需重新上传并重启;data/tls 是实例本地目录,多实例部署需共享 JYN_TLS_DIRECTORY 或分别上传。证书可以是 DV / OV / EV 任意一种,但必须由公开信任的 CA 签发并携带中间证书链

测试

  • 5257 个测试:5256 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT(含 MySQL 8.0 / PostgreSQL 16 元数据库迁移)需 Docker 另跑

v1.13.0 · Redis 缓存投影与 MySQL 5.7 适配

v1.13.0 发布于 2026-11-05

把热数据推进缓存 —— 日志 CDC 项目现在可以直接以 Redis 为目标,把每一行的变化投影成缓存键值;另按连接自动区分 MySQL 5.7 / 8.0,5.7 源端全量不再刷屏报错。存量同步、ETL 与专属迁移配置不受影响。

新增

  • Redis 作为实时同步目标:项目页的「目标类型」可选 Redis,源端 CDC 持续把每一行变化投影到缓存。Redis 是目标端专属能力,不是新的 DatabaseType,不出现在源端下拉、ETL 引擎列表与数据库能力矩阵里
  • Redis 目标连接:连接管理页新增「Redis 目标」标签,独立维护 host / port / database / ACL 用户名 / 密码 / TLS / Cluster 等参数;密码只存加密字段、页面不回显。「测试连接」执行 PING,集群目标额外检查 CLUSTER INFO;列表、表单与写操作仅管理员,保存与删除写审计
  • 行级缓存投影:键为 <前缀><表名>:<主键…>,前缀默认 jync:<项目ID>:,同一 Redis 上不同项目互不影响。值支持 JSON(默认,整行镜像)与 HASH(field = 列名);可设 ttlSeconds、排除列与单值上限,超限的行按事务汇总成一条 WARN
  • 基线、回放与重建:启用项目时先做分块基线(只投影有主键的表),完成后再开始流式回放;项目详情页提供「重建」,可先按本项目前缀清扫(SCAN + UNLINK,只动本前缀,绝不 KEYS / FLUSHDB / FLUSHALL)再重新基线
  • Redis 预检:同步前检查在 Redis 项目上只跑 Redis 项 —— 连通性、TLS、集群槽与 databaseIndex、maxmemory-policy、键前缀合法性与冲突、选表主键、基线状态、LOB 列与布局漂移;只读,不写任何数据
  • 源端强约束:Redis 目标只能配日志 CDC,POLLING / FULL_COMPARE 在页面不出现、服务端也拒绝;没有日志 CDC 的源类型不能选 Redis。结构、索引、视图、存储过程同步对 Redis 强制关闭

优化

  • 目标写入接缝:五种 CDC 消费者的目标写入段提取为 CdcTargetTransaction,JDBC 实现只是原样搬移,Redis 实现独立接入;存量项目(targetKind 为空)在任何路径上仍按 JDBC 处理,无需数据迁移
  • 故障语义与数据库目标一致:Redis 不可达或命令失败按目标写入失败处理 —— 位点不推进、消费者退避重连、持续失败进入 ERROR 帽,恢复后从原位点重放;SET/HSET/DEL 幂等,重放收敛(at-least-once)
  • 每个 CDC 事务一次管道:事务内命令先缓冲,提交时一次性管道执行并逐条检查回复;不使用 MULTI/EXEC,避免集群同槽限制;缓冲超过 maxCommandsPerTransaction 时先执行一批再继续
  • 可观测:Redis 项目复用 CDC 状态面板的位点、延迟、变更计数与最近错误;被跳过的行(超 maxValueBytes、无主键、无法编码)按事务汇总告警,不刷屏、不停机

修复

  • MySQL 5.7 源端全量刷屏报错:5.7 没有窗口函数,按主键采样切分的查询是语法错误,此前每张表、每次全量都打一条 Source cannot split … 再退回顺序分块;数据本来不丢,只是日志被刷满。现在按服务器实际版本在采样前判定,5.7 直接走顺序分块、每个项目只提示一次,内容校验同样直接标 SKIPPED 而不发查询
  • 按连接自动区分 MySQL 5.7 / 8.0:构建同步上下文时从服务器元数据读取主版本(按连接配置与修改时间缓存,连不上不缓存、下一轮重试),分别下发给源与目标方言 —— 两端可以是不同版本。5.7(以及 MariaDB 10.2 之前)不启用窗口函数采样,新建表时也不写 DATE DEFAULT (CURRENT_DATE) 这类 8.0.13+ 才接受的表达式默认值,改为丢弃该默认值,而不是让 CREATE TABLE 失败;版本读不到时保持原行为:先尝试、被拒再回退

兼容性说明

  • 新增一张元数据表:Redis 目标连接单独存放于 redis_target,启动时自动创建;数据库连接、同步项目、ETL 与专属迁移的存量配置不需要改动,替换 jync.jar 重启即可。容器部署将镜像 tag 更新为 jync:1.13.0;升级前照常备份 ./data 与 application.yml
  • 存量行为不变:targetKind 为空的项目仍按 JDBC 目标处理;Redis 只影响显式选择 Redis 的项目
  • Redis 边界:Redis 侧的键驱逐、FLUSHDB、重启丢数据 Jync 感知不到,读不到即回源或执行一次重建;基线只写当前存在的行,源端在基线之前删除的行会留下孤儿键,用 ttlSeconds 或带清扫的重建消除;HASH 形态删列/改名不会自动清理旧字段,检测到布局漂移会停车并提示重建;不支持 Sentinel,集群模式不做 hash tag,无主键表不投影

测试

  • 4972 个测试:4971 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.12.0 · 同步前检查、内容级校验与一键诊断包

v1.12.0 发布于 2026-11-04

同步之前能排练、同步之后能比对、出问题能一次带走现场 —— 本版本补齐可验证性与可运维性:同步前检查、内容级校验、一键诊断包与真实库验证矩阵。不改数据模型、不新增元数据表,也不替用户自动改写任何数据;另修复大表首轮全量与 MariaDB / DB2 写入问题。

新增

  • 同步前检查:项目详情页可在不写入任何数据的前提下排练下一轮 —— 源 / 目标连通性、待执行的 CREATE / ALTER / DROP、目标表缺失 / 缺列 / 类型不兼容、游标列与索引、CDC 可用性,以及 binlog CDC 的表布局漂移(停机期间源表跑过 DDL 会在预检直接报错并提示重建基线)。结果按 ERROR / WARN / OK / SKIP 分组;预检不执行 DDL、不写快照、不推进游标
  • 内容级校验:增量同步后按主键分桶抽样,比对源与目标的行值,能发现「行数相同但内容不同」(更新丢失、截断、类型转换错误)。差异只写变更记录并发 DATA_DRIFT 告警,不自动修复;管理员可对单表手工触发「校验内容」
  • 一键诊断包:设置页管理员一键导出 zip(版本、配置、连接、项目进度、CDC 位点、近期变更与日志尾部),条目附 SHA-256 清单;密码、密钥、data/ 与原始配置均不入包
  • 真实库验证矩阵:新增 docs/verification-matrix.md 与本地执行脚本,逐产品标注测试版本 / 镜像、驱动、角色、已验证策略与验证级别(自动化容器 / 环境变量门控 / 手工);MariaDB 11.4 与 ClickHouse 24.8 纳入自动化容器测试

优化

  • 内容校验比较口径:比对前先做列清洗,数字、时间、布尔等统一规范化,时间按墙钟对齐;LOB、JSON、XML、几何等不可比列自动排除,减少误报
  • 诊断包二次脱敏:白名单之外再对密码 / 密钥 / token 类赋值、enc: 密文、Bearer、URL 账号信息与私钥块做替换或截断

修复

  • 千万级大表首次全量反复重试无法完成:源表持续增长时,重试不再按当前主键范围重新切分;按已记录的区间布局续跑,新增行只在尾部追加,改并行度也不再整表重载
  • MariaDB 适配:修正负 fetch size 导致的 invalid fetch size(改用正数流式读取);预设 URL 加 useAffectedRows=true,空转 upsert 不再被记成更新,行数审计与结果计数恢复准确
  • DB2 数据同步失败(SQL0418 / SQLSTATE=42610):MERGE 的无类型参数标记在 ON / UPDATE / INSERT 三处解析、类型不一致时被 DB2 拒绝;现按目标列声明统一加 CAST 固定类型,全量、增量与 CDC 均生效
  • 视图 / 存过转换:补全 DECODE / NVL2 → CASE、分页语法、CONVERT → CAST、WITH ROLLUP、布尔常量等改写;跨方言族的过程化正文与无法保证等价的写法改为明确阻断并提示 DDL 覆盖,不再生成可能执行但结果错误的 SQL
  • 建表字段方言替换:DECIMAL / NUMERIC 自增列按精度提升为整数类型(PG 用 SERIAL);DATE 当前时间默认、MySQL 零日期、SQL Server 高精度时间默认函数按目标库规则改写

兼容性说明

  • 无破坏性变更:不新增元数据表,替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.12.0。升级前备份 ./data 与 application.yml
  • 默认行为:同步前检查与诊断包只在用户点击时执行,没有调度器;内容级校验在增量成功后自动运行,默认 15 分钟间隔、每表 50 行、单表 200 万行上限、每项目每周期 1 张表,可用 sync.content-audit-* 调整,设 sync.content-audit-interval-ms=0 关闭
  • 内容校验只报告不修复:目标端外部触发器、手工修订或转换规则也会表现为差异;LOB / JSON / XML / 几何列不参与比较,无主键、伪列游标与首次全量未完成的表会跳过并给出原因
  • 诊断包按敏感文件处理:不含密码、密文、带凭据的连接串、游标原值与 data/,但日志与变更详情可能保留业务标识;对外提供前请按组织的数据外发流程审批

测试

  • 4675 个测试:4674 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.11.0 · MongoDB 专属迁移

v1.11.0 发布于 2026-11-03

「专属迁移」新增 MongoDB → MongoDB 与 MongoDB → KingbaseES 两种整库一次性复制,与实时同步、ETL 完全隔离;ES / OpenSearch → Easysearch 的行为保持不变。本版本曾同版本覆盖重发(安装包更新,版本号不变),以下为最终内容。

新增

  • MongoDB → MongoDB:使用随包内置的原生 mongodb-driver-sync(约 2.2 MB,无需另配 jar),自动发现集合并按模式筛选;复制集合选项(capped、size、max、validator、collation 等)与索引,文档原样批量写入并保留 _id。支持 OVERWRITE / APPEND / FAIL_IF_EXISTS 三种写入方式,capped 集合自动有序插入,重复 _id 在 APPEND 下跳过并 WARN;运行结束可做行数与抽样校验
  • MongoDB → KingbaseES:从有界样本推断 BSON → 列类型,自动建表并写入。_id 默认作为主键;upsertOnId 打开后使用 INSERT … ON CONFLICT ("_id") DO UPDATE 幂等重跑。嵌套文档与数组写成 TEXT 的 relaxed Extended JSON,不展开为列。DDL / DML 全部经方言引用标识符,值一律走参数绑定
  • 专属连接扩展:连接模型新增 databaseName、schemaName、extraParams 三个可空字段,并引入按产品类型分派的连接适配器注册表;ES 逻辑逐行搬入搜索适配器,由既有测试锁定行为

优化

  • 同库守卫:源与目标解析出相同的库名与 host 集合时拒绝运行,避免 OVERWRITE 在读源之前先删掉目标集合
  • 预检更完整:采样读取异常兜底为 ERROR 而不让任务页崩溃;目标 schema 不存在、APPEND + upsertOnId 缺少 _id 唯一约束、字段名不能作为普通标识符,都在预检阶段给出明确错误
  • 写入正确性:写关注错误不再被当作重复键吞掉;APPEND 列名按精确大小写比对;JDBC 元数据查询转义 _ 与 %;BLOB 主键用 setBytes / setNull(VARBINARY) 绑定
  • 连接保护:连接仍被迁移任务使用时禁止修改产品类型,避免已保存任务失效
  • Kingbase URL 拼接:正确处理 extraParams 的前导 ? / &;schemaName 留空时才读取连接的当前 schema
  • 保存配置无感刷新(覆盖重发):项目详情页保存改为 AJAX 提交,保存成功后直接更新脏标记、策略基线与「无需同步对象」提示,不再整页刷新;仅在切换捕获策略时才需要重载
  • 对象选择面板保存后重排(覆盖重发):保存成功后勾选的对象自动排到最前,目标表名回落到服务端真正保存的值(未勾选与同名映射留空),列表滚回顶部

修复

  • 大库对象选择丢失(覆盖重发):表 / 视图 / 存储过程很多时,每行两个映射字段会超出内嵌容器的默认参数上限(10,000),Tomcat 静默丢弃其余参数,保存后变成「什么都没选」。现在上限提高到 200,000,未勾选的行不再提交映射,表单体上限提高到 8 MB,并保证已选对象排在最前
  • MySQL 家族 || 转换提示(覆盖重发):源库视图 / 存储过程定义中使用了 ||、而目标为 MySQL 家族方言时,项目详情页直接列出需要人工确认的对象,并链接到转换审查
  • 两处可选集成测试自身的缺陷:List.of 不接受 null 元素导致含 SQL NULL 的行无法构造;upsert 后行数断言写错。真库测试现在可在 KingbaseES V9 的 PostgreSQL 与 Oracle 兼容模式下跑通

兼容性说明

  • 无破坏性变更:替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.11.0。升级前备份 ./data 与 application.yml
  • 凭据只存加密字段:页面不回显;MongoDB URI 与 Kingbase JDBC URL 中禁止写密码(Kingbase 还禁止 user / password 参数),测试连接与运行日志不输出 URI
  • MongoDB → MongoDB 的 APPEND 与 ES 语义不同:保留目标已有文档,_id 冲突跳过并 WARN,不覆盖;需要以源为准时用 OVERWRITE,需要幂等覆盖请改用 KingbaseES 的 upsertOnId
  • 一次性复制:同一 MongoDB 集群跨库复制要建两条连接记录(同 host、不同 databaseName),源与目标指向同一个数据库时任务会拒绝运行;只复制运行那一刻的数据,没有断点续传,取消只在批间生效;嵌套文档 / 数组不展开,view 与 timeseries 集合不复制
  • KingbaseES 版本要求:已在 V9R1C1B25 的 PostgreSQL 与 Oracle 兼容模式下验证;更老的 V8R3 缺少 PG_CATALOG 兼容视图,与内置 9.x 驱动不兼容,建议升级
  • 覆盖重发:如果你在此之前下载过 v1.11.0,请重新下载最新安装包(SHA256 已变化),以包含上述对象选择与保存体验的修复

测试

  • 4448 个测试:4447 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.10.0 · 性能曲线与 SAP HANA

v1.10.0 发布于 2026-11-02

新增数据库与同步任务性能曲线:连接延迟与可用性、库内会话 / QPS / 缓存命中率 / 锁等待、表数 / 行数 / 占用空间,以及每个任务的同步行数、延迟、失败与变更构成,都能按 1 小时 / 24 小时 / 7 天查看。六种分析型引擎可作为实时同步的源,SAP HANA 升级为实时同步类型;同时修正了 CDC 列布局漂移与一批同步正确性问题。

新增

  • 性能曲线:新增数据库性能页与同步任务性能页。连接维度覆盖延迟与可用性、会话 / QPS / 缓存命中率 / 锁等待,以及表数 / 行数 / 占用空间;任务维度覆盖同步行数、同步延迟、连续失败次数、变更构成与变更最多的表。采样由后台定时执行,历史保留 7 天,打开页面不临时查询业务库
  • Prometheus 指标端点:GET /api/metrics/prometheus 输出进程、任务与连接三组最新样本;默认关闭,配置 metrics.prometheus-token(或 JYN_METRICS_TOKEN)后以 Bearer token 访问
  • 分析型引擎作同步源:Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB(Atlas SQL)可作为实时同步的源,策略为轮询与全表比对,不会出现在目标下拉中。六个引擎一律按无主键读取,避免把驱动报告的排序键当成唯一键而折叠数据
  • SAP HANA 实时同步:新增 HANA 方言家族与结构同步、轮询式数据同步;写入用 UPSERT … WITH PRIMARY KEY,分页走 LIMIT / OFFSET,视图与存储过程 / 函数用 CREATE OR REPLACE 重建,表注释走 COMMENT ON

优化

  • 任务详情页与 ETL 表单拆成模块化模板,新增数据库专属卡片时不再牵动其它模式
  • CDC 状态卡按可用宽度自动排成多列,位点与错误各占整行,手机端回退单列
  • 看板增加进程资源卡片与趋势曲线,可在「变更数 / 行数」之间切换

修复

  • CDC 列布局漂移:MySQL binlog 的行值按位置编码,位点现在同时记录每张表的列序指纹。消费者停机期间源表跑过 DDL 时,重启会停在错误上并提示重建基线,不再把值静默写进相邻列;源库开启 binlog_row_metadata=FULL 时还会逐份 TABLE_MAP 校验列名与顺序
  • CDC 延迟口径:MySQL / PostgreSQL / 崖山改用源提交时刻计算延迟,面板改为显示「上次事件」时刻;源库空闲时显示 0,重连追赶的事件不再计入
  • CDC 解析与权限:SQL Redo 解析支持无空格的 IS NULL 与带空格的列名;达梦补齐最旧可挖 SCN,并用 ALL_TAB_PRIVS 检查普通用户权限;PostgreSQL money 兼容欧洲 locale(1.234,56)
  • CDC 故障归类:ORA-01284 与 ORA-00308 一样归为归档缺失;SQL Server 接受 db_owner;YStream 重连时重置 lastSeen,避免跳过未提交的事务
  • 同步正确性:行数审计开始上报目标多出行并触发数据漂移告警;删除比对按主键比较前去掉 CHAR 尾部空格;关闭索引同步时清理待建队列;删除项目时一并清理分块装载续传点
  • Oracle / DB2 schema 折叠:同步、数据预览与索引探测统一按字典大小写折叠,避免小写 schema 指向不存在的库、有索引的表被误报为无索引
  • 指标与图表:MySQL / DB2 / Oracle 缓存命中率按逻辑读口径计算,物理读大于逻辑读时显示未知;SQL Server 改取分子 / 分母计数器;曲线控制点夹进相邻采样区间,不再画到 0 以下或冲过峰值;状态标签走 i18n,延迟与占用空间按量级换算

兼容性说明

  • 无破坏性变更:替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.10.0。升级前备份 ./data 与 application.yml
  • 新增可选配置:metrics.enabled(默认 true)、metrics.retention-days(默认 7)、metrics.db-interval-ms(默认 300000)与 metrics.prometheus-token(默认空,端点关闭),详见 部署页配置表
  • 分析型引擎按无主键读取:增量只识别新增,没有更新 / 删除识别;需要收敛时使用全表比对。性能采样会在被监控库上打开会话,不需要时把 metrics.enabled 设为 false

测试

  • 4092 个测试:4091 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.9.0 · Webhook 告警与 ETL 批次

v1.9.0 发布于 2026-10-31

新增 Webhook 告警通知与 ETL 批次:七类故障可按分类推到钉钉、企业微信、飞书或自定义 Webhook;同源同目标的多张 ETL 表可以共享一对连接和一条调度,组内顺序执行。ETL 连接类型扩到 7 种分析型引擎,同步链路同时修复了租约与连接池的一组问题。

新增

  • Webhook 告警通知:同步失败、轮询卡死、项目未运行、CDC 停摆、数据漂移、连接不健康、PG 复制槽滞留七类故障可分类推送,支持通用 JSON、钉钉、企业微信、飞书四种格式;带冷却时间(默认 30 分钟)与恢复通知,地址加密存储、页面只回显尾号。评估只读取既有状态,不改变同步、CDC 或 ETL 的执行方式;告警状态落库,多节点共享同一份故障生命周期
  • ETL 批次:同源同目标的多张表放进一个批次,共享一对源 / 目标连接与一条调度,组内按顺序执行,某个成员失败不阻断其余成员;连接在批次创建后锁定,成员不再单独调度,但仍保留各自的取数 SQL、目标表、写模式、断点与运行历史
  • ETL 分析型引擎:新增 SAP HANA、Apache Doris、ClickHouse、Apache Hive、Apache Impala、Elasticsearch、MongoDB(Atlas SQL)7 种连接类型;Elasticsearch 与 MongoDB 作为只读 ETL 源。另支持 MongoDB 原生驱动源,可直接连接任意 mongod,按集合名与 Extended JSON 过滤取数,无需 SQL 与额外 jar
  • ETL 多语句脚本:取数 SQL 支持多语句脚本,以最后一条查询的结果作为数据行
  • 看板:新增内存趋势图与 ETL 运行卡片,支持双布局与滚动切换
  • 游标列索引提示:轮询任务的游标列缺少索引时,项目详情页直接标出,避免每轮全表扫描

优化

  • 告警设置页在桌面宽屏下两卡并排,窄屏自动折成单列
  • 连接下拉按源 / 目标角色分组,只读连接不再出现在目标候选中
  • 独立 ETL 任务表单在标题下提示:同源同目标的多张表建议使用批次
  • 警告图标改为鼠标移入即显示的深色气泡提示,不再依赖浏览器原生 tooltip 的等待时间

修复

  • 网关头模式未强制校验共享密钥:补上共享密钥校验,防止伪造身份头绕过网关
  • 租约丢失被计入失败次数:租约丢失不再计为同步失败,ERROR 状态不再被半途解除;元数据库短暂抖动不再导致停止续租
  • 连接被池回收后不重借:一张慢表不再拖垮整轮同步,连接失效时重新借出而不是把异常抛给后续表
  • 行拷贝缺少独立超时与计数保护:慢查询不再无限挂起,失败提示带上实际计数
  • CDC 基线完成后「上次同步」不推进:重建基线并落地全量后,上次同步时间现在会随数据写入推进,不再停留在上一次 CDC 变更窗口
  • ETL 表单的页面结构、错误归属与调度触发:表单元素闭合、错误提示定位与批次调度触发一并修正
  • 另有 10 项安全漏洞与代码质量问题

兼容性说明

  • 无破坏性变更:替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.9.0。升级前备份 ./data 与 application.yml
  • 新增可选配置项:sync.alert.evaluate-interval-ms(默认 60000)、sync.alert.initial-delay-ms(默认 45000)、sync.cdc.max-transaction-rows / max-transaction-bytes、sync.max-unindexed-scan-rows 等,详见 部署页配置表
  • 告警默认不打扰:只有配置 Webhook 并启用后才会发出请求;禁用时不评估规则、不发送任何消息

测试

  • 3763 个测试:3762 通过,0 失败 0 错误;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.8.2 · 日志 CDC 覆盖信创数据库,并发与审计更稳

v1.8.2 发布于 2026-10-30(同版本覆盖重发两次:先精简安装包 4.3 MB,后补 LogMiner 基线归档自检,版本号不变)

日志 CDC 从四类引擎扩到五类:崖山 YStream、达梦 DM8 LogMiner、openGauss 等 PostgreSQL 方言家族、MySQL 兼容家族按能力探测放行。同步侧新增行数审计的定点修补与删除比对分块;同一连接配置上的多个任务改为按活跃任务数分配并行度,池满时排队退让而不是判失败。

新增

  • 崖山 YashanDB YStream 实时采集:走崖山自带的逻辑日志(DBMS_YSTREAM_ADM),不建触发器、不改表结构。策略门禁逐表检查归档模式、主库角色、权限与列补充日志,缺项给出可直接复制的 ALTER 语句;源侧服务按任务生命周期管理,位点为提交 SCN、实例、组 LSN、组偏移与行号的五元组
  • 达梦 DM8 LogMiner 日志采集:LOGMINER_CDC 改按方言家族放行,连上后由能力探测决定能否挖掘 —— 源库版本、ARCH_MODE=Y、RLOG_APPEND_LOGIC=2、归档范围与新鲜度、V$ARCHIVED_LOG / DBMS_LOGMNR 权限;基线起点取最新归档的 NEXT_CHANGE#,没有归档时给出切换日志的命令
  • PostgreSQL 方言家族与 openGauss 逻辑复制:openGauss 与原生 PostgreSQL 分开取变更流与推进 SQL(pg_current_wal_lsn 系列与 pg_current_xlog_location 等按能力选择),门禁与探测按方言家族放行;建槽探测仍是唯一权威
  • MySQL 兼容家族 binlog:从「仅 MySQL / MariaDB」改为 MySQL 家族 + 能力探测,GBase、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB 等按实际能力放行,探测不过时明确说明缺哪一项
  • 行数审计定点修补:发现缺口后按主键把区间切段、只对比计数偏短的段,再只回源取缺失的行幂等写入,游标保持不动 —— 不再为几行补数据付出整表重载
  • 删除比对分块:超过内存上限的删除比对改为按主键键序分页(WHERE pk > 上页末键 + 行数上限),每页主键等值回源确认,内存从「整表所有键」降到「一页键」;用等值而非范围,避免排序规则、CHAR 补位与数字序差异造成误判
  • 看板实时化:概览数据并入统计轮询,会话数、连接健康状态与最近活动随轮询刷新;活动流改为跑马灯,不再因停靠而截断

优化

  • 同一连接配置上的并发调度:按连接配置记录活跃任务占用的席位(同库两端算两席),新任务按 (池大小 − 已占) / 已占 折算并行度,取源 / 目标较小值;准入上限为池的一半,另一半留给全量 worker。单任务时并行度与原来一致
  • 池满改为排队退让:同一配置上的第二个任务不再等 Hikari 十五秒超时后整轮失败、写 ERROR 并累计失败次数,而是按 sync.pool-wait-ms(默认 10 秒)每 200 毫秒探一次池计数,仍拿不到位置则本轮退让、下个调度周期自动重试;数据库真连不上仍按失败处理
  • 手动同步不再谎称完成:退让轮的手动同步显示黄色提示「连接池被其他任务占满,本轮已让出」,不再显示摘要与错误明细
  • 并行度上限可见:任务详情显示并行度的生效上限及它受连接池约束的原因,不用再猜为什么设了 8 实际只跑 4
  • 变更日志详情列按界面语言渲染:详情列在展示层按当前语言渲染,存储与去重键不变
  • 安装包精简 4.3 MB:移除四个代码从未用到的传递依赖(Bean Validation 校验器、AspectJ weaver、Quartz 的 c3p0 支持、Tomcat WebSocket),安装包从 84.0 MB 降到 79.6 MB,功能不变 —— 日志 CDC 需要的 zstd 解压、全部数据库驱动与 Oracle 中文字符集 / XMLTYPE 支持均保留

修复

  • Oracle LogMiner 基线跑完才发现归档已被清空:全量耗时超过源端归档保留期时,锚点之后的归档日志在首次挖掘前已被删除,会话才抛 ORA-01291,详情既不说缺哪个 SCN、也不说源端还剩多旧的日志。现在全量结束后先核对源端最早可挖 SCN,越过锚点即报出锚点、下界与调大归档保留的办法;PURGED 详情同时带上 resume SCN 与源端最早可用 redo
  • 预先校验拒绝的表被当成源端删除并 DROP:目标名过长的表被预检剔除后,变更检测曾把它当成源端已删除并执行 DROP TABLE;现在记录为「本轮未处理」,不再删除目标表与快照
  • DATE / TIME 主键两侧渲染不一致误判整表被删:删除同步与审计修补要求同一逻辑键在两侧渲染一致,LocalDate / LocalTime 曾分别按 epoch day / nano-of-day 与毫秒比较,驱动返回类型不同时会误判整表被删并清空目标;现在统一为毫秒
  • Oracle / 达梦 LogMiner 半读事务被冲刷:批大小或停止请求落在 CSCN 窗口中间时会先冲刷半读事务再推进水位,未读的行永久丢失;现在只冲刷完整读完的游标。失败退避期间从位点库回读已提交 SCN,不再逐条打「refusing to rewind」
  • LogMiner 会话泄漏:START_LOGMNR 成功后建游标失败时没有 END_LOGMNR,连接带着挖掘上下文回到池里;现在异常路径也结束会话
  • Oracle / 达梦 LogMiner 写 PG 族目标首条 DML 失败:重做文本里的数值被当字符串绑定,PostgreSQL 拒绝隐式转换;现在数值目标列解析为 BigDecimal 再绑定
  • PG 逻辑解码用 NULL 覆盖目标值:流式行缺少基线后新增的列时,原实现绑定 NULL 覆盖目标值;现在跳过并计数,每表告警一次
  • PG 事务里的删除落在刷新前的绑定上:事务内删除后重插同键,期间元数据刷新会产生新绑定,删除与插入落在两个桶,先写后删导致静默丢行;现在刷新时把缓冲的删除移到新绑定
  • 复制槽丢失后静默建新槽续跑:已提交位点存在但槽不见时判定为 PURGED 并停在错误上,不再继续推进;同理,SQL Server 源端水位倒退改判为 PURGED 并提示从新快照重基线
  • PG 基线期间槽滞留无感知:基线可能跑数小时,源库 WAL 会静默堆积;现在基线期间每 30 秒采样一次,超过 sync.cdc.pg.wal-retention-warn-bytes(默认 4 GiB)在面板标红并写 WARN
  • SQL Server 大字段删除写错溢出文件:删除事件的溢出文件无读者,批量删除大行会填满溢出目录;现在只溢出插入与更新镜像
  • 大字段溢出上限按 UTF-8 字节计算:原先按每字符 3 字节保守估算,纯 ASCII 的值到三分之一配额就误报超限;现在按实际写盘字节计数
  • 模拟 upsert 目标重复记录更新:安全余量重发的相同行照样报「1 行影响」;现在 UPDATE 带「任一列真的不同」守卫,重放空操作不再计数
  • 项目删除被自己的租约释放阻塞:删除流程不再等待自身租约释放,删除立即返回
  • 窄屏与手机宽度下的三处溢出:品牌名不再截成「Jy…」,任务列表分页条自动折行,英文界面在 390px 下不再吞掉左侧的「共 N 条」

兼容性说明

  • 默认行为不变:不启用的采集策略不会被探测;已有同步任务、调度与连接池默认值不变
  • 新增可选配置项:sync.pool-wait-ms(默认 10000)、sync.row-count-repair-max-rows(默认 1000,0 关闭)、sync.delete-compare-max-rows(默认 0 关闭)、sync.cdc.pg.wal-retention-warn-bytes(默认 4 GiB,0 关闭),详见 部署页配置表
  • 无数据库结构变更:替换 jync.jar 重启即可;容器部署将镜像 tag 更新为 jync:1.8.2。升级前备份 ./data 与 application.yml

测试

  • 3264 个测试:3263 通过,0 失败;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

v1.8.1 · 批量建任务,按表大小分箱

v1.8.1 发布于 2026-10-28(同日同版本覆盖重发,安装包更新、版本号不变)

表多、不知道哪张表大?读一次源库表清单,按估算大小分箱,预览后一次建出多个「未启动」的同步任务。同步链路同样提速:行数估算改为按需读取,元数据库不再每轮空写;另修正大批量基线下的行数计数与几处 CDC 状态问题。

新功能

  • 批量创建任务:任务管理页「新建任务」旁新增「批量创建」(仅管理员)。选择源 / 目标连接、任务数(1–50,默认 8)与名称前缀,读取一次源库目录统计后按估算大小分箱:按行数从大到小,每张表放进当前总重最小的箱(LPT);大小未知的表按已知大小的中位数计入,全库都没有统计时按表数均衡。结果确定——同样的输入在预览与创建时得到同样的分箱
  • 统计来自目录,不扫表:优先读各产品的目录统计(MySQL information_schema、PostgreSQL pg_class、Oracle ALL_TABLES、SQL Server sys.partitions、DB2 SYSCAT.TABLES)。勾选「精确统计行数」才对未知表逐条 COUNT(*):单表 15 秒、整页 120 秒预算,超预算立即停止并在页面注明
  • 预览与导出:逐任务显示表清单、估算行数与统计来源;没有估算的表单独计数、不计入合计;可导出 CSV(UTF-8 BOM,含防公式注入处理)
  • 创建即停用:先规划、后开事务,重名检查与写入之间只隔毫秒级,名称重复时在创建任何任务之前拒绝。新任务一律「未启动」,采集方式与选表随表单,逐表确认后再启动。规划只使用独立的两连接临时池(与「测试连接」同一条路),不占用同步连接池,也不影响正在运行的同步任务

优化

  • 行数估算按需读取:过去每个轮询周期都为每张表查一次目录估算行数,而常规任务只在「没有任何游标候选」的兜底判断里才用到它。现在只对开启删除检测或显式全量对比的任务预取,其余任务的估算留到真正需要时再取。2000 张表、20 ms 链路的项目每周期约省 40 秒
  • 表快照不再每周期重写:估算行数不再进入常规任务的快照内容,忙碌的表也不会因为行数每轮变化而重写一次元数据库
  • CDC 目标端复用类型映射:目标库不支持原生 upsert 时,每个事务刷盘少遍历一次列类型
  • 预览提示更准确:只有目录与精确统计都没有任何结果时才提示「该库未提供目录统计,所有表大小未知」
  • 「同步行删除」的说明更明确:补充「日志 CDC 下只在基线加载完成后执行一次,之后的删除由日志流同步」,避免被理解为每条变更都做全表比对

修复

  • 对停用任务的 CDC 操作会拉起消费者:重建基线、或把一个未启动的任务切换到日志 CDC,原本都会短暂启动消费者、占用同步锁并跑全量,随后被巡检停掉,页面同时显示「已停止」和「CDC 运行中」。现在停用状态只重置进度、错误标记与遗留文本(服务端强制,直接调接口也一样),消费者在任务启用时才拉起
  • Oracle 系 schema 大小写:连接配置里写成小写 schema(如 scott)时,「精确统计」拼出的 COUNT 语句引用一个不存在的 schema,每条统计都静默失败、全部显示未知。现在按同步链路的规则先折叠为大写
  • SQL Server 行数被重复计数:目录统计把分区与其分配单元直接连接,一个分区通常有 in-row、LOB、行溢出多个分配单元,行数因此被重复累加,含大字段的表会显示成数倍大小。现在先按分区聚合分配单元再连接
  • 空表被当成未知:COUNT(*) 返回 0 是已知大小,分箱时却按中位数计重,空表越多分箱越偏。现在 Oracle NUM_ROWS、SQL Server 分区行数、DB2 CARD 的 0 按空表计重,并保证全为空表时仍按数量均分;MySQL TABLE_ROWS 未收集统计时仍按未知处理,PostgreSQL 14 起读作 -1 的表也按未知,这些表可用「精确统计行数」补齐
  • 源库短暂不可达会停掉 CDC:Oracle LogMiner、PostgreSQL 逻辑复制与 SQL Server CDC 把「连不上源库」和「写目标端失败」记进同一个连续失败计数,一次约半分钟的网络抖动就会把任务置为错误状态、需要人工清除。现在只有应用数据失败才累计并停用,源端连不上按退避无限重连(与 MySQL 消费者一致)
  • 停止 CDC 可能被建连卡住:消费者启动时建立两端连接的过程原先占着管理器锁,期间点「停止」要等连接超时后才返回。现在连接在锁外建立,停止会立即返回;若停止发生在建连期间,启动方放弃注册并释放租约
  • 超大行数显示为负:单表基线超过 21 亿行时,行数计数按 32 位整数回绕成负数,任务列表与「有变化」判定跟着错。现在全程 64 位;变更日志的行数列超限时饱和到上限而不是回绕
  • 排队重跑可能无人执行:持锁者恰好在本轮结束时退出时,队列里的重跑要等到下一次触发。现在这条重跑会被抢占者自己接走。删除任务时同时清掉本节点的重跑排队、重试计数与停机标记,复用同一 id 的新任务不会继承一条幽灵周期
  • 启动 banner 的版本号过期:发版时只改 pom,banner 里的版本是写死的独立文本,v1.8.1 启动时仍打印 v1.8.0。现在 banner 取构建时写入的 app.version,只改 pom 即可跟随;并加了测试,写死版本号会失败
  • 「导出 CSV」按钮缺图标:批量预览页的按钮引用了一个不在图标集里的 download,页面上只剩一块空白。现在补齐图标,并新增测试保证模板里每个图标引用(含 fragments/)都能在图标集中找到
  • 预览页让用户勾选已经勾上的选项:勾了「精确统计行数」却一条行数也没取到时(源库不允许 COUNT(*),或表在规划期间被删),页面仍提示「需要大小时可勾选精确统计行数」。现在说明精确统计也没取到行数及其可能原因

安全加固

  • CSV 导出防公式注入:表名与任务名可被构造为以 =、+、-、@ 开头的单元格,表格软件打开导出文件时会当作公式执行。现在这类字段前加单引号,普通名称不受影响

兼容性说明

  • 默认行为不变:不进入「批量创建」页面就不会读取任何表清单;已有同步任务、调度与 CDC 行为不变
  • 无数据库结构变更、无新增配置项:替换 jync.jar 重启即可

测试

  • 2688 个测试:2687 通过,0 失败;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

升级

  • 替换 jync.jar 重启即可;升级前备份 ./data 与 application.yml
  • 容器部署将镜像 tag 更新为 jync:1.8.1

v1.8.0

v1.8.0 发布于 2026-10-24

企业门户的现有账号可以直接登录 Jync:支持「账号密码(OA 接口校验)」「网关头」「票据 / SSO」三种统一认证方式,同一时刻只生效一种;导航按「配置管理」「日志管理」分组,新增系统日志查询页。界面把「项目」统一改称「同步任务」。升级后外部认证默认关闭,本地账号登录行为与 1.7.8 一致。

新功能

  • 统一认证:「配置管理 → 外部认证」(/external-auth)集中配置。账号密码模式由服务端 POST 到 OA 登录接口,支持表单 / JSON、字段映射、data.user 点路径与成功标识;网关头模式只采信可信代理转发的身份头;票据模式由登录中心签发一次性 ticket,校验通过才建立会话。三种方式互斥生效
  • 管理员与登录策略:配置中的用户名列表命中即管理员;外部用户只保留会话,不写入本地用户表,也没有本地改密入口。完成外部认证配置后可关闭本地登录,保留 JYN_RESET_LOGIN=true 应急恢复
  • 导航分组与系统日志:导航按「配置管理」「日志管理」分组;新增 /system-logs 页,按文件、级别与关键字过滤,命中内容高亮,滚动归档按 gzip 解压读取,单次最多扫描 16 MB、返回最近 1000 条匹配行
  • 界面统一改称「同步任务」:导航、看板、列表、详情与设置中的「项目」文案全部改名;路由、数据表与 API 不变
  • 按需核对行数:同步任务详情的「各表同步进度」卡新增「核对行数」,逐表串行对比源库与目标库的 COUNT(*),展示源行数、目标行数、差值与状态,支持单表重新核对。只在确认后执行,单侧超时 15 秒,缺表、超时与其他异常分别标记,仅管理员可见
  • 全量对比加载预警:同步任务详情页按各表行数估算全量对比耗时,超过 full-compare-max-rows(默认 20 000 行)的表提示需要全表扫描;估算耗时明显长于当前对比间隔时一并给出建议间隔,当前间隔已经更长时不显示更短的建议
  • 停止同步立即生效:此前「停止同步」只取消调度,正在跑的全量仍握着同步锁数分钟,期间保存配置一律被拒「请先停止同步」。现在停止会通知本轮在下一个已提交批次边界安全退出(已写入的数据与断点保留,不截断任何一次写入),随后释放锁;任务状态记为「已停止」而不是失败,连续停止不会把健康任务推向错误停机
  • 同版本重发也能发现:发布方在同一 tag 下重新上传 jar 时版本号不变,只比版本号的检查会一直说「已是最新」。现在版本号一致时再比对一次发布制品:GitHub 用附件 SHA-256,Gitee 退化为 HEAD 取 Content-Length;只有能证明不同才提示「同一版本号的安装包已重新发布」,同版本一键升级也仅在制品确认不同时放行。设置的版本卡可「忽略此提示」,发布方再传新文件会自动重新提醒;新增配置 app.update-check.match-artifact(默认 true)
  • 卡住的同步轮次不再静默:一轮执行没有返回时,@DisallowConcurrentExecution 会让调度跳过它之后的所有触发,页面只剩一个已经过去的「下次自动运行」时间,看起来像「调度停了」。同步任务详情页现在显示「上一轮仍在执行:最近一次进度在 N 分钟前」;无进展超过 sync.stuck-threshold-ms(默认 30 分钟,设为 0 关闭)时标红「疑似卡死」,并说明需要重启本实例——等待不会恢复,强制解锁只清锁记录、不会结束线程。日志对同一轮只告警一次
  • 任务详情页布局:电脑版把「捕获策略」与「同步对象」并排成两列,右侧依次是「同步选项」「调度」「全量加载性能」「CDC 空闲轮询」;窄屏按 捕获策略 → 同步对象 → 同步选项 → 调度 的顺序堆叠

修复

  • 版本卡构建时间按服务器时区显示:标注 UTC±HH:MM 偏移,不再出现「11 点构建却显示 03:20」的错觉
  • 日志文件固定 UTF-8 编码:JDK 17 在中文 Windows 上默认 GBK,写入与系统日志页读取现在使用同一编码,中文不再乱码
  • 外部用户名清洗:OA / 票据 / 网关头返回的用户名去掉控制字符并截断 64 字符,避免不可见字符进入会话与导航
  • 票据入口按客户端 IP 限流:同一地址 20 次校验失败后暂停 15 分钟,匿名调用无法持续触发外呼与审计写入
  • 空闲同步轮次不再刷 INFO 吞吐日志:只有目标行数实际变化才记 INFO,未变化的整表比对与少量尾部批次降到 DEBUG,摘要新增 changed= 字段
  • 初始加载日志说明「已是最新」的行数:目标表被重建或此前已部分写入时,重载会读到目标已持有且值相同的行,upsert 不会改动它们;旧日志只写 50 row(s) inserted (53 scanned),对照目标 53 行容易被误读成少算了。初始加载现在写成 50 row(s) inserted (53 scanned, 3 already up to date),增量窗口与整表重扫的周期保持原样,避免每轮刷屏
  • 认证方式切换后旧入口不再放行:POST /login/oa 只在账号密码模式生效,/sso/entry 只在票据模式受理
  • 系统日志关键字高亮按原文下标定位:İ 等大小写映射会改变长度的字符此前会让高亮偏移甚至越界,现在在原字符串上逐位比较
  • 并行度帮助文案与能力对齐:不再声称只支持单列整数主键,改为说明整数前导键按区间切分、其余键形态按采样边界切分、无主键表顺序加载
  • CDC 停车后仍自动重连:被源端踢下线(同一 server_id 冲突)或断流重连期间 isConnected() 为 false,旧代码跳过断开,keepalive 线程约每 2 分钟继续重连,已停车的任务仍在拉流并占用同一 server_id。现在停车与停机路径都无条件断开客户端
  • CDC 任务的「清空进度」改为拒绝:进度行对 CDC 没有意义(基线会自行全量重载,流式回放只看位点),旧入口会报成功却什么都没改变;现在提示使用「重建基线」,详情页同时隐藏该按钮
  • 停止后保存配置不再重复劝停:任务已停止、但上一轮还在收尾时,保存配置改为提示稍候,并说明确认长时间无进展时才使用「强制解锁」,不再重复「请先停止同步」
  • 上一轮的过期租约不再显示成「还锁着」:已过期、且本实例没有轮次在跑的租约只是上一轮留下的行,下一次取锁会直接接管。页面改显示灰色「上一轮残留(已过期)」并隐藏强制解锁;过期但本地仍有轮次持有时,保持红色与强制解锁
  • 过期页面自动刷新:另一个标签页保存过配置后停留在旧页面,点「开始同步 / 立即同步」收到「配置为空」拒绝时,确认后自动刷新;页面有未保存修改时不刷新,避免丢编辑
  • 拒绝原因写入诊断日志:「没有可执行的同步工作」记录捕获策略与各开关快照,「同步锁被占用」记录锁持有者与到期时间,便于对照反馈定位
  • 目标表被重建后从头加载:目标表丢失、由 Jync 自动重建时,此前会沿用旧进度,于是这一轮按增量窗口在空表上跑——水位线以下的行永远补不回,写进去的行还被记成「更新」。现在自动建表后重置该表的游标、分块检查点与首次加载标记,按首次加载重灌,变更日志也正确记为插入
  • 源库授权收回不再误删目标表:源库账户对某张表的 SELECT 被收回后,这张表会从权限过滤后的清单里消失,与真的整表删除长得一模一样,旧逻辑会据此把目标表一起删掉。现在只有在源库账户能看见整个 schema(表属主、库级 SELECT、SELECT ANY TABLE、SQL Server VIEW DEFINITION,PostgreSQL 系恒可见)时,清单缺项才当作源端删表;否则保留目标表,每个同步任务每类对象只告警一次并说明补救办法。可见性探测只在确实有删表候选时才向源库查询,健康轮次没有额外开销
  • 一键升级遇到限流时给出可操作提示:Gitee 与 GitHub 的匿名 API 都按 IP 限流,超限时返回 403。升级弹窗此前只显示「Gitee API responded 403」,看起来像发布包不存在。现在 403 / 429 统一说明为「Gitee 拒绝了匿名请求(HTTP 403,通常是匿名调用限流)。请切换下载源,或稍后重试」;下载源仍严格按用户所选,不静默换源。设置页的版本检查仍是 GitHub 优先、失败自动回退 Gitee,行为不变
  • CDC 批量写入不再退化为平方复杂度:事务内同一主键的多个镜像此前靠逐个扫描折叠,批量 REPLACE / MERGE 或数据修复会随事务行数呈平方增长——十万行的事务光折叠就要二十多秒,消费线程期间不推进位点。现在按主键索引折叠,代价随行数线性;同一事务内同一行的多个镜像只按最终结果下发一次,目标端语句也更少

安全加固

  • 网关头模式只信任直接 TCP 对端在可信代理列表内(默认仅回环)的请求;共享密钥加密存储、常量时间比较,密钥无法解密时一律拒绝
  • OA / 票据地址只接受 http(s),明文 HTTP 必须显式开启;重定向一律不跟随;响应体上限 64 KB;超时可配
  • 本地账号与 OA 共用「用户名 + 客户端 IP」失败计数(5 次失败锁 15 分钟);票据入口按 IP 单独限流
  • 失败审计只记录用户名、来源与错误类别;密码、票据与外部响应内容都不写日志与审计
  • 系统日志页文件名白名单加真实路径校验,拒绝 ../ 与符号链接逃逸;外部用户无法访问改密页面

兼容性说明

  • 默认行为不变:升级后 oa_auth_config 只有一行且未启用,访问 /login 会 302 到 /login/local,本地账号表单照常渲染
  • 新增表:oa_auth_config 由 ddl-auto=update 首次启动自动创建;auth_mode 列名避开 Oracle / DM / YashanDB / Oscar 的保留字 MODE。该表随 ./data 一起备份。保存被忽略「同版本重发」提示的 update_artifact_dismissal 同样自动创建,只有一行
  • 新增配置:app.update-check.match-artifact(环境变量 APP_UPDATE_CHECK_MATCH_ARTIFACT,默认 true);关闭后版本检测只比较版本号。另新增 sync.stuck-threshold-ms(默认 1800000,即 30 分钟;设为 0 关闭卡死告警与页面提示);该值高于 10 × lock-ttl-ms(默认 50 分钟)时只有日志告警失效,页面提示仍按配置生效
  • 旧地址:/oa/settings 保留为 302 → /external-auth(仅 GET;旧表单字段已改名,POST 不兼容)
  • 新增环境变量:JYN_RESET_LOGIN(应急恢复,平时不生效)、JYN_COOKIE_SAME_SITE(默认 lax;iframe 嵌入需配合 HTTPS 设为 None,并同时设置 JYN_COOKIE_SECURE=true)
  • 外部认证属于 SSRF 面:地址由管理员填写,只填可信内网地址;网关头模式要求 Jync 部署在网关之后,不能直接暴露
  • 同步行为:既有项目的同步数据路径、消费逻辑与类型映射不变;CDC 仅调整停车 / 停机时的连接释放,并把事务内折叠改为按主键索引(净效果不变)。目标表被自动重建时会重置该表进度并重新全量加载——这张表本就没有数据可丢
  • 删表需要全库可见:开启「允许执行删除」时,源库删表只在源库账户能看见整个 schema 的情况下才联动删除目标表。用有限授权访问部分表的账户下,被收回授权的表会保留在目标端(告警一次)。正常以表属主或库级授权同步的用户行为不变

测试

  • 2604 个测试:2603 通过,0 失败;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过;*IT 需 Docker 另跑

升级

  • 替换 jync.jar 重启即可;升级前备份 ./data 与 application.yml
  • 容器部署将镜像 tag 更新为 jync:1.8.0

v1.7.8

v1.7.8 发布于 2026-10-23

大字段在任意两种受支持数据库之间都能正确同步:读取、绑定与 CDC 缓冲不再把整个值压在堆里;厂商专属类型补齐 DDL 映射与取值归一化,跨方言建表不再产出非法类型名。同时完成登录失败计数、转发头信任与默认口令强制改密等安全加固。

新功能

  • 同步对象面板支持目标表改名:每行「源表 → 目标表」,留空即与源表同名,输入中的空格(含全角)自动去掉
  • 大字段与流式设置卡片:展示流式开关、内联与落盘阈值、单批预算、源端流式、落盘目录与容量、清理策略
  • CDC 状态面板新增缺失 LOB 计数:全局与按表计数,与「语句不被解析」分开统计
  • 全量并行支持所有有主键的键形态:复合键、字符串 / UUID、小数与文本前导复合键均可切分;无窗口函数时自动回退顺序分块
  • 空表 INSERT-first 扩展到 MySQL / PostgreSQL:首次全量写空表时用普通 INSERT 替代 upsert
  • 无主键表可按页续传:目标为空且有可排序列时按页提交并写检查点,重启从目标行数续读

修复

  • Oracle 目标绑定超过 32767 字节失败:大文本 / 大二进制改走服务端临时 CLOB / BLOB,MERGE、INSERT、批处理与单行执行均适用
  • 空串写入 NOT NULL CLOB 报错:空串绑定为空 CLOB,保留「非空的空值」;Oracle VARCHAR2 / CHAR 目标仍按语义存 NULL
  • 大字段整块读入堆 / CDC 大事务缓冲占满堆:大字段改为流式读取,批次按字节预算提交;CDC 超过阈值的值先落盘,事务结束即删除
  • PostgreSQL / openGauss 源端流式无效:读取期间保持只读事务,fetch size 真正生效
  • 厂商类型跨方言产出非法 DDL、取值未归一化:Oracle / SQL Server / DB2 / MySQL 专有类型先归一化,XMLTYPE、UNIQUEIDENTIFIER、MONEY、DATETIMEOFFSET、DECFLOAT、ENUM / SET / JSON 等统一转换
  • LogMiner 行外 LOB 静默跳过:计入缺失计数并限流告警;missing-lob-policy=fail 可改为停住且不推进位点
  • SQL Server 多列大字段断流、临时 LOB 与落盘文件泄漏:读到大值列即落盘;成功、回滚、锁丢失与异常路径全部释放
  • 模拟 upsert 与 CDC 重放重复绑定:一次性流在第一次绑定前报错,可重放值正常执行

安全加固

  • 登录失败计数有界:按用户名 64 字符截断、上限 10000 条,未认证请求无法耗尽内存
  • 转发头只信任显式代理:X-Forwarded-For / X-Real-IP 仅采信回环与配置的代理;cdc-probe 收紧为管理员专属
  • 默认口令强制改密:登录后落在首页,改密弹窗自动打开且不可关闭,看板内容不下发,其他页面与 API 一律拒绝
  • 凭据加密密钥自动轮换:升级后首次启动生成随机密钥并重加密已存凭据,中途失败可续做

限制与兼容性

  • 这是「内存有界」而不是零拷贝:Oracle MERGE 必须用服务端临时 LOB,PG 逻辑解码与 SQL Server CDC 仍整行物化;需要预留落盘空间,PG 源建议调低 full-load-fetch-size
  • 类型映射变化可能改变既有目标 DDL,升级后首次结构同步前建议先做结构预检,或先对空库试跑
  • 新增开关均可关闭回退:sync.lob.streaming-enabled、sync.lob.enable-source-streaming、sync.cdc.logminer.missing-lob-policy
  • 升级后生成的 .key 文件必须随 ./data 一起备份,丢失后已存密码无法恢复;跨机反向代理需配置 app.security.trusted-proxies

测试

  • 2204 个测试:2203 通过,1 个按环境条件跳过;*IT 需 Docker 另跑

升级

  • 替换 jync.jar 重启即可;升级前备份 ./data 与 application.yml
  • 容器部署将镜像 tag 更新为 jync:1.7.8

v1.7.7

v1.7.7 发布于 2026-10-22

预置数据库类型从 17 种扩展到 26 种:新增华为 GaussDB 与中兴 GoldenDB、腾讯 TDSQL、阿里 PolarDB、万里 GreatDB、银联 UPDRDB、星环 KunDB、平安 RASESQL、东方金信 SeaboxSQL。自定义连接可以声明 SQL 方言家族,同步前会预检目标库的标识符长度;结构同步关闭时改为按需读取元数据,降低每轮对源库字典的查询压力。

新功能

  • 华为 GaussDB 预设:与 openGauss 是两个产品,使用 com.huawei.gaussdb.jdbc.Driver 与 jdbc:gaussdb://,默认端口 8000,方言归入 PostgreSQL 系;驱动需自备
  • 九个国产数据库预设:GoldenDB、TDSQL、PolarDB、GreatDB、UPDRDB、KunDB 按 MySQL 协议复用内置 Connector/J;RASESQL、SeaboxSQL 按 PostgreSQL 协议复用内置 pgjdbc,默认端口按各产品控制台实际值修改即可
  • 自定义连接可选方言家族:通用 / Oracle / MySQL / PostgreSQL / SQL Server / DB2。选择后 DDL 生成、upsert 与视图、存储过程正文读取都按该家族执行,不再一律退化为通用 ANSI
  • 同步前预检目标标识符长度:按各产品自己的计量单位检查表名与列名(Oracle 11g 30 字节、12c+ 128 字节,PostgreSQL 63 字节;MySQL 64 字符、SQL Server 128 字符)。超限的表记录 ERROR 后从本轮跳过,其余表照常同步
  • 驱动卡片规则收窄:只有自定义、驱动未内置的类型(GBase、神通、华为 GaussDB)以及 GoldenDB、GreatDB 在打开厂商驱动开关时显示「驱动 jar」卡片;已内置驱动的类型不再显示,避免误填覆盖
  • 驱动类可覆盖、jar 路径支持目录:外部驱动类型可填写驱动类;jar 路径也可以指向存放 jar 的目录,检测驱动类时逐个扫描
  • 系统信息页补充运行参数:新增「全量加载性能」与「CDC 引擎参数」两张卡片,并发参数卡片补齐连接池上限、行数审计间隔、查询 / 元数据超时、停机等待与调度对账间隔

性能

  • 结构同步关闭时按需读取元数据:只读列、主键、自增与游标探测,跳过索引、注释等字典查询;仅在加载顺序真正重要时补读外键
  • 空闲轮次不再重写同步进度行:游标没有推进时跳过进度表更新,长期运行的轮询项目不再每轮产生一次无意义的写库

修复

  • SQL Server 命名实例无法连接:JDBC URL 模板此前固定拼 :1433,而命名实例的端口由 SQL Server Browser 动态解析,连接会在 15 秒后超时;保存连接时还会把清空的端口回填成 1433。现在 SQL Server 允许端口留空:空端口不拼 :port,主机写 主机名\实例名 或在附加 URL 参数中填 instanceName 即可连接;普通默认实例留空同样按 1433 处理。新建连接切换到 SQL Server 时端口框不再自动填 1433,并显示对应提示
  • 自动建表后的延迟二级索引丢失:结构关闭时按需读取的元数据不含索引,数据阶段自动建表虽然用完整定义发出了 CREATE,但随后建二级索引拿到的是精简定义,索引既没创建也没进入重试队列,快照却已记为收敛。现在建表步骤把完整定义交给后续步骤
  • 标识符预检的计量单位:MySQL 与 SQL Server 的官方上限按字符计,预检此前一律按 UTF-8 字节比较,22 个汉字就会被误判超限并拒绝同步;现在按产品各自的单位检查
  • 外部驱动建池失败:创建连接池期间临时切换线程上下文类加载器,修复 GaussDB 等外部驱动「测试连接」时报 Failed to load driver class
  • 结构同步关闭时外键顺序失效:按需读取曾把外键字典一并跳过,而数据阶段仍按外键数量排序;现在只在加载顺序真正重要时补读,避免子表先于父表加载
  • 单表运行时异常隔离:数据阶段此前只隔离 SQLException,映射或方言缺陷抛出的运行时异常会中断后续所有表;现在单表失败记录后继续下一张,并显式回滚未提交批次
  • SQL Server 约束开关逐表执行:NOCHECK 没有库级写法,改为按表逐个执行;重新启用失败时废弃物理连接,避免把约束仍关闭的连接放回池中
  • 索引重试队列非空时暂不写表快照:避免后续轮次把该表当作已完成而不再重试索引
  • 类型切换残留 / 保存时校验覆盖类 / 新预设元数据路由 / 自定义库错误文案:切换类型清空驱动类覆盖;以实际生效的驱动类判断是否需要外部 jar;GreatDB、UPDRDB、KunDB 走 MySQL 读取器,RASESQL、SeaboxSQL 走 PostgreSQL 读取器;自定义库测试连接改用可翻译文案键
  • 相同失败日志一分钟内只记录一次:按项目 / 对象 / 变更类型 / 消息去重,60 秒窗口内的重复失败跳过;成功记录与消息变化的失败照常写入
  • 空闲轮次的重复日志:2 秒轮询下空闲项目每天约写 8.6 万条触发/完成日志,多实例被动方还会反复写锁跳过记录;现在触发明细与锁跳过降到 DEBUG,空闲项目每 10 分钟保留一条 INFO 心跳,有变化或失败仍立即记录,每天约 17 万行降到 144 行
  • 日志文件没有总量上限:Spring Boot 默认只保留 7 天、不限总量,长期运行会让 ./logs 涨到数十 GB;现在单文件 10MB、保留 14 天、总量上限 500MB,启动时清理超限归档与滚动中断的临时文件
  • 测试运行写入运行日志:mvn test 此前会写入与生产相同的 ./logs/jync.log;测试改用仅控制台的 logback 配置,不再触碰运行日志

兼容性说明

  • GaussDB 与 openGauss 的驱动、URL 前缀均不相同,请按实际产品选择预设,不要混用
  • PolarDB 的 Oracle 兼容版是 PostgreSQL 协议产品,使用自定义类型、选择 PostgreSQL 方言家族并配上 com.aliyun.polardb2.Driver
  • GoldenDB、GreatDB 若要使用厂商自己的 jar,在连接表单中打开厂商驱动开关后填写驱动类与 jar 路径即可覆盖
  • 仓库内置的预置只保证协议兼容(MySQL / PostgreSQL);厂商要求使用自己的 jar 时,同样通过驱动覆盖处理

测试

  • 1749 个测试:1748 通过,1 个按环境条件跳过;*IT 需 Docker 另跑

升级

  • 替换 jync.jar 重启即可,表结构随 ddl-auto: update 自动演进(本次新增 database_config.dialect_family 列);升级前备份 ./data
  • 已配置的外部驱动连接无需改动:驱动类留空即继续使用预设值
  • 容器部署将镜像 tag 更新为 jync:1.7.7

v1.7.6

v1.7.6 发布于 2026-10-20(10-20 第二次覆盖更新)

首次全量同步大幅提速:默认 2 路分块并行、断点续跑,500k 行 Oracle 基准端到端快约 40%;同时随包发布只读预览、项目克隆、列清洗规则,并完成 Oracle 11g / GBK 适配。

性能

  • 全量分块并行:默认 2 路(上限 8,按连接池自动收敛),可按项目覆盖;仅单列整数主键表启用
  • 断点续跑:keyset 分页 + 分块检查点,中断、重启后从已完成分块继续;检查点绑定区间边界,并行度或数据边界变化时自动作废重来
  • 全量专用批次:full-load-batch-size / full-load-fetch-size 默认 2000,增量与 CDC 回放不受影响
  • Oracle 空目标 INSERT 优先:首次全量写入空表改用 INSERT,500k 行基准约为 MERGE 的 2.3 倍;非空目标仍用 MERGE
  • 新建表索引后建:非唯一二级索引等到首次全量提交后再创建,500k 行 Oracle 基准端到端快约 42%;主键与唯一索引仍立即创建
  • 吞吐日志:每个分块输出行/秒、读写占比与批量形态,便于现场定位瓶颈

新功能

  • 只读数据预览:详情页查看源 / 目标表内容,最多 100 行、单元格超 500 字符截断,仅管理员可用,不提供写入、筛选、排序或导出
  • 项目克隆:复制同步设置,不带游标、检查点与 CDC 位点;目标库需重选,「首次加载前截断」强制关闭
  • 列清洗规则:写库前按表按列执行去首尾空白、大小写转换、空白转 NULL、去前后缀、正则替换七种固定操作;轮询与日志 CDC 都生效
  • 全不选即不同步 / 空配置禁止启动:显式取消全部对象即表示该类别不同步;无对象、或轮询下同步选项全关时前后端均拒绝启动并说明原因(CDC 不受影响)
  • CDC 下隐藏轮询开关:日志 CDC 模式隐藏不参与增量流的五个同步选项,已保存的值原样保留

修复

  • Oracle 11g LogMiner:按服务端版本读取 V$LOGMNR_CONTENTS,不再引用 11g 不存在的 SRC_CON_ID;重复日志按线程号 + 日志序列号判重,修复 ORA-01289
  • ZHS16GBK 等字符集:内置 orai18n,修复字符集转换失败与对象列表为空
  • LogMiner 权限探测:补 SELECT ANY TRANSACTION 检查,缺失时给出可直接执行的授权语句
  • 并行全量:停止请求可传播到 worker 并等待其退出;截断或重置进度后不再复用旧分块检查点
  • 分页兼容:DB2 改用 FETCH FIRST;SQL Server 首屏改用 TOP,修复 2008/R2 上的语法错误(CDC 仍需 2012+)
  • 列清洗 / 克隆 / 预览:清洗不再改写分块边界,正则与替换串保存时即校验;克隆与配置复制单事务提交;预览与列结构接口仅管理员可用

测试

  • 1561 个测试:1560 通过,1 个按环境条件跳过;*IT 需 Docker 另跑

已知边界

  • openGauss 目标的 upsert 无挂条件的位置,源库没动时仍会多报更新
  • 空闲轮仍会重读并重发游标边界那一秒的行(有意的迟到事务安全余量),由目标侧守卫吸收

v1.7.5

v1.7.5 发布于 2026-10-17(10-17 覆盖更新)

AI 配置接入本地模型,并修掉一批已定位问题:新增 Ollama(本地)预设与深度思考档位;同时在安全、结构同步、日志 CDC、类型转换四个方面做了修复。

新功能:Ollama(本地)预设

  • 协议下拉新增 Ollama(本地):选中即把地址填为 http://localhost:11434/v1,超时放宽到 300 秒
  • 本地端点不需要密钥,选中后 API 密钥栏自动收起并置为不提交 —— 折叠起来的旧值不会被悄悄提交上去
  • 走的是 Ollama 的 OpenAI 兼容端点,不是原生 /api/chat:原生接口按行返回裸 JSON、不带 data: 前缀,会被流式解析器读成「网关把整段回复缓冲了」,草稿的流式输出会静默失效
  • 已有的 OpenAI 兼容配置本就能连 Ollama,无需改动;这个预设只是把地址、超时与字段可见性一次配好

新功能:深度思考档位

  • 每个供应商可选 跟随模型默认 / 关闭 / 低 / 高
  • 关闭思考对本地推理模型不只是提速:思考 token 计入输出预算,max_tokens 偏小时正文会被思考挤空,界面上表现为一直转圈、然后报「模型返回了空内容」。本机 Ollama + qwen3:8b 实测同一请求关闭后快约 14 倍
  • 落参按协议分流:OpenAI 形状发 reasoning_effort,Anthropic 发 thinking.budget_tokens(它不认 reasoning_effort,发过去就是 400)
  • Anthropic 的思考预算必须严格小于 max_tokens,选低/高档后需一并调大最大 token 数 —— 保存时即校验并提示去调大,而不是等到转换时才 400
  • 跟随模型默认是默认值且一个字段都不发,升级不改变任何已有供应商的请求;端点探测也永不携带推理参数(它是 max_tokens: 1 的最小请求,带上必被端点拒)

新功能

  • 首启自动生成加密密钥:全新部署不再使用发行包里的公开默认密钥,密钥落到数据库同目录的 <库名>.key(POSIX 权限 0600)。已有数据库与显式配置保持原行为
  • 下载包 SHA-256 校验:一键升级在体积与 zip 完整性之外再核对哈希,不匹配即失败关闭、运行中的 jar 不动;Gitee 无校验和时用同一 tag 到 GitHub 核对
  • 目标连接建表权限预检:目标账号没有建表权限时,连接测试阶段就报出来并给出可直接照抄的 GRANT 语句,不再等到结构同步建表才报 ORA-01031

修复

  • 运行中改端点 / 表映射:项目已开启或仍有未过期租约时,修改源库、目标库、表选择或表名映射会被拒绝,编辑页直接给出提示;保存运行中项目所依赖的连接配置同样被拒,避免在途轮次换主机/凭据
  • 换库后的旧同步状态:停止状态下切换端点会清空旧端点组合的游标、分块检查点、结构快照与 CDC 位点,下次启动走全量,不再拿别的库的水位起步而静默漏数据
  • 空保存写库:编辑页原样保存不再刷新 updated_at、不再追加一条 PROJECT_SAVE 审计、也不重建轮询触发器(节奏不会从此刻重新起算)
  • CDC 故障摘要残留:致命故障恢复后状态已回到 RUNNING,详情页却仍展示上一次 SERVER_ID_CONFLICT 等错误原文;消费线程启动时一并清空摘要。同时新增与「停止」配对的「启动」变更日志行,重启不再看起来像反复崩溃
  • CDC 上次同步时间:纯流式通道实际应用并提交变更时推进「上次同步」,不再一直停留在消费线程启动时刻
  • Oracle 建表列子句顺序:DEFAULT 移到 NOT NULL 之前,修掉 ORA-00907 / ORA-03076;目标侧类型判定补上 Oracle 原生浮点与 BIT 宽度
  • 目标表已存在时反复建表失败:按厂商码 955 识别重复对象(中文环境文案不再漏判),缺失的列改为自动补上 —— 只增列,不改类型也不删列
  • 空闲轮询刷假更新:水位线故意回退 1 秒作安全余量,导致每秒窗口重放尾部行;四个方言的 upsert 现在只在值确实有差异时才更新 —— MySQL 对值未变的 upsert 报 0 行影响会被跳过,而 Oracle 的 MERGE 固定报 1,两边口径由此对齐
  • 空闲轮询日志刷屏:incrementalLoad 原先只要读到行就记 INFO,改为真的发生变更才 INFO,否则降到 DEBUG
  • 失败摘要刷屏:多条同因错误归约成一句,弹窗不再逐条弹出;完整报错(含 DDL 原文)仍在项目详情的「变更日志」里
  • LogMiner 不可复现的变更:日志里缺列时不再把目标列静默写成 NULL(外联 LOB、MINIMAL 补充日志等情形),改为拒绝该变更
  • LogMiner 挖掘会话 NLS:时间戳不再渲染成带中文 NLS 的文本字面量(会让目标库解析失败并 park 整个项目);MySQL 时间文本按目标列类型绑定
  • SQL Server 增量停止:中途停止时放弃半成品事务窗口,避免折叠出错误的 DELETE 并永久跳过尾部
  • 类型映射与建表 DDL:BIGINT UNSIGNED 溢出、PG enum / 数组的内部类型名、TIME WITH TIME ZONE、伪数字默认值(NaN / 0x1p4)、DB2 自增列、MySQL 无键 AUTO_INCREMENT 等多处转换异常
  • JDBC 元数据空列名:跳过 COLUMN_NAME 为 null 的行,不再让整表元数据读取失败
  • 超长字段校验:名称等字段超限由服务层显式拒绝并返回 400,不再是 500
  • 一键更新脚本:路径含单引号时按 POSIX 规则转义

覆盖更新(2026-10-17)

  • 只读数据预览:项目详情页可直接预览源表 / 目标表的当前数据,并列出列结构、候选游标列;接口仅管理员可用,访客页面不渲染入口
  • 项目克隆:从一个已有项目派生新项目并复制全部同步设置(目标库可另选),一次性在同一事务内完成;克隆强制关闭「首次全量前清空」,不会因为复制配置而误清目标表
  • 列清洗规则:按表按列配置 TRIM / UPPER / LOWER / 空串转 NULL / 去前后缀 / 正则替换,写入目标库前统一修正字符串列;只作用于字符串列,数值与日期列原样写入
  • 字符串主键清洗漏行:分块全量续传的 keyset 边界改为在清洗前取原始键,修掉清洗改写主键后下一页从错误位置继续、整表漏行的问题
  • 替换串保存即校验:正则替换的替换内容按 Java 实际语义校验($n 分组回落、${name} 仅限命名分组、结尾反斜杠、超长组号),非法值在保存时提示,不再等到每个同步周期才失败
  • 克隆的安全细节:复制配置改用 JSON 树原样搬运,未知字段不丢;创建与复制合并为一次事务,失败不会留下空项目或半初始化项目
  • 预览的边界情况:请求网络失败时弹窗给出错误提示,不再永远停在「加载中…」

测试

  • 单元测试 1208 → 1463,全量通过;新增覆盖推理档位按协议落参、Ollama 端点路径解析与未知协议名回落、upsert 差异守卫(含真库 IT)、SHA-256 校验与跨镜像核对、建表权限预检(Oracle 23ai 真库)、类型映射与列子句顺序、CDC 事务窗口截断、运行中编辑守卫与换端点清状态、空保存不写库、CDC 启停日志配对与故障摘要清理;覆盖更新后再补列清洗命中字符串主键时的分块边界、替换串的 Java 语义校验、克隆的单事务与首次截断关闭、预览/列结构接口的管理员限制

已知边界

  • openGauss 目标的 upsert 无挂条件的位置,源库没动时仍会多报更新
  • 空闲轮仍会重读并重发游标边界那一秒的行(有意的迟到事务安全余量),由目标侧守卫吸收

v1.7.4

v1.7.4 发布于 2026-10-16

MySQL → Oracle 建表问题根治版:v1.7.3 修复了版本探测不到时误发 12c identity 语法的问题,但同版本覆盖无法被一键升级发现、仍有用户运行旧包。本版在版本门控之外增加实机语法探测,并在设置页显示构建时间戳,同版本的不同构建从此可区分。

修复:Oracle identity 语法增加实机解析探测

  • 版本号(产品版本与 COMPATIBLE 取小)现在必要但不再充分:经 Oracle 线路协议到达的非 Oracle 库、特殊兼容配置可能报告现代版本却拒绝 AS IDENTITY
  • 建表前通过 DBMS_SQL.PARSE 对一张不存在的表做只解析、不执行的探测:ORA-0942(语法通过)→ identity;ORA-0907 / 02000(语法不认识)→ 强制降级为全版本合法的「普通列 + SEQUENCE + BEFORE INSERT 触发器」
  • 探测或连接出现任何异常同样安全降级,不再赌现代语法;真实容器验证 11g 报 ORA-02000 降级、23ai 报 ORA-0942 放行,探测零对象产生

新功能:设置页显示构建时间戳

  • 「当前版本」旁显示构建时间,例如 构建于 2026-10-15 13:32 UTC:版本号相同的覆盖包可区分,反馈问题时提供该时间即可确认运行的构建
  • 时间统一 UTC,跨时区一致;无 build-info 的开发构建不显示

测试

  • 新增 12 个测试(1196 → 1208),全量通过;真实 11g XE 与 23ai 容器端到端验证探测判别、降级建表、触发器补号、元数据识别

升级

替换 jar 重启即可,表结构随 ddl-auto: update 自动演进;升级前备份 ./data。新版本号可被更新检查正常发现,也可直接在设置页「一键升级」(默认从 Gitee 下载)。

v1.7.3

v1.7.3 发布于 2026-10-15

在线升级能力与 CDC 实时性收尾版:设置页新增「一键升级」,版本检查改 GitHub → Gitee 双通道兜底;三种轮询类日志 CDC 引擎对齐 Flink CDC 延迟语义(捞到变更零等待续读);新增 CDC 聚合变更日志;并修复升级待重启徽章在已是最新版本时仍常驻的问题。

新功能:版本检查双通道兜底

  • 检查更新先请求 GitHub,5 秒内无结果或失败自动改查 Gitee 镜像;两个源都不可达才提示「更新检查失败,稍后自动重试」,单源故障不再误报
  • 成功结果缓存 10 分钟、失败缓存 1 分钟;新增配置 app.update-check.timeout-ms(默认 5000)

新功能:管理员一键升级

  • 设置页发现新版本后可直接「一键升级」,弹窗中选择下载源(Gitee / GitHub,默认 Gitee),访客仍只看到发布页外链
  • 获取 release 中的 jync.jar 地址 → 带进度条下载 → 声明大小 + zip 完整性双重校验 → 旧 jar 改名 .bak 备份、新 jar 原子改名替换 → 写升级 marker
  • 重启二选一:「立即重启」由生成的 detached 助手脚本(bash / PowerShell)自动等旧进程退出、起新进程、探端口就绪,新进程起不来自动回滚 .bak;也可「稍后手动重启」,marker 跨进程保留状态,重启后自动清理备份与脚本
  • 全部接口(含状态轮询)管理员专属;exploded 开发环境直接拒绝,不会误操作 classpath

CDC 延迟对齐 Flink 语义

  • LogMiner / PostgreSQL 逻辑解码 / SQL Server CDC:捞到数据立即开下一轮(0 等待),只有真正空闲才休眠,失败才指数退避 —— 修复此前繁忙成功轮也固定 sleep 1/2/4 秒的自伤延迟
  • 新增项目级「CDC 空闲轮询间隔」配置(cdcIdlePollMs,默认 Oracle 1000ms / PG 500ms / SQLServer 1000ms,读侧 50ms 下限);MySQL binlog 为推送模式不受影响
  • 实际延迟:binlog 近实时推送,其余三种引擎亚秒~秒级

CDC 聚合变更日志

  • 变更日志页对 CDC 高频回放按表做 10 秒窗口聚合,每窗口落一条「N upserts, M deletes(through SCN/LSN/binlog 位点)」,日志页不再被逐行变更刷爆;行数仍为准确合计
  • 消费者停止时补刷最后窗口;元数据库写入失败仅告警不杀消费线程;sync.cdc.change-window-ms=0 可关闭,四种引擎全覆盖

其他改进

  • 目标库连接不再做 CDC 就绪探测;「挖掘账号」字段仅在源端为 Oracle 时显示;探测标题与检查项按源库类型 i18n
  • 项目详情页同步选项:源库中不存在的对象类别默认关闭并禁用勾选
  • 设置页「项目与作者」卡:新增邮箱 vfaner@88.com;多个 QQ 号拆行;个人 QQ 与 QQ 群支持点击唤起 QQ
  • 修复:「新版本已下载,点击重启生效」黄色徽章在已是最新版本时仍常驻 —— 根因是 .badge 等组件的 display 样式覆盖了 hidden 属性,已全局修正
  • README / README_EN 补齐 Docker(Compose / 裸 docker)部署文档;nohup 示例统一带 additional-location 参数

测试

  • 新增 73 个单元测试(1116 → 1189),全量通过;覆盖双通道兜底、升级下载校验 / 改名替换 / marker 恢复 / 重启脚本 / 权限、CDC 退避时序与窗口聚合

升级

替换 jar 重启即可,表结构随 ddl-auto: update 自动演进;升级前备份 ./data。v1.7.3 起也可直接在设置页用「一键升级」完成。

v1.7.2

v1.7.2 发布于 2026-10-14

Oracle 目标端兼容性加固版:修复小写表名同步到 Oracle 会建出「大写正常表 + 带引号小写孪生表」两份对象、数据悄悄落进副本的问题;补齐 Oracle 12c 自增列(IDENTITY)的版本适配与 11g 序列+触发器回退。达梦 / 崖山共用同一套方言,同样受益。

修复:Oracle 表名大小写孪生对象

  • MySQL / PostgreSQL 等小写命名的表同步到 Oracle 时,生成的 DDL 给表名、列名、schema 加双引号但不折叠大小写,Oracle 会建成带引号的小写对象,与无引号的常规大写表(ORDERS)并存 —— 目标库里出现两份同名(不同大小写)表,数据悄悄落进小写副本,已有大写表收不到数据
  • 现在生成的 Oracle DDL 统一把无引号标识符折叠为大写后再引用("orders" → "ORDERS"),小写源表只建出一份常规大写对象,与手工预建的大写表正确汇合;schema 手填值同步规范化
  • 目标表结构校验改按 Oracle 字典的大写口径匹配,消除「表已存在却被判定形状不符」的误报

修复 / 增强:Oracle 自增列(IDENTITY)全链路

  • 自动识别目标版本:12c 及以上用原生 GENERATED BY DEFAULT ON NULL AS IDENTITY;11g 目标自动回退 SEQUENCE + BEFORE INSERT 触发器模拟自增(此前 11g 目标建表直接失败)。版本门控只对真 Oracle 生效,达梦版本号虽为 8 但支持 IDENTITY,不受影响
  • 源端自增识别补齐:新增 ALL_TAB_IDENTITY_COLS 字典兜底,并从 ALL_TRIGGERS 的 BEFORE INSERT 触发器体识别「序列 NEXTVAL 填入 :NEW.列」这一经典 11g 自增写法 —— 此前 11g 源库的序列+触发器自增列同步到目标端会静默退化为普通列;审计类触发器(只写更新时间/更新人)不会误判
  • 结构变更保留自增:ALTER 修改列类型时不再丢掉 IDENTITY 属性(此前只有新增列带自增,改列会静默降级)
  • 全量后推进序列:初次全量用显式 ID 装数,新装的 identity/序列仍停在 1,此后业务侧省略 ID 的插入会主键冲突(ORA-00001);现在全量成功后自动把生成器推进到 MAX(ID)+1(失败只告警不阻断同步)
  • ALWAYS 目标表提前拦截:目标表自增列若是 GENERATED ALWAYS AS IDENTITY,显式插入 ID 会逐行撞 ORA-32795;现在同步前直接给出可操作报错(改为 BY DEFAULT ON NULL 或删表重建),不再跑到数据阶段才失败

测试

  • 新增 20 个单元测试,全量 1116 测试通过
  • 新增 Oracle 23ai 真实容器端到端集成测试:小写源只产生一个大写对象且数据正确落位、全量后序列推进可真实生成下一个 ID、11g 序列+触发器 DDL 在真实服务器上可执行可识别、ALWAYS 目标表预检生效

升级

替换 jar 重启即可,表结构随 ddl-auto: update 自动演进;升级前备份 ./data。停机期间源库变更重启后自动补齐。

注意:此前版本若已在 Oracle 目标建出带引号的小写孪生表,升级后同步会写入常规大写表;小写副本不会被自动删除(删除对象属高危操作),确认数据无误后请手工 DROP。

v1.7.1

v1.7.1 发布于 2026-10-14

日志 CDC 可靠性加固版:上一个公开发布是 v1.5.0(v1.7.0 只打了 tag 未发布资产),本版把 v1.5.0 之后的全部变化一次带齐 —— 日志 CDC 从 1 种引擎扩到 4 种(MySQL binlog / Oracle LogMiner / PostgreSQL 逻辑解码 / SQL Server CDC),并用 Docker 真库矩阵实测 12 条故障路径(binlog 被清理、断线、源库重启、位点失效等)逐一修复;前端弹窗体系统一重做,README 精简重写。

CDC 可靠性加固(Docker 真库矩阵实测)

  • 12 条故障路径实测并修复:binlog purge、网络断线、源库重启、位点失效等场景在真实 MySQL / Oracle / PostgreSQL / SQL Server 容器上逐一演练
  • MySQL:binlog XA 事务与心跳事件正确跳过,不再误报或卡位点
  • Oracle:LogMiner UPDATE 旧镜像处理与水位推进修复,长时间空闲不再丢变更
  • PostgreSQL:逻辑复制 slot 调用签名与 test_decoding 类型转换修复
  • SQL Server:22054 错误自愈、CDC 被 purge 后停放项目、连续失败罢工计数
  • 跨策略切换(轮询 ⇄ CDC)后 autoCommit 状态正确恢复
  • 位点纪律收口:数据提交成功后才推进位点;租约丢失不推进 —— 任何崩溃点都从上一位点重放,由幂等 upsert 吸收重叠

前端 overhaul

  • 统一居中弹窗 JyncDialog:非阻塞黑条提示 + 阻塞白卡确认,flash 横幅改走弹窗,视觉与主程序一致
  • 未保存配置三选一拦截:改动未保存就点执行时,可选「保存并执行 / 不保存执行 / 取消」,不再静默丢弃修改
  • CDC 相关按钮随策略卡实时联动;状态徽章三处口径统一(ERROR 帽优先,徽章永远等于按钮);CDC 停止后状态正确回落
  • 项目列表瘦身、程序化勾选补脏标记、死按钮清除、提示可访问性修复

文档

  • README 精简重写(1024 → 301 行),截图改宫格排版,图片统一迁入 docs/images/

升级

替换 jar 重启即可,表结构随 ddl-auto: update 自动演进;升级前备份 ./data。停机期间源库变更重启后自动补齐。

v1.7.0

v1.7.0 发布于 2026-10-12 · 仅 tag,未发布资产

日志 CDC 四引擎版:在 v1.5.0 的 MySQL binlog 之上,新增 Oracle LogMiner(挖掘 redo 日志流式回放,七项就绪探测,SCN 位点)、PostgreSQL 逻辑解码与 SQL Server CDC(各五项就绪探测,LSN 位点)。四种引擎均可按项目从轮询切换:秒级延迟,INSERT / UPDATE / DELETE 全捕获,不建触发器、只读解析;共用 keyset 分块基线、at-least-once、多实例租约互斥(接管 ≤ 60s)、ERROR 帽、一键重建基线与 CDC 状态面板。本版本只打了 tag 未发布 jar,请直接下载包含全部内容 + 可靠性加固的 v1.7.1。

v1.5.0

v1.5.0 发布于 2026-10-12

日志 CDC(MySQL binlog)捕获策略版:MySQL 源库可按项目从「轮询游标列」切换到「解析 binlog 流式回放」—— Jync 伪装成一台只读从库,INSERT / UPDATE / DELETE 全捕获,秒级延迟,严格按 binlog 顺序回放;全程对 binlog 只读,不建触发器、不写源库。切换前有逐项就绪探测,运行中有状态面板,致命故障有 ERROR 帽与一键重建基线,多实例部署按租约互斥、自动接管。全部新行为都有真实 MySQL 容器集成测试背书。

日志 CDC:探测 → 基线 → 流式 → 接管 → 优雅停机

  • 就绪探测(七项检查):版本(MySQL ≥ 5.7)、log_bin 开启、binlog_format=ROW、binlog_row_image=FULL、server_id 非 0 且不与 Jync 假 id 冲突、REPLICATION SLAVE/REPLICATION CLIENT 权限、binlog 保留 ≥ 24 小时 —— 逐项给出满足 / 不满足与原因,连接测试页与项目策略卡片都会执行
  • 基线:启动时先把当前 binlog 位点(文件 + 偏移,开启 GTID 时含 GTID 集)持久化到 cdc_position 表,再执行 keyset 分块全量装载(复用 v1.4.0 的分块 / 检查点机制);位点先于全量写入,基线期间源库的变更已被续读点覆盖,不会漏;基线中途崩溃则整体重跑,不留半份数据
  • 流式回放:基线完成后从记下的位点消费 binlog,逐事务回放到目标库(与轮询模式共用同一套方言 upsert / 按主键删除写引擎);一致性契约 at-least-once:先提交数据、再复检租约、最后推进位点,任何一步崩溃都从上一位点重放,重叠窗口由幂等 upsert 吸收
  • 故障分类与退避重连:binlog 被清理、server_id 冲突等致命故障 → 项目立即置 ERROR,不再无限重试;网络断线 / 源库重启 → 指数退避自动重连(1 s 起步逐次翻倍,上限 60 s),连接稳定驻留 ≥ 30 s 后才重置退避,避免热循环打爆源库
  • 多实例接管:CDC 消费者按租约互斥,同一项目同一时刻至多一个节点消费;持锁节点宕机后租约在 ≤ 30 s 内过期,其余节点巡检(默认 10 s)抢到租约并从持久化位点续传,总接管 ≤ 60 s(实测 4.0 s),接缝由 at-least-once 重放兜底,不丢事件
  • 优雅停机:应用关闭时在等待窗口内停止消费并释放租约,重启后从持久化位点续传

三策略卡片、状态面板与一键重建基线

  • 项目详情页的捕获策略以三张卡片呈现(轮询 / 全量比对 / 日志 CDC);CDC 卡片仅在源库为 MySQL 且探测全部通过时标注「推荐」;切换有二次确认(明示「切换即重新全量」与「CDC 会复制 DELETE」两大语义差异),操作记入审计日志
  • CDC 状态面板实时展示:当前位点、落后秒数、吞吐、已应用行数、各类跳过计数(DDL、不支持对象、零日期强制转换)与最近错误
  • ERROR 或结构分叉后一键重建基线:停止消费 → 清空位点 → 重新分块全量
  • 连接测试页同步展示逐项探测结果,不满足项直接给出原因

真实环境修复(由 MySQL 容器集成测试首跑抓出)

  • TIME 值改为按源库字面文本全程传递:负值与 ≥ 24 小时的合法 MySQL 时长型 TIME(如 838:59:59、-10:30:00)此前会被 JDBC 驱动直接抛错(整表基线失败)或按钟表时间静默截断,现在原样复制。该修复作用于共享写引擎,存量轮询链路同样受影响,不只 CDC
  • CDC 侧同步修复:binlog 二进制 JSON → 规范文本、BIT 列 BitSet → 大端字节、有符号 TIME2 wire 值解码(负时长不再损坏)、1970 年前 TIMESTAMP 微秒向下取整对齐、binlog 监听器异常不再被吞(经 handler 引用与强制断连上浮)
  • purge 错误措辞分类补全 MySQL 8.0 GTID 形态(「source purged required binary logs… missing transactions」),位点失效能正确落 ERROR 帽而非无限重试

已知限制

  • 日志 CDC 仅 MySQL 源库:MariaDB / TiDB / OceanBase / GBase 虽属 MySQL 家族,但 binlog 方言各有差异,不在 CDC 支持范围(探测直接判不支持);其余源库维持轮询 / 全量比对策略
  • 不捕获 DDL:binlog 中的 DDL 记 WARN 日志后跳过(状态面板有「跳过 DDL」计数),同时失效缓存的表结构;源库改表后需人工对齐目标库结构,差异大到无法对齐时用「重建基线」重新全量
  • 无主键表仅播种一次:基线阶段一次性播种,流式阶段跳过其行事件,并在 CDC 状态面板逐表标注「无主键表,仅基线播种」—— 没有主键就无法幂等回放
  • binlog 保留期若短于停机窗口,位点可能被源库清理(项目置 ERROR);用「重建基线」恢复,并评估调大 binlog_expire_logs_seconds

测试与性能

  • 单元测试增至 847 个(默认套件,Docker 无关),全绿;新增三个 MySQL 8.0 真实容器集成测试类(Testcontainers,*IT 不进默认套件、无 Docker 自动跳过),31 个用例全绿
  • 关键实测:10 万行分块基线 9.9 s;1 万条混合 DML(INSERT / UPDATE / 主键迁移 / DELETE,100 个事务)从下发开始到两端一致 2.5 s,收敛后全表校验和一致;25 项单行类型往返全绿(含 TIME 极端值、零日期、JSON、BIT、四种字符集)
  • 15 s 容器冻结窗零丢失,解冻后追平 0.26 s;故障接管 4.0 s(含测试强制的 4 s 等待窗,即真实接管为亚秒级)≪ 60 s 上限;binlog 被 purge → ERROR 帽落地 0.24 s,一键重建基线恢复 0.8 s

升级

换 jar、重启即可:元数据库(ddl-auto: update)自动新增 cdc_position 表,已存加密口令不受影响。存量项目一律默认 POLLING,行为零变化 —— 日志 CDC 是按项目显式切换的 opt-in(sync_config JSON 新增 captureStrategy 字段,缺省 / null 反序列化为 POLLING,旧配置语义不变),不切就与 v1.4.0 完全一致;另新增六个 sync.cdc.* 配置项(重连退避、假 server id 偏移、租约时长与巡检周期等,均有默认值,完整表见 README)。一处共享引擎行为变化(轮询链路同样受影响):TIME 值改为按源库字面文本端到端传递,负值与 ≥ 24 h 的值现在原样复制、不再抛错或截断成钟表时间 —— 若下游曾依赖旧的(错误)截断结果,升级后请留意此类列的取值变化。

v1.4.0

v1.4.0 发布于 2026-10-10

全量装载可靠性与吞吐版:初始全量从「一条流式查询整表拉完」升级为 keyset 分块 + 每块提交 + 检查点断点续传,崩溃或 kill 进程后从上一块继续、不再整表重来;单列整数主键表还可开启表内并行。Oracle 源新增行级 ORA_ROWSCN 增量游标。全部新行为都有真实 Oracle 容器集成测试背书。

全量装载:分块与断点续传(默认开启)

  • 有主键的表按 WHERE pk > ? ORDER BY pk keyset 翻页(不用 OFFSET,深分页不衰减),每 sync.chunk-size 行(默认 10 万)提交一次,并把翻页边界写入 chunk_checkpoint 检查点表
  • 崩溃 / kill 进程后,重启跳过已提交的块,从检查点边界继续装载;边界重叠处的少量重复投递由幂等 upsert 收敛;全量成功后检查点自动清空
  • sync.chunk-size: 0 可完全回到旧版单条流式读取
  • 无主键表无法分块(没有可翻页、可幂等的键),仍是流式整表拉取,中断即整表重来 —— 项目详情页为此类表标注「不支持断点续传」黄色徽标,悬浮说明加主键即可启用

全量装载:表内并行(默认关闭,升级零惊喜)

  • 单列整数主键表(含 Oracle NUMBER(p≤18,0) 零刻度主键)先 SELECT MIN(pk), MAX(pk) 定界,切成互不重叠的区间,由 sync.full-load-parallelism(默认 1 = 旧行为,上限 8)个 worker 各领一段独立翻页
  • worker 按块借还连接;并行度超过 sync.max-pool-size(默认 5)时在连接池上排队
  • 主键跨度超出 long 安全范围或无法定界时自动回退顺序装载;复合主键、无主键表始终顺序 —— 并行只对能安全切分的表生效
  • 运行中项目详情页实时显示「x/y 段完成、n 块已提交」

Oracle 行级 ORA_ROWSCN 增量游标

  • 建表带 WITH ROWDEPENDENCIES 的表,在没有任何可用的最后修改时间列时,用行级提交 SCN 做游标:已同步行被 UPDATE 也能看见(主键 / 创建时间游标永远做不到这一点)
  • 优先级低于真实的最后修改时间列、高于创建时间列与数字主键;块级 SCN(建表未带 ROWDEPENDENCIES)粒度太粗,不会被选用
  • 按数据库产品名白名单,只在真 Oracle 上启用探测;达梦 / 崖山虽复用 Oracle 字典读取器,但不探测
  • 已知边界:检测不到删除;每轮取 MAX(ORA_ROWSCN) 是一次全表扫描(UI 策略帮助文案均已注明)

真实环境修复(由 Oracle 集成测试首跑抓出)

  • Oracle 分页泄漏辅助列:offset=0 的 ROWNUM 包装把 RNUM_ 投影进结果集,而数据复制按结果集元数据构建 INSERT 列,导致 Oracle 源的分块全量每块必失败;现 offset=0 走纯 ROWNUM <= 封顶,不再产生辅助列
  • 并行门控不认识 Oracle 主键:原门控只认 INTEGER/BIGINT 等 JDBC 类型,而真实 Oracle NUMBER(18) 主键上报为 NUMERIC(18,0),Oracle 源永远进不了并行分段;现放行零刻度且精度 ≤18 的 NUMERIC/DECIMAL,带小数或精度 19(可能超出 long)仍拒绝,避免破坏分段不重叠

测试与文档

  • 单元测试增至 675 个;新增 OracleMigrationHarnessIT:testcontainers + Oracle 23ai Free 真实容器 → H2,验证并行全量、检查点续传与 ORA_ROWSCN 完整链路;类名 *IT 不进默认套件,无 Docker 自动跳过
  • 新增 docs/migration-harness-oracle-to-dm.md:Oracle → 达梦手动验收手册(造数 SQL、项目配置、kill/续传、割接步骤、FAQ)
  • 部署文档修正(发布后补充):README 与快速开始页的外部配置启动参数由 --spring.config.location 更正为 --spring.config.additional-location —— 前者会替换 jar 内置配置,导致登录页显示 ??login.title_zh_CN?? 标记、全新部署不建表。按旧文档部署的用户改一个启动参数即可恢复,数据无损

升级

换 jar、重启即可:元数据库(ddl-auto: update)自动新增 chunk_checkpoint 表与 sync_progress.resumable_load 列,已存加密口令不受影响。一处默认行为变化:有主键表的初始全量默认改为分块装载(每块独立提交 + 写检查点),提交粒度从「整表一次」变为「每块一次」,数据结果不变(写入仍幂等);需要完全恢复旧版行为时设 sync.chunk-size: 0。

v1.3.2

v1.3.2 发布于 2026-10-06(10-07 覆盖更新)

同步链路性能与升级稳定性版。

同步性能

  • 跳过注定失败的 CREATE:每周期开始取一次目标端表清单,命中的表跳过那轮必被「已存在」拒绝的 CREATE;清单获取失败自动回退老的逐表幂等 CREATE 路径,行为不回归
  • 快照稳态零 LOB 读:元数据快照服务新增内存缓存(内容哈希 + 已解析对象),每周期只读 (object_name, content_hash) 投影,仅哈希不一致的行才回读整行解析;空闲数据库上轮询既不重写也不重读元数据库
  • COUNT(*) 兜底带 TTL:统计信息不可用时的行数估算兜底(全表 COUNT)结果 5 分钟内复用,大表不再每隔几秒被全扫一次;不报告 JDBC URL 的驱动不走缓存,避免跨服务器 key 相撞

升级与运行稳定性

  • 修复跨版本升级必挂:content_hash 列自 v1.3.0 才有,从 ≤v1.2.1 升级且开启结构同步后,旧行空哈希使缓存比较每轮 NPE、重启不能自愈。现在空哈希有 null 防护、无哈希行不进缓存,并由下一次保存自动补齐
  • 项目删除竞争同步锁:删除运行中的项目时,未跑完的轮次原本会在删除后「复活」progress/snapshot 孤儿行;现在删除先持同步锁,拿不到锁(有轮次在飞或锁被其他实例持有)即拒绝并提示待本轮结束重试;enabled 但空闲的项目仍可一步删除
  • 批量删除:目标端删除同步改 JDBC 批量提交,大表删除吞吐量不再受往返次数限制
  • 补跑竞态修复:手动同步排队后的补跑改在锁释放后发起,消除排队条目落空的窗口
  • 内存条目驱逐:删除项目时同步驱逐行数审计缓存与 JVM 锁表等内存条目,长运行进程不再随项目建删累积

二次审查加固(2026-10-07 覆盖更新)

  • 租约看门狗:持锁期间由守护线程按 TTL/3 定时续租,长轮次不再因单轮执行超过 5 分钟租约而被其他实例抢占;句柄关闭、续租失败或连续续租达上限时自动停止,崩溃实例的锁仍只靠 TTL 释放,不会死锁
  • 排队补跑自锁窗口:锁被其他实例持有时,本实例排队的补跑不再依赖对方来排空队列 —— 后台线程按 1 秒间隔重试,数据库锁一释放即自行补跑;补跑线程池由单线程改为缓存线程池,消除队头阻塞,并加关闭/拒绝兜底
  • 孤儿定时任务自删除:Quartz 触发时若项目已不存在(极端时序下残留的调度),任务记录告警并自行删除,不再空转报警
  • 事务回滚补偿:删除事务回滚或提交状态未知时,恢复项目的 RUNNING 状态与原调度;提交后的调度动作失败只记日志不外抛,不再出现「库回滚了、任务却停了」
  • 批量删除一致性:SyncTask / SyncProgress 的按项目删除改为 JPQL 批量删除语句,与调用方事务同生共死,不再先查后逐条删;同步移除 ChangeLog 死查询等无用代码
  • 看板排序:仪表盘项目列表按 id 稳定排序,分页后顺序不再随数据库返回顺序漂移
  • 驱动加载器:ensureDriverLoaded 改为 synchronized,并发首载不再可能重复注册类加载器;驱动缓存键分隔符改用不可见的 U+0001,杜绝与合法类名拼接碰撞;驱动加载失败的英文异常统一换成 i18n 键,页面提示全部走中文文案

界面与信息页

  • QQ 群:系统信息页「项目与作者」栏新增 QQ 群(426669837)展示行
  • 官网与微信同排:官网行不再通栏垫底,与微信在双列网格中配对成第三行
  • snapshotDir 行下线:设置页不再展示快照目录(该目录从未被实际读写),配置项与 i18n 键一并移除

打包与内部清理(行为不变)

  • jar 体积再减:静态资源目录移除冗余图片、只保留产品图标,截图移至 docs/
  • 500 文案收敛:意外 API 错误不再回显原始异常(SQL 错误、文件路径属内部信息),统一返回 i18n 键 error.unexpected,原文留在服务端日志
  • 死代码下线:17 处无效 activeNav 赋值、Pager.slice()、冗余 success 字段、重复 logging 配置等;ChangeLog 分页/清空抽取为 ChangeLogService;app.js 提炼 busyLabel 消除 4 处重复加载态片段;经两轮审查加固,单元测试增至 464 个

升级

换 jar、重启即可,配置无需改动,元数据库与已存加密口令不受影响。Thymeleaf 模板缓存恢复默认开启:开发期直接改模板需重启生效,生产无感。

v1.3.1

v1.3.1 发布于 2026-09-26

AI 起草提速与界面观感版:候选 SQL 流式进编辑器、边生成边可见;模型只回转换后的 CREATE 语句; 重复起草走 10 分钟缓存。复审页编辑器与对比框新增 SQL 高亮,全站换细滚动条。

AI 起草提速

  • 流式输出:复审页「用 AI 起草」改走流式(SSE),候选边生成边渲染进编辑器,不再等超时才一次性看到全文
  • 缓冲型网关兼容:整段生成完才返回的自建 / 中转端点自动回退为全文一次渲染;超时语义改为「相邻两包间隔超过设定秒数才断开」,首包等待不受该超时限制,慢模型不再被误判超时
  • 块格式自动识别:端点实际返回的块格式与配置协议(OpenAI / Anthropic)不一致时按行自动识别,仍能正常流式读取
  • 10 分钟起草缓存:同一对象、同一供应商、源定义未变时重复点击立即返回,提示中标注(缓存命中);源定义或模型变了自动失效
  • 输出更直接:模型只回复转换后的 CREATE 语句(无说明文字、无 JSON 包装),编辑器原样呈现;起草完成后页面提醒 —— AI 输出仅为候选,保存为覆盖前请先在目标库人工自测

界面

  • SQL 高亮:复审页的覆盖编辑器与「原始定义 / 自动转换」对比框对关键字、字符串、数字、注释分区着色,风格参照 DBeaver
  • 细滚动条:全站滚动条改细、彩虹渐变、两端圆头,深浅色主题都适配

内部清理(行为不变)

  • 移除 22 项 Java 死代码(无调用方法、只写字段、无调用派生查询)与 12 项前端死规则 / 死资源;单元测试增至 417 个

升级

换 jar、重启即可,配置无需改动,元数据库与已存加密口令不受影响。 元数据库中的 captured_at、task_name 两列本版起不再使用,列会留着(废弃但无害),无需手工清理。

v1.3.0

v1.3.0 发布于 2026-09-24

SyncTool 正式更名为 Jync 捷同:仓库迁至 github.com/vfaner/jync,产物更名 jync.jar; 并打包全项目审查的 27 项可靠性与缺陷修复(快照防护、锁租约心跳、删除检测跨驱动规范化等)。 发布当日两次覆盖更新:新增立即同步补跑与列表分页,并修复 MySQL 时间列精度回归。

更名

  • 项目名 SyncTool → Jync 捷同;包名 com.qqmu.jync,Maven 坐标 com.qqmu.jync:jync
  • 元数据库启动时自动迁移(synctool.mv.db → jync.mv.db),浏览器偏好自动迁移;加密默认密钥不变,已存连接无需重录
  • 1.2.x 的自动更新检查收不到本版通知(旧版不跟随仓库改名重定向),已部署实例需手动升级一次;1.3.0 起跟随重定向

审查修复(节选)

  • 结构变更失败 / 被跳过时不再保存表快照 —— 变更不会丢失,可重试
  • 数据阶段锁租约心跳:租约丢失立即中止本轮,杜绝双实例并发写目标库
  • 源库读不到正文的视图 / 存储过程不再误判消失而删除(保护 allowDrop 下的目标库真实对象)
  • 删除检测键值跨驱动规范化:byte[] / decimal / 时间类型差异不再整表误删
  • cron 表达式校验;项目更新保留启用状态与同步配置;变更日志按保留天数每小时清理

覆盖更新(2026-09-24)

  • 回归修复:MySQL 时间列默认值带与列一致的小数精度(DATETIME(6) DEFAULT CURRENT_TIMESTAMP(6)),修复时间戳精度改动后建表被 MySQL 以 1067 拒绝的问题
  • 立即同步补跑:运行中的点击不再以「正在运行」丢弃,而是登记一轮补跑、本轮结束后自动执行;连点多次合并为一轮
  • 列表分页:项目与变更日志共用分页条(默认 20 条/页,可选 15 / 20 / 30 / 50 / 100,支持跳页与省略号就地展开);看板项目概览与最近活动各限 5 条
  • 界面细节:主题切换图标改金黄色;项目概览表固定列宽、表头与值对齐;变更日志第 2 页起禁用自动刷新并说明原因
  • 文档:README 截图全部换新,默认端口明确为 8080

升级

换 jar、重启即可。老部署脚本改两处:jar 文件名(synctool.jar → jync.jar)与 systemd 单元名。 加密口令必须与之前一致,否则已存的数据库密码无法解密。

v1.2.1

v1.2.1 发布于 2026-09-22

信创数据库支持补强:新增 OceanBase、TiDB、瀚高、海量、崖山五种国产数据库预置,驱动随包内置扩充至十四种; 同时修复 Oracle 服务名连接问题,并对界面做了少量调整。

新增五种信创数据库预置

  • OceanBase、TiDB、瀚高 HighGo、海量 Vastbase、崖山 YashanDB 成为预设类型 —— 加上此前的达梦、金仓、GBase、神通、OpenGauss,信创库预置达到十种,支持的数据库共 17 种(另有自定义类型)
  • 五种新类型均接入专属元数据读取器,类型映射特判改按方言族处理 —— 不是「通过通用 JDBC 也许能连上」,而是一等支持
  • OceanBase、瀚高、海量、崖山的 JDBC 驱动随包内置,内置驱动共十四种;TiDB 兼容 MySQL 协议,复用内置 MySQL 驱动,选 TiDB 类型即可
  • 预置的 OceanBase 对应 MySQL 模式租户(默认端口 2883 为 OBProxy,直连 observer 用 2881);Oracle 模式租户请选「自定义」类型并使用 Oracle 系 URL
  • 崖山 YashanDB 为 Oracle 兼容库(URL 前缀 jdbc:yasdb:),标识符大写折叠与 MERGE upsert 均已适配

问题修复与界面调整

  • Oracle 连接改用服务名写法(12c 及以上 PDB 必须),修复仅登记了服务名的库报 ORA-12505 的问题;确实只有 SID 的老库可选「自定义」类型自行填写旧写法 URL(驱动内置,无需 jar)
  • 「系统信息」页新增作者栏目;导航栏的修改密码与退出登录收进用户下拉菜单

升级

换 jar、重启即可,配置和数据不动。加密口令必须与之前一致,否则已存的数据库密码无法解密。 停机期间源库产生的变更,重启后由游标机制自动补齐。

v1.2.0

v1.2.0 发布于 2026-09-13

异构数据库实时同步工具。开箱即用的可执行 jar,放到内网机器上 java -jar 就能跑,不需要源码、不需要 Maven。 这个版本整合了 v1.1.1、v1.1.2 以及此前未发布的改动,包含新功能和界面调整,因此版本号跳到 1.2.0。

数据库连接区分「源」与「目标」

  • 连接列表拆为源数据库连接、目标数据库连接两个栏目,各自独立分页
  • 新建连接必须选择用途:源(数据读出)或目标(数据写入)
  • 新建项目时源、目标下拉只列出对应用途的连接,不会再选错
  • 升级后原有连接首次启动自动归类(按已有项目的引用关系推断,未被引用的默认为源),无需手工处理
  • 已被项目占用的连接不能反向改用途,页面会提示相关项目名称

常用数据库驱动内置

MySQL、MariaDB、Oracle、SQL Server、DB2、PostgreSQL、openGauss、达梦、人大金仓、H2 共 十种驱动随包内置,不再需要手动往服务器放 jar。 GBase、神通(Oscar)和自定义类型仍需填写厂商驱动 jar 路径。

其他改进

  • 新增「系统信息」页(原「设置」菜单改名):显示当前版本、GitHub 最新版本与本版更新说明;更新检查在后台进行,不拖慢页面,纯内网也能看当前版本和更新内容,也可用 --app.update-check.enabled=false 关闭
  • 变更日志页支持手动 / 自动刷新(5 秒一轮,不整页重载),第二页之后自动刷新自动停用以免阅读时行位跳动
  • 新建连接时默认端口随数据库类型自动联动
  • 修复删除正被项目占用的连接时错误提示显示为英文代码的问题

快速开始

bash
java -jar jync.jar

访问 http://localhost:8080, 用 admin / view(初始密码均为 123456)登录。

升级

换 jar、重启即可,配置和数据不动。本次会自动给元数据库加一列保存连接用途,启动日志出现 Backfilled source/target role... 即归类完成;升级后建议到连接页核对一眼, 需要当目标用的连接在编辑页改用途即可。加密口令必须与之前一致, 否则已存的数据库密码无法解密。停机期间源库产生的变更,重启后由游标机制自动补齐。 从 v1.0.0 升级请先读 v1.1.0 发布说明。

首次启动必读

  • 改掉初始密码:内置 admin / view 两个账号,初始密码都是 123456,登录后点右上角用户名修改;忘记密码无法找回,只能删除元数据库 app_user 表对应行后重启
  • 覆盖加密口令:jar 内置公开默认密钥,首次保存连接前请通过 --sync.crypto-password 和 --sync.crypto-salt 设置自己的口令,否则存进去的数据库密码等于明文
  • 固定数据目录:程序在启动目录下创建 ./data(元数据库,含加密凭据)、./logs、./snapshots,请固定在同一目录启动;元数据库文件按凭据对待,不要提交到版本库

环境要求

  • JDK 17 或以上
  • GBase、神通(Oscar)和自定义数据库需要自备厂商驱动 jar

v1.1.0

v1.1.0 发布于 2026-09-07

本次更新:登录与权限。 v1.0.0 完全没有鉴权 —— 任何能访问到端口的人都可以调接口改数据库连接和 AI 配置,建议所有 v1.0.0 用户升级。

  • 所有页面和接口都必须登录后才能访问,没有匿名入口
  • 两个内置角色:admin(管理员,全部操作)和 view(访客,只读)
  • 权限按 HTTP 方法判定:所有写操作都是 POST,规则只有一条「POST 一律要求管理员」,新增 POST 接口自动受管
  • 访客能看到全部数据,但界面上不出现写操作按钮,直接构造请求打接口也会被拒
  • 两个角色都能自助修改密码(当前密码 + 新密码至少 6 位)
  • 启用 CSRF 防护;登录密码用 BCrypt 单向哈希存储

v1.0.0

v1.0.0 发布于 2026-09-04

首个公开版本:异构数据库实时同步,结构 + 数据一起同步,单个 jar 启动,零外部组件。 GitHub 发布页 ↗