COMMON QUESTIONS

常见问题

关于 Jync 你最关心的 22 个问题,包括我们不擅长的地方

Jync 需要什么外部依赖?

零外部依赖。 不需要 Kafka、ZooKeeper、消息队列、容器编排 —— 甚至不需要数据库。工具自身使用 H2 内嵌数据库存储元数据,一个 jar 即可启动。前端资源全部在仓库内;未启用外部认证、AI 与更新检查时,运行时不发起任何外部请求,内网离线完全可用。v1.13.0 起可把 Redis 配为同步目标,但目标完全可选:不配置 Redis 时仍是一个零外部依赖的单 jar。

支持哪些数据库?

MySQL、MariaDB、Oracle、SQL Server、DB2、PostgreSQL、OpenGauss、华为 GaussDB、达梦 (DM)、人大金仓 (KingBase)、OceanBase、TiDB、中兴 GoldenDB、腾讯 TDSQL、阿里 PolarDB、万里 GreatDB、银联 UPDRDB、星环 KunDB、平安 RASESQL、东方金信 SeaboxSQL、瀚高 (HighGo)、海量 (Vastbase)、崖山 (YashanDB)、南大通用 (GBase)、神通 (Oscar)、SAP HANA、Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB、MongoDB 原生驱动、H2 共 34 种,以及自定义数据库(提供 JDBC URL、驱动类名与驱动 jar 路径,运行时动态加载)。其中 SAP HANA 支持结构同步、轮询式数据同步与实时同步;Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB(Atlas SQL)可作实时同步源(轮询 / 全表比对,按无主键读取),不作目标。

共二十五种驱动随包内置(MySQL、MariaDB、Oracle、SQL Server、DB2、PostgreSQL、openGauss、达梦、人大金仓、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB、GreatDB、UPDRDB、KunDB、RASESQL、SeaboxSQL、瀚高、海量、崖山、Doris、MongoDB 原生驱动、H2),其中 MySQL / PostgreSQL 协议产品复用对应驱动,开箱即用; 仅 华为 GaussDB、GBase、神通 Oscar、SAP HANA、ClickHouse、Hive、Impala、Elasticsearch、MongoDB(Atlas SQL)与自定义数据库需在连接配置中填写厂商驱动 jar 路径,工具会用独立 URLClassLoader 动态加载,不污染应用类加载器。

能和 Debezium、Canal 这些工具比吗?

适用场景不同。Jync 定位在部门级、信创迁移、内网离线场景 —— 一个 jar 启动,浏览器点几下就能跑;单表大表也能靠 keyset 分块 + 表内并行搬完,批次大小与并行度可按同步任务调(目标库吃紧时调小)。Debezium/Canal 在毫秒级延迟和大规模流式处理上更强,但需要一套完整的基础设施。

如果同步需求的规模配不上一套流式基础设施的运维成本,Jync 是决定性的选择。完整对比(含「适用边界:什么场景该换别的工具」)见 21 维度对比表。

另外,Jync 自带 Web 控制台与 v1.8.0 的企业统一认证(OA 账号密码 / 网关头 / 票据 SSO);Debezium 的 Web UI 面向 connector 运维、Canal 没有内置界面,两者都不提供业务账号与单点登录。

支持结构同步吗?

支持。结构同步是 Jync 的一等公民 —— 自动读取源库元数据,按目标库方言创建表、索引、视图、存储过程,并在源库 DDL 变更后把差异传播过去。

跨异构库迁移里,建表和类型映射的工作量往往比搬数据本身更大。这是 Jync 和大多数 CDC 工具的一个关键差异。

会不会丢数据?

不会。采用了三种机制保证数据不丢:

① 先提交后推进: 先提交目标库数据,再持久化游标。若两者之间崩溃,下次重放同一窗口。
② 幂等写入: 每一行通过基于主键的 upsert 写入,重复执行收敛到同一状态。
③ 安全回退: 持久化水位线时回退 safety-lag-ms(默认 1 秒),避免晚提交的事务被跳过。

进程重启后从上次游标继续,停机期间的变更会被补齐。

同步需要修改源数据库吗?

默认轮询模式不需要任何修改。 Jync 只需要一个只读账号,通过查询游标列做增量,源库结构和配置一动不动。不需要建触发器、不需要开 binlog、不需要申请复制权限。

在很多生产库上,数据库变更是一次要走审批流程的操作。这个「零侵入」特性让 Jync 在信创迁移场景里尤其有优势。

