项目管理、自动检测、SQL 方言适配、断点续传 —— 一个 jar 包全包了。含 10 张后台界面截图
配置源库/目标库,多项目并行互不干扰。每个项目独立启动/暂停,状态与最近同步时间一目了然。
保存前即可验证连通性。选择数据库类型后自动生成 JDBC URL,非内置驱动填写 jar 路径即可动态加载。
表 / 视图 / 存储过程分组勾选,支持搜索与批量操作。每张表的增量检测策略直接标注,一目了然。
表结构、表数据、索引、视图、存储过程与函数。目标库不存在时按目标方言自动创建,DDL 变更自动传播。
类型映射、函数名转换、标识符引号、分页语法、存储过程包装。异构库之间的桥梁,每种方言有专门的实现。
轮询检测(默认 2 秒),也可用 Cron 表达式精确编排。进程重启后从上次游标继续,停机期间的变更会被补齐。
三层锁机制(Quartz + JVM + 数据库行锁)确保跨重启安全。崩溃实例的锁可被接管,不会永久阻塞项目。
每次变更的对象名、类型、影响行数、耗时与完整错误详情。每一次同步都可追溯,问题排查不靠猜。
密码 BCrypt 哈希存储,连接密码 AES-256 加密。管理员/访客两级权限,访客仅只读。支持修改密码。
从登录到看板,从配置到日志,每个环节都有清晰的界面
用户名 + 密码,右上角可随时切换主题与语言。默认口令没改之前,登录后每个页面顶部都会挂一条红色警告。
admin 和 view
项目数、连接数、同步表数、24 小时变更量与最近活动流。所有关键指标一目了然。
右上角一键切换。看板、卡片、表格、图标都跟着走,不是只把背景刷黑、留下一片刺眼的浅色控件。
选择数据库类型后自动生成 JDBC URL,可预览、可测试;非内置驱动填写 jar 路径即可动态加载。
填主机、端口、库名,JDBC URL 当场生成,不用记各家数据库的连接串格式。
每个项目一组「源库 → 目标库」,独立启动/暂停,状态与最近同步时间一目了然。
表 / 视图 / 存储过程分组勾选,支持搜索与批量操作;每张表的增量检测策略直接标注。
TIMESTAMP 策略:可检测更新IDENTITY 策略:仅检测新增FULL_COMPARE 策略:全表比对
同一个项目详情页,换成只有查询权限的 view 用户来看:表、视图与游标策略照常可见,但写入相关的操作不对它开放。
对象名、变更类型、影响行数、耗时与完整错误详情。问题排查不靠猜,全在日志里。
存储过程里的不兼容语法,靠文本替换只能走到一定程度。AI 配置 提供另一条路:让模型起草一份候选,由你审阅后落库。
OpenAI 兼容 与 Anthropic 两种协议sync.ai.enabled=false 可彻底下线该功能
增量窗口闭区间 · 先提交后推进 · 幂等写入 · 三层锁 · 安全回退
先读取 MAX(游标列) 作为水位线,再查询 游标列 > 上次游标 AND 游标列 <= 本次水位线。同步期间新写入的数据自然落在窗口之外,下个周期被捕获。
先提交目标库数据,再持久化游标。若两者之间崩溃,下次重放同一窗口,不会丢数据。代价是同一行可能被投递两次,由幂等写入消化。
每一行通过基于主键的 upsert 写入,重复执行收敛到同一状态。每种数据库适配各自的 upsert 语法:INSERT ... ON DUPLICATE KEY UPDATE、MERGE INTO、UPDATE-then-INSERT 等。
Quartz 调度锁 + JVM ReentrantLock + 数据库行锁(带租约)。崩溃实例的锁可被接管,不会永久阻塞项目。启动时主动释放本实例上次遗留的锁。
一行数据能否被同步,只取决于它的游标列值有没有涨到上次记录之上
SELECT * FROM 表 WHERE 游标列 > 上次游标 AND 游标列 <= 本次水位 ORDER BY 游标列
| 策略 | 触发条件 | 检测新增 | 检测更新 |
|---|---|---|---|
TIMESTAMP |
存在符合最后修改时间命名约定的时间戳类型列 | ✅ | ✅ 前提是该列真被更新 |
IDENTITY |
存在符合创建时间命名约定的列,或单列数字主键 | ✅ | ❌ 永远检测不到 |
FULL_COMPARE |
无可用游标列,且行数 ≤ full-compare-max-rows(默认 20000) |
✅ | ✅ 每周期全表 upsert |
NONE |
无可用游标列且表过大 | ❌ | ❌ 仅首次全量加载 |
id)或创建时间(create_time)做游标,UPDATE 不会改变它们的值,
那一行的游标值原地不动 —— 修改永远同步不到,只有新增能过去。
这不是缺陷,而是「用普通查询做增量、不碰源库 binlog 也不建触发器」这个前提的必然代价。
UPDATE_TIME UPDATED_AT UPDATETIME UPDATED_TIME
LAST_MODIFIED LASTMODIFIED LAST_UPDATE LAST_UPDATED
MODIFY_TIME MODIFIED_AT MODIFIED_TIME GMT_MODIFIED
ROW_VERSION ROWVERSION SYS_UPDATE_TIME DATA_CHANGE_TIME
CREATE_TIME CREATED_AT CREATETIME CREATED_TIME
GMT_CREATE INSERT_TIME ADD_TIME
创建时间不随修改而变,因此这些列只能检测新增。
匹配规则:大小写不敏感,- 视作 _,按包含匹配。
并且列类型必须确实是时间类型 —— 名为 update_time 的 VARCHAR 不会被当作游标,因为字符串比较的顺序不可靠。
手写 CSS + 设计令牌,无框架、无构建步骤,内网离线可用
主题写在 <html data-theme>,只覆盖 CSS 变量,因此组件无需第二套深色规则。未手动选择时跟随系统 prefers-color-scheme 并实时响应变化。<head> 内联脚本在首屏渲染前应用主题,避免深色用户看到一帧白底闪烁。
优先级:语言 Cookie › 浏览器时区 › Accept-Language › 简体中文。
为什么时区优先?境外华人用户的浏览器语言常常是英文,但人在国内时区 —— 时区是「想看哪种语言」更准的信号。
所有前端资源均在仓库内,运行时不发起任何外部请求:手写样式、原生 JS、本地托管的图标字体、内联渐变 SVG。字体使用系统字体栈,不引入 webfont。静态资源总体积约 440KB。
验证方式:抓取任意页面 HTML,其中 src/href 引用的外部 http(s) 地址数量为 0。