- 读一次源库表清单,按估算大小分箱,预览后一次建出多个停用任务。同步链路同样提速:行数估算改为按需读取,元数据库不再每轮空写;另修正大批量基线下的行数计数与几处 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 运行中」。现在停用状态只重置进度、错误标记与遗留文本(服务端强制,直接调接口也一样),消费者在任务启用时才拉起;批量创建出的 CDC 任务因此真正保持「未启动」。
-
Oracle 系 schema 大小写:连接配置里写成小写 schema(如 scott)时,「精确统计」拼出的 COUNT 语句引用一个不存在的 schema,每条统计都静默失败、全部显示未知。现在按同步链路的规则先折叠为大写。
-
SQL Server 行数被重复计数:目录统计把分区与其分配单元直接连接,一个分区通常有 in-row、LOB、行溢出多个分配单元,行数因此被重复累加,含大字段的表会显示成数倍大小。现在先按分区聚合分配单元再连接。
-
空表被当成未知:COUNT(*) 返回 0 是已知大小,分箱时却按中位数计重,空表越多分箱越偏;目录统计返回 0 也有同样问题。现在 Oracle NUM_ROWS、SQL Server 分区行数、DB2 CARD 的 0 按空表计重,并保证全为空表时仍按数量均分。MySQL TABLE_ROWS 未收集统计时也读作 0,无法与空表区分,仍按未知处理;PostgreSQL 14 起未收集统计的表读作 -1,0 即空表(9.4–13 仍按未知)。这些表可用「精确统计行数」补齐。
-
源库短暂不可达会停掉 CDC:Oracle LogMiner、PostgreSQL 逻辑复制与 SQL Server CDC 把「连不上源库」和「写目标端失败」记进同一个连续失败计数,一次约半分钟的网络抖动就会把项目置为错误状态、需要人工清除。现在只有应用数据失败才累计并停用,源端连不上按退避无限重连(与 MySQL 消费者一致)。
-
停止 CDC 可能被建连卡住:消费者启动时建立两端连接的过程原先占着管理器锁,期间点「停止」要等连接超时后才返回。现在连接在锁外建立,停止会立即返回;若停止发生在建连期间,启动方放弃注册并释放租约。
-
超大行数显示为负:单表基线超过 21 亿行时,行数计数按 32 位整数回绕成负数,任务列表与「有变化」判定跟着错。现在全程 64 位;变更日志的行数列超限时饱和到上限而不是回绕。
-
排队重跑可能无人执行:持锁者恰好在本轮结束时退出时,队列里的重跑要等到下一次触发。现在这条重跑会被抢占者自己接走。删除任务时同时清掉本节点的重跑排队、重试计数与停机标记,复用同一 id 的新任务不会继承一条幽灵周期。
安全加固
兼容性说明
测试与升级
GITHUB: https://github.com/vfaner/jync/releases/download/v1.8.1/jync.jar
Gitee: https://gitee.com/super_rgh/jync/releases/download/v1.8.1/jync.jar