如需亚秒到秒级延迟,可按同步任务切换到日志 CDC(MySQL 兼容家族 binlog / Oracle、达梦 LogMiner / PostgreSQL 方言家族逻辑复制 / SQL Server CDC / 崖山 YStream):需要开启数据库自身日志并授予复制权限,但同样不建触发器、不写源库,全程只读解析日志。

崖山、达梦、openGauss 这些国产库能用日志 CDC 吗?

v1.8.2 起可以。崖山走自带的 YStream(DBMS_YSTREAM_ADM),达梦 DM8 走 LogMiner,openGauss 等 PostgreSQL 方言家族走逻辑复制;GBase、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB 等 MySQL 兼容产品按实际能力探测放行。

连接后 Jync 会逐表做就绪探测:日志模式 / 归档与角色、复制或挖掘权限、列补充日志等,缺项会给出可直接复制的开通语句;探测不过时明确说明缺哪一项,可以继续用轮询或全量比对。

源库需要由 DBA 开启对应的日志能力并授权,但 Jync 本身只读、不建触发器、不写源库,与轮询模式的安全边界一致。

怎么处理修改同步不过去的问题?

游标列必须是「改一行它就会变大」的列,否则修改对同步不可见。工具会自动识别 update_time、updated_at 等命名约定的列作为 TIMESTAMP 策略游标。

如果表没有符合条件的列,可在同步任务详情页手动指定游标列。已漏掉的修改可通过「重置进度」触发全量加载来补全。

长期方案: 给源表添加一个真正会变的最后修改时间列,如 MySQL 的 ALTER TABLE t ADD COLUMN update_time DATETIME DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP;

密码和密钥怎么管理?

登录密码使用 BCrypt 单向哈希存储,无法逆向还原。数据库连接密码和 AI 供应商密钥使用 AES-256 加密后入库(带 enc: 前缀标记)。

v1.7.5 起全新部署无需配置:crypto-password 和 crypto-salt 留空即可,首次启动会自动生成强密钥并保存到数据库同目录的 <库名>.key(如 data/jync.key)。备份数据库时请连同该 key 一起备份,否则已保存的连接密码无法解密,需在界面上重新填写。从旧版本升级请保持默认值不动(它是历史密文的解密钥匙);想自己管理密钥再显式配置。

忘记本地管理员密码:删除 app_user 表对应行,重启后自动种回初始密码。外部认证用户没有本地密码,不适用此方式;关闭本地登录后若外部认证不可用,以 JYN_RESET_LOGIN=true 启动一次即可恢复本地登录。

能接入企业统一登录(OA / SSO)吗?

能,v1.8.0 起支持三种外部认证方式,在「配置管理 → 外部认证」(/external-auth)配置,同一时刻只生效一种:

账号密码(OA 接口):Jync 服务端把账号密码 POST 到管理员填写的登录接口,支持表单或 JSON、字段映射与成功标识;密码只经过内存,不落库、不写日志。网关头:网关或反向代理完成登录后传递用户标识,Jync 只采信直接 TCP 对端位于回环或 app.security.trusted-proxies 内的请求,网关必须剥离客户端伪造的身份头。票据 / SSO:登录中心签发一次性 ticket 后跳回 /sso/entry?ticket=...,服务端校验通过才建立会话。

配置中的用户名列表命中即为管理员,其余外部用户为只读角色;外部用户只保留会话,不写入本地用户表,也没有本地改密入口。完成外部认证配置后可关闭本地登录;若外部认证故障,用 JYN_RESET_LOGIN=true 启动一次即可恢复。注意外部认证地址属于 SSRF 面,只填可信内网地址;网关头模式必须部署在网关之后,不能直接暴露到公网。

能多实例部署、做高可用吗?

能,但跨主机多实例的前提是外部元数据库。 同一台机器上的多个进程可以用默认的 H2(jdbc:h2:file:./data/jync;MODE=MySQL;AUTO_SERVER=TRUE)共享一份元数据;跨主机部署必须把元数据库换成 MySQL 8 / PostgreSQL 16 / Oracle,否则每个节点各自写本机 H2,任务、游标与检查点并不共享(外部元数据库配置)。

换库时必须显式设置 SYNC_CRYPTO_PASSWORD / SYNC_CRYPTO_SALT:自动生成的密钥依附于本地 <库名>.key,外部元数据库场景没有这个文件。注意「换库不是迁移」 —— 原 H2 里的连接、任务、游标与检查点不会自动带过去。

多实例的运行语义:Quartz 使用内存调度,节点启动时按数据库里的启用标志重建,对账线程每 30 秒把本地调度与共享库对齐;同一任务的实际执行由数据库租约锁互斥,持锁节点宕机后 ≤60 秒由其他节点接管续传(CDC 消费者同理)。

