-
日志 CDC 从 MySQL / Oracle / PostgreSQL / SQL Server 扩到更多国产与兼容数据库:崖山 YStream、达梦 DM8 LogMiner、openGauss 等 PG 方言家族、MySQL 兼容家族按能力探测放行。同步侧新增行数审计的定点修补与删除比对分块;同一连接配置上的多个任务改为按活跃任务数分配并行度,池满时排队退让而不是判失败。
本版本曾同版本覆盖重发(安装包精简,版本号不变),以下为最终内容。
新增
崖山 YashanDB YStream 实时日志采集
-
新增
YSTREAM_CDC采集策略,走崖山自带的逻辑日志(DBMS_YSTREAM_ADM),不建触发器、不改表结构。 -
策略门禁与探测逐表检查归档模式、主库角色、权限与列补充日志,缺项给出可直接复制的
ALTER语句。 -
源侧服务按项目生命周期管理(创建 / 加表 / 启动 / 巡检 / 停止并删除),位点是提交 SCN、实例、组 LSN、组偏移与行号的五元组,落库为定宽字符串。
-
消费循环按整事务应用,支持保存点回滚;DDL 跳过并计数;上游
APPLIED_POSITION在每次提交后回执,源端可回收 redo。 -
修复了真库联调中暴露的五处问题:元数据事件的位点读取、轮询超时单位、检查点心跳导致的频繁重连、UPDATE 新镜像只带被改列(改为旧镜像 ∪ 新镜像合并写入)、回执从未调用。
-
修复基线落入 MySQL binlog 判定分支的问题;保存点快照计入事务内存预算,不会把堆打爆后反复重放。
-
实测崖山 23.4.7.100 没有
DBMS_LOGMNR,日志挖掘不可用;崖山源请选 YStream。
达梦 DM8 LogMiner 日志采集
-
LOGMINER_CDC改按方言家族放行,与 binlog、PG 逻辑 CDC 口径一致;连上后由能力探测决定能否挖掘。 -
新增达梦探测分支:源库版本、
ARCH_MODE=Y、RLOG_APPEND_LOGIC=2、归档范围与新鲜度、V$ARCHIVED_LOG/DBMS_LOGMNR权限;Oracle 专属检查在达梦上不再出现。 -
基线起点改由方言提供:Oracle 用
CURRENT_SCN,达梦用最新归档的NEXT_CHANGE#;没有归档时给出切换日志的命令而不是反复重试。 -
抽取 LogMiner 方言缝(
ADD_LOGFILE/START_LOGMNR的CALL形式、按 CSCN 续跑、达梦的 ANSI 日期与十六进制字面量),Oracle 路径行为不变。
PostgreSQL 方言家族与 openGauss 逻辑复制
-
新增 PG 方言枚举,openGauss 与原生 PostgreSQL 分开取变更流与推进 SQL(
pg_current_wal_lsn系列与pg_current_xlog_location等按能力选择)。 -
门禁与探测按方言家族放行;探测期真跑消费链路语句并逐表校验,建槽探测仍是唯一权威。
-
修复 openGauss 侧的三处方言差异:按
SELECT version()识别、CSN 后缀不再被解析成空事务号、参数强转补齐。
MySQL 兼容家族 binlog
-
binlog CDC 从「仅 MySQL / MariaDB」改为 MySQL 家族 + 能力探测,GBase、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB 等按实际能力放行,探测不过时明确说明缺哪一项。
行数审计定点修补
-
行数审计发现缺口后,按主键把区间切段、只对比计数偏短的段,再只回源取缺失的行幂等写入,游标保持不动——不再为几行补数据付出整表重载。
-
缺口超过
sync.row-count-repair-max-rows(默认 1000,0 关闭)、无主键或游标列无法在目标侧比较时,照旧退回清空游标整表重载。 -
主键跨驱动规范化(
Timestamp/LocalDateTime/Instant/java.sql.Date等)按「秒 + 纳秒」比较;一次修补只记一条变更日志,不再与重载日志成对出现。
删除比对分块
-
超过内存上限的删除比对改为按主键键序分页(
WHERE pk > 上页末键+ 行数上限),每页主键等值回源库确认,内存从「整表所有键」降到「一页键」。 -
键序游标而非
OFFSET,一边翻页一边删除不会跳行;用等值而非范围,避免两库排序规则、CHAR补位和数字序差异造成误判。sync.delete-compare-max-rows设上限即可启用,默认 0(关闭)。
看板与任务列表
-
看板改为实时化:概览数据并入统计轮询,会话数、连接健康状态与最近活动随轮询刷新;活动流改为跑马灯,不再因停靠而截断。
-
连接健康状态在连接列表可见,深色主题下配色可读。
-
任务列表适配移动端,窄屏下任务卡片与分页条不再互相挤压。
优化
-
同一连接配置上的并发调度:按连接配置记录活跃任务占用的席位(同库两端算两席),新任务按
(池大小 − 已占) / 已占折算并行度,取源/目标较小值;准入上限为池的一半,另一半留给全量 worker。单任务时并行度与原来一致。 -
池满改为排队退让:同一配置上的第二个任务不再等 Hikari 十五秒超时后整轮失败、写 ERROR 并累计失败次数,而是按
sync.pool-wait-ms(默认 10 秒)每 200 毫秒探一次池计数,仍拿不到位置则本轮退让,下个调度周期自动重试;数据库真连不上仍按失败处理。 -
手动同步不再谎称完成:退让轮的手动同步改为黄色提示「连接池被其他任务占满,本轮已让出」,不再显示摘要与错误明细。
-
并行度上限可见:任务详情显示并行度的生效上限及它受连接池约束的原因,不用再猜为什么设了 8 实际只跑 4。
-
变更日志详情列按界面语言渲染:详情列在展示层按当前语言渲染,存储与去重键不变。
-
看板计数与趋势统一窗口:变更数卡片与趋势图使用同一个 24 小时窗口。
-
启动更快:外部认证未启用时不再读取 SSO 配置,SSO 已存在会话时先查已有 principal。
-
安装包精简 4.3 MB:移除四个代码从未用到的传递依赖(Bean Validation 校验器、AspectJ weaver、Quartz 的 c3p0 支持、Tomcat WebSocket),安装包从 84.0 MB 降到 79.6 MB,功能不变。日志 CDC 需要的 zstd 解压、全部数据库驱动与 Oracle 中文字符集/XMLTYPE 支持均保留。
修复
-
只有删除的轮次「上次同步」不前进:删除数只并进了项目级汇总,未写进每表结果,只有删除的周期时间戳一直不动。
-
大字段溢出上限按 UTF-8 字节计算:原先按每字符 3 字节保守估算,纯 ASCII 的值到三分之一配额就误报超限;现在按实际写盘字节计数。
-
Oracle/DM LogMiner 写 PG 族目标首条 DML 失败:重做文本里的数值被当字符串绑定,PostgreSQL 拒绝隐式转换;现在数值目标列解析为
BigDecimal再绑定,文本目标列不受影响。 -
LogMiner 会话泄漏:
START_LOGMNR成功后建游标失败时没有END_LOGMNR,连接带着挖掘上下文回到池里,下一个借用者会继承;现在异常路径也结束会话。 -
Oracle LogMiner 半读事务被冲刷:批大小或停止请求落在 CSCN 窗口中间时会先冲刷半读事务再推进水位,未读的行永久丢失;现在只冲刷完整读完的游标。
-
PG 逻辑解码 NULL 覆盖目标值:流式行缺少基线后新增的列时,原实现绑定 NULL 覆盖目标值;现在跳过并计数,每表告警一次。
-
SQL Server 大字段删除写错溢出文件:删除事件的溢出文件无读者,批量删除大行会填满溢出目录;现在只溢出插入与更新镜像。
-
SQL Server 源端水位倒退无限重试:源库还原或改指向更早的库时,倒置区间每轮都被拒绝却不 park;现在判定为
PURGED并提示从新快照重基线,无法识别的形态仍交给 SQL Server 显式报错。 -
PG 事务里的删除落在刷新前的绑定上:事务内删除后重插同键,期间元数据刷新会产生新绑定,删除与插入落在两个桶,先写后删导致静默丢行;现在刷新时把缓冲的删除移到新绑定。
-
test_decoding 的引号标识符被截断:表名带冒号、列名带方括号时事件落错表或列;现在引号内的分隔符不参与切分。
-
PG 基线期间槽滞留无感知:基线可能跑数小时,采样一次也执行不到,源库 WAL 会静默堆积到写满磁盘;现在基线期间每 30 秒采样一次,超过
sync.cdc.pg.wal-retention-warn-bytes(默认 4 GiB)在面板标红并写 WARN。openGauss 无pg_lsn时不显示、也不发注定失败的查询。 -
复制槽丢失后静默建新槽续跑:已提交位点存在但槽不见时现判定为
PURGED并停在错误上,不再继续推进。释放槽的日志区分「本就不存在」与「仍被消费者占用」,删除任务、切换策略、更换源库三条路径都尽力释放。 -
LogMiner 失败周期重放已提交事务:失败后退避期间从位点库回读已提交 SCN 作为下一轮锚点,不再逐条打「refusing to rewind」。
-
SQL Server 捕获实例消失无告警、计数虚增:捕获实例被删除时静默停止采集,现在明确告警并说明恢复方式;没有捕获实例的等待状态不再每轮累加「已跳过」计数。
-
SQL Server 2012/2014 删视图和例程语法不兼容:按这两个版本能理解的语法生成删除语句。
-
目标表重名检测受区域设置影响:表名折叠改为
Locale.ROOT,土耳其语等区域下不再误判重名或漏判。 -
目标列校验被无列名行打断:元数据里没有
COLUMN_NAME的列行直接跳过,整次校验不再因此失败。 -
预检拒绝被读成源端删除:目标名过长的表被预检剔除后,变更检测曾把它当成源端已删除并执行
DROP TABLE;现在记录为「本轮未处理」,不再删除目标表与快照。 -
无法解析的列清洗规则让整表停住:替换串在首次匹配时才解析,非法规则会抛出异常;现在编译规则时就校验并跳过,与非法正则同样处理。
-
DATE/TIME 主键两侧渲染不一致:删除同步与审计修补要求同一逻辑键在两侧渲染一致,
LocalDate/LocalTime曾分别按 epoch day / nano-of-day 与毫秒比较,驱动返回类型不同时会误判整表被删并清空目标;现在统一为毫秒,与LocalDateTime/Timestamp同一空间。 -
模拟 upsert 目标重复记录更新:安全余量重发的相同行照样报「1 行影响」,变更日志反复记录同一次修改;现在 UPDATE 带「任一列真的不同」守卫,重放空操作不再计数,目标含大字段等不可比类型时整表退回原行为。
-
项目删除被自己的租约释放阻塞:删除流程不再等待自身租约释放,删除立即返回。
-
并发升级请求重复启动 helper:一键升级的并发重启请求只放行一个。
-
升级探测地址错误:探测重启进程实际绑定的地址,而不是发起进程的地址;回滚脚本记录新的 java 进程号,便于终止。
-
AI 回复在 SSE 特殊行后丢失:流里出现
id:/retry:或空行时保留已收到的回复;草稿缓存键改用 provider 端点而不只是 id。 -
Oracle 11 生成的标识名超长:identity 名称控制在 30 字节以内。
-
Oracle 分区表注释读不到:把分区表纳入注释查询的类型列表。
-
SQL*Plus 终止符误删:只剥离独立成行的
/,不再误伤语句中间或字符串里的斜杠。 -
审查页重定向对象名未编码:对象名经百分号编码后再拼进重定向地址。
-
错误页多出一条英文弹窗:不再把框架的英文原因短语渲染成第二条错误信息。
-
非中文界面显示中文更新说明:说明含中文且界面语言不是中文时,只留一句提示与发布页链接。
-
「连接已失效」显示哨兵键:连接健康检查的
error.db.health.invalid换成人话,不再把键名挂到标题上。 -
核对行数弹窗提示不全:只列已有同步记录的表,不再提示不存在的条目。
-
详情页采集卡片与批量创建判定不一致:两处共用同一套
supportedFor规则;崖山项目不再渲染必然探测失败的卡片。 -
批量创建的采集方式不随源库收窄:切换源连接即时收窄可选采集方式,无脚本时服务端同样收窄。
-
基线异常路径可能误删位点:租约已丢失时不再删除位点行、不再摘错误标记;键集分块的亚毫秒时间边界保精度,
NULL字面量断点解为「无边界」。 -
Gitee 更新检查因单条记录解析失败整页作废:
created_at解析失败只跳过该条,不再作废整个 release 列表。 -
窄屏与手机宽度下的三处溢出:品牌名不再截成「Jy…」,任务列表分页条自动折行,英文界面在 390px 下不再吞掉左侧的「共 N 条」。
-
中英文案不同步:中文提示与英文同进同退,句末标点对齐;异常任务按数量分支显示,空状态不再重复提示。
-
CDC 探测结果深色主题不可读:补深色主题配色,对比度不再低到 2.9:1。
-
容器镜像不含本版本更新说明:设置页「本版本更新内容」不再为空;新增测试确保 POM、Dockerfile 与
.dockerignore三者一致。 -
脚本与消息映射漏项:页面脚本统一带版本参数;自定义脚本不再自抄采集方式与文案映射,新增采集方式不会被前端当成无标签丢弃;CDC 检查消息补齐浏览器消息映射。
兼容性说明
-
默认行为不变:不启用的采集策略不会被探测;已有同步任务、调度与连接池默认值不变。
-
新增可选配置项:
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 关闭 WAL 滞留告警)。 -
无数据库结构变更。替换
jync.jar重启即可;容器部署将镜像 tag 更新为jync:1.8.2。升级前备份./data与application.yml。
测试与升级
-
3253 个测试:3252 通过,0 失败;1 个仅限 Linux 的密钥文件权限用例在 macOS 上按环境跳过(
*IT需 Docker 另跑)。 -
替换
jync.jar重启即可;容器部署将镜像 tag 更新为jync:1.8.2。
GITHUB: https://github.com/vfaner/jync/releases/download/v1.8.2/jync.jar
Gitee: https://gitee.com/super_rgh/jync/releases/download/v1.8.2/jync.jar