Repository navigation
Jync v1.8.1 · 批量建任务,按表大小分箱
Jync v1.8.1 · 批量建任务,按表大小分箱
读一次源库表清单,按估算大小分箱,预览后一次建出多个停用任务。同步链路同样提速:行数估算改为按需读取,元数据库不再每轮空写;另修正大批量基线下的行数计数与几处 CDC 状态问题。
本版本曾同版本覆盖重发(安装包更新,版本号不变),以下为最终内容。
新功能
批量创建任务
- 入口:任务管理页「新建任务」旁新增「批量创建」(仅管理员)。选择源/目标连接、任务数(1–50,默认 8)与名称前缀,读取一次源库目录统计后按估算大小分箱。
- 分箱:按估算行数从大到小,依次放进当前最小的箱(LPT)。大小未知的表按已知大小的中位数计入;全库无统计时按表数均衡。结果确定:同样输入在预览和创建时得到同样的分箱。
- 统计来源:优先用产品目录(MySQL
information_schema、PostgreSQLpg_class、OracleALL_TABLES、SQL Serversys.partitions、DB2SYSCAT.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 也有同样问题。现在 OracleNUM_ROWS、SQL Server 分区行数、DB2CARD的 0 按空表计重,并保证全为空表时仍按数量均分。MySQLTABLE_ROWS未收集统计时也读作 0,无法与空表区分,仍按未知处理;PostgreSQL 14 起未收集统计的表读作 -1,0 即空表(9.4–13 仍按未知)。这些表可用「精确统计行数」补齐。 - 源库短暂不可达会停掉 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重启即可;容器部署将镜像 tag 更新为jync:1.8.1。升级前备份./data与application.yml。
测试与升级
- 2688 个测试:2687 通过,0 失败;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过(
*IT需 Docker 另跑)。 - 替换
jync.jar重启即可;容器部署将镜像 tag 更新为jync:1.8.1。