出问题怎么排查?日志在哪看?

看三类日志:变更日志记录每条写入 / 失败的对象与行数,用来定位「哪张表没同步」;审计日志记录登录、配置变更、任务启停等管理操作(仅管理员可见);系统日志(v1.8.0 新增,所有登录用户可见,/system-logs)按文件、级别(DEBUG / INFO / WARN / ERROR)与关键字过滤,滚动归档按 gzip 解压读取。

应用日志默认写在 ./logs/jync.log(UTF-8):单文件 10MB 滚动、保留 14 天、总量上限 500MB;系统日志页每次最多扫描 16MB、返回最近 1000 条匹配行,并提示是否截断。路径可用 logging.file.name 改。

CDC 任务额外有状态面板显示连接状态与位点;每张表的全量 / 增量吞吐日志包含 rows/s 与 read / write / commit 占比,是调参的第一手依据。

同步延迟有多大?能做到毫秒级吗?

轮询方案的延迟下限就是轮询间隔,默认 2 秒,可通过 sync.poll-interval 调整,也可用 Cron 表达式精确编排。

需要更低延迟可按同步任务切换日志 CDC:直接解析数据库日志流式回放,亚秒到秒级延迟 —— MySQL binlog 近实时推送;其余四类引擎捞到变更立即续读、零等待,仅真空闲时按 0.5~1 秒轮询(间隔可按同步任务配置),INSERT / UPDATE / DELETE 全捕获,MySQL 兼容家族 / Oracle / 达梦 / PostgreSQL 方言家族 / SQL Server / 崖山六类源库支持。

毫秒级延迟或大规模流式管道(多流 join、复杂 ETL)仍建议 Debezium / Flink CDC —— 这一点我们不打算含糊:Jync 的强项是用一个 jar 完成日志级捕获,而不是替代流式平台。

首次全量同步太慢,能调哪些参数?

先看吞吐日志 —— 每个分块、每个 worker 一行:table=ORDERS rows=100000 rows/s=2427 read=18% write=32% commit=50% batches=50 rowsPerBatch=2000。三个占比决定往哪调:commit% 高说明在等目标库提交(redo 落盘、Data Guard 同步、慢盘),read% 高是源端取数慢,write% 高则检查目标表的二级索引、触发器与主键。

批量大小:full-load-batch-size 默认 2000,一般 1000–5000 够用;commit% 偏高时可加到 5000–10000,提交次数随之减少,再往上收益很小且会放大 undo/redo 与锁表时间。并行度:full-load-parallelism 默认 2、上限 8,有主键的表都可并行(整数前导键按区间切分,其余键形态按采样边界切分,无主键表顺序加载);实际值还会被连接池压回 —— 源与目标不同配置要求 max-pool-size ≥ 并行度+1,同一配置要求 ≥ 2×并行度+2,默认池 5 时前者最多 4、后者只剩 1。并行度与目标库写压力成正比,目标库吃紧就设 1。

新建表的非唯一二级索引默认延后到全量提交后再建(defer-secondary-indexes),50 万行、2 个索引的实测端到端快约 42%。这些旋钮只作用于首次 / 全量加载,增量轮询与 CDC 回放不受影响;同步任务详情页的「全量加载性能」卡片可按同步任务覆盖它们,留空则用全局默认。

怎么确认源库和目标库的数据一致?

用「各表同步进度」卡片里的「核对行数」。点开后先确认,再逐表串行对源库和目标库各执行一次 COUNT(*),弹窗列出对象、源行数、目标行数、差值、累计同步与状态,表头徽标汇总不一致与异常数量。

核对只在确认后执行,页面加载时不会自动查询;单侧查询超时 15 秒,大表会占用数据库 IO。缺表、超时和其他异常分别标记,源 / 目标独立计数,一侧失败不会掩盖另一侧结果。

结果只看行数,不比较内容;需要逐行差异时仍在数据库侧比对。

能同步物理删除吗?

能,但有条件。无源库审计表时,删除检测需要比对双方主键全集,开销随表增大而增大,因此仅对行数低于 full-compare-max-rows(默认 20000)的表启用。

删除同样是基于主键的条件删除,重复执行无副作用。如果你的大表需要同步删除,建议在源库维护一个软删除标记列(配合 update_time 游标),比全量主键比对可靠得多。

没有主键的表能同步吗?

能同步,但无法保证幂等 —— 没有主键就无法识别既有行,重放时可能产生重复行。工具会明确告警。

由于「先提交数据、再推进游标」的设计决定了同一行可能被投递两次(崩溃后重放窗口),幂等性是数据正确的前提。所以强烈建议为表添加主键。

表很多、表名没有规律,怎么拆成多个同步任务?

从 v1.8.1 起用「批量创建」。管理员在任务管理页点「新建任务」旁的「批量创建」,选择源 / 目标连接、任务数(1–50,默认 8)与名称前缀,Jync 读取一次源库目录统计(不扫表),按估算行数从大到小依次放进当前总重的箱(LPT),预览每个任务的表清单后一次建出多个「未启动」的任务。

大小未知的表按已知大小的中位数计重;需要更准可勾选「精确统计行数」,对未知表逐条 COUNT(*),单表 15 秒、整页 120 秒预算。新任务一律停用,确认无误后再逐个启动;规划只使用独立的两连接临时池,不影响正在运行的同步。预览可导出 CSV 留档。

AI 辅助转换是什么?会把我的数据发出去吗?

存储过程里的不兼容语法,靠文本替换只能走到一定程度。AI 辅助转换让模型起草一份候选,由你审阅后落库。边界是硬的:

① AI 只产出候选,永远不直接参与同步,StructureSyncService 不调用任何 AI 代码
② 候选需人工确认后才写入同步任务的 ddlOverrides
③ 没有启用任何供应商时,工具不产生任何外部请求
④ 设置 sync.ai.enabled=false 可彻底移除该功能

但请注意:转换时会带上存储过程的源码发给你配置的端点,其中往往包含业务规则甚至表结构全貌。内网或有合规要求的部署,请优先接入本地/自建推理端点(本机装了 Ollama,直接选 AI 配置里内置的「Ollama(本地)」预设即可,请求不出内网),并自行确认这些代码允许外发。

另外,没有任何工具能保证转换后「效果与原来完全一样」,AI 也不能。存储过程的差异往往不在语法而在语义。所以这里的定位是起草,不是保证。

ETL 任务和实时同步有什么区别?

实时同步负责让源和目标持续一致;ETL 负责按你写的 SQL 取数并写入目标表。ETL 任务的取数 SQL 结果行直接复制进目标表,支持覆盖 / 追加 / 范围覆盖三种写模式、resume key 断点续跑、pre-sql / post-sql,以及写前预检(取数列、目标表、主键与 SQL)。

同源同目标的一组表可以组成批次:批次共享一对源 / 目标连接和一条 cron,按顺序执行,成员不再单独调度;创建后连接锁定,可追加或移出表,删除批次会级联删除成员与检查点。单个成员失败不中断后续成员,批次记录成功 / 失败 / 跳过的汇总。

SAP HANA、Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB 等分析型引擎只在 ETL 中使用;Elasticsearch 与 MongoDB 只读,只能作为 ETL 源。详细说明见 核心功能。

能把同步的数据写进 Redis 吗?

v1.13.0 起支持。项目页的「目标类型」可选 Redis,绑定日志 CDC 后把每一行变化投影成缓存键值:键为 <前缀><表名>:<主键…>,前缀默认 jync:<项目ID>:;值可选 JSON(默认,整行镜像,DECIMAL 写字符串避免精度丢失)或 HASH(列名作 field)。可设 ttlSeconds,也可排除列。

启用时先做分块基线,完成后再流式回放;项目详情页提供「重建」,可先按本项目前缀清扫(SCAN + UNLINK,绝不 KEYS / FLUSHDB / FLUSHALL)再重新基线。带「Redis 目标」专用预检:连通性、TLS、集群槽、maxmemory-policy、键前缀冲突与基线状态。

边界:Redis 只作目标,不是新的数据库类型;只支持日志 CDC 源,结构 / 索引 / 视图 / 存储过程同步强制关闭;无主键表不投影;不支持 Sentinel,集群模式不做 hash tag。Redis 侧被驱逐或重启丢数据 Jync 感知不到,读不到即回源或重建。

同步失败了怎么通知?支持 Webhook 吗?

v1.9.0 起支持 Webhook 告警,在「配置管理 → 告警通知」填写地址、选择消息格式与分类,保存后可先发一条测试消息。可推送七类事件:同步失败、轮询卡死、项目未运行、CDC 停摆、数据漂移、连接健康、PG slot 积压。

消息格式支持通用 JSON / 钉钉 / 企业微信 / 飞书;可设置重复提醒间隔(冷却),故障恢复时发送恢复通知。Webhook 地址 AES-256 加密存储;不配置或关闭告警后不评估规则、不发送消息。

告警评估只读 Jync 已有的运行状态,不改变同步、CDC 或 ETL 任务的行为。