同步任务管理、批量创建任务、自动检测、SQL 方言适配、日志 CDC、ETL 取数与批次、Webhook 告警、统一认证、系统日志、行数核对、断点续传,以及应用内 HTTPS、配置包迁移与列清洗脱敏 —— 一个 jar 包全包了。含 31 张后台界面截图
配置源库/目标库,多个同步任务并行互不干扰。每个任务独立启动/暂停,列表分页展示(默认 20 条/页,可跳页)。
保存前即可验证连通性。选择数据库类型后自动生成 JDBC URL,非内置驱动填写 jar 路径即可动态加载。
表 / 视图 / 存储过程分组勾选,支持搜索与批量操作。每张表的增量检测策略直接标注,一目了然。
读一次源库目录统计,按估算行数把表均衡分进 N 个任务(LPT 分箱),预览后一键建出多个「未启动」的同步任务;大小未知的表可选用 COUNT(*) 精确统计。适合表多、表名没有规律的库。
写一条取数 SQL,结果行直接复制进目标表;覆盖 / 追加 / 范围覆盖三种写模式,可用 resume key 断点续跑,前后置 SQL 处理清表与汇总。同源同目标的一组表可组成批次,共享一对连接与一条调度,按顺序执行,单个成员失败不中断后续。
表结构、表数据、索引、视图、存储过程与函数。目标库不存在时按目标方言自动创建,DDL 变更自动传播。
类型映射、函数名转换、标识符引号、分页语法、存储过程包装。异构库之间的桥梁,每种方言有专门的实现。
轮询检测(默认 2 秒),也可用 Cron 表达式精确编排;MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 与崖山源可按同步任务切换日志 CDC,亚秒~秒级延迟(MySQL binlog 近实时推送,其余引擎捞到变更立即续读、仅真空闲时才按 0.5~1 秒轮询)。进程重启后从上次位点继续,停机期间的变更会被补齐。
数据库性能页与同步任务性能页按后台采样绘制曲线:连接延迟与可用性、会话 / QPS / 缓存命中率 / 锁等待、表数 / 行数 / 占用空间,以及每个任务的同步行数、延迟、失败次数与变更构成;历史保留 7 天。可选开启 /api/metrics/prometheus 端点,用 Bearer token 接到既有监控。
三层锁机制(Quartz + JVM + 数据库行锁)确保跨重启安全。崩溃实例的锁可被接管,不会永久阻塞同步任务。
每次变更的对象名、类型、影响行数、耗时与完整错误详情。与同步任务列表同一套分页,每一次同步都可追溯,问题排查不靠猜。
同步失败、轮询卡死、项目未运行、CDC 停摆、数据漂移、连接健康、PG slot 积压七类事件可推送到自定义 Webhook;内置通用 JSON、钉钉、企业微信、飞书四种格式,支持冷却时间与恢复通知,地址加密存储。告警只读运行状态,不改变任何同步任务的行为。
「各表同步进度」新增「核对行数」:确认后逐表串行对源 / 目标各执行一次 COUNT(*),标出一致、不一致、缺失与超时。单侧 15 秒超时,页面加载时不会自动查询。
密码 BCrypt 哈希存储,连接密码 AES-256 加密。管理员/访客两级权限,访客仅只读;支持修改密码,也可接入企业统一认证并关闭本地登录。
六类引擎:MySQL 兼容家族 binlog、Oracle LogMiner、达梦 LogMiner、PostgreSQL 方言家族逻辑复制、SQL Server CDC、崖山 YStream。按同步任务从轮询一键切换,亚秒~秒级延迟,INSERT / UPDATE / DELETE 全捕获 —— 不建触发器、不写源库,只读解析日志。
「配置管理 → 外部认证」接入企业现有账号:账号密码(OA 接口校验)、网关头、票据 SSO 三种方式互斥生效。外部用户只保留会话,不落本地用户表;配置完成后可关闭本地登录,保留应急恢复开关。
新增「日志管理 → 系统日志」页:按文件、级别(DEBUG / INFO / WARN / ERROR)与关键字过滤,命中内容高亮;滚动归档自动解压读取,单次最多扫描 16 MB、返回最近 1000 条。登录与敏感操作另有审计日志可查。
同步任务详情页一键排练下一轮:源 / 目标连通性、待执行的 CREATE / ALTER / DROP、目标表缺失 / 缺列 / 类型不兼容、游标列与索引、CDC 可用性,以及 binlog CDC 的列布局漂移。只读,不执行 DDL、不推进游标,结果按错误 / 警告 / 正常 / 跳过分组。
增量同步后按主键分桶抽样,逐列比对源与目标的行值,发现「行数相同但内容不同」——更新丢失、截断、类型转换错误。差异只写变更记录并发 DATA_DRIFT 告警,不自动修复;管理员可对单表手工触发。LOB / JSON / XML / 几何列自动排除。
设置页管理员一键导出 zip:版本、运行参数、连接、项目进度、CDC 位点、近期变更与审计、日志尾部,并附 SHA-256 清单。密码、enc: 密文、API Key、连接串凭据、游标原值与 data/ 均不入包,白名单之外再做一次正则脱敏。
实时同步与 ETL 之外的第三条链路:Elasticsearch / OpenSearch → Easysearch 复制 settings、mappings、别名与文档;MongoDB → MongoDB 复制集合选项、索引与文档并保留 _id;MongoDB → KingbaseES 采样推断建表,_id 作主键。独立连接、预检、手动或 cron、可取消并保留运行历史,详见能力地图。
日志 CDC 项目可直接以 Redis 为目标:每一行变化投影为 键前缀 + 表名 + 主键,值可选 JSON(整行镜像)或 HASH(列名作 field),支持 ttlSeconds 与排除列。先分块基线再流式回放,项目页可一键重建并只清扫本项目前缀;Redis 专用预检覆盖连通性、集群槽、maxmemory-policy 与键冲突。Redis 不是新的数据库类型,存量项目完全不受影响。
「系统管理 → 系统配置」直接上传 PKCS#12 / JKS 密钥库或 PEM 证书链与私钥,由 Jync 自己监听 HTTPS,不必再改 nginx 或环境变量;保存后重启生效,可选 HTTP→HTTPS 307 重定向(严格校验 Host,不采信 X-Forwarded-Host)。强制 HTTPS 页面可开关,取值优先级「配置文件 > 数据库 > 默认」,其他节点 5 秒内收敛;同页还能测试候选元数据库并生成一段 POSIX 安全引用的 SPRING_DATASOURCE_* 环境变量块。
把连接、同步项目、任务、清洗规则、告警与外部认证整体搬到另一个元数据库:单文件 .jync 用 AES-256-GCM + PBKDF2-HMAC-SHA256(21 万次)口令加密,逻辑导出 13 张配置表,可选「包含同步进度与游标」。导入时先用包内源密钥解密全部 enc: 值、再以目标部署密钥重新加密,解不开即中止;只接受空配置库,所有 id 丢弃并重映射,导入后必须仍有 ADMIN。TLS 证书与运行历史不进包。
写入目标前在内存中执行,源库不变,全量、增量与 CDC 回放一致。13 种规则:去首尾空白、大小写、空串转 NULL、去前缀 / 后缀、正则替换,加上手机号、身份证、银行卡、姓名、邮箱的格式保留掩码与带可选盐的 SHA-256 哈希;掩码按 code point 保留首字符、不切断 emoji 代理对,哈希列在内容校验时自动跳过。
从登录到看板,从配置到日志,每个环节都有清晰的界面
默认使用用户名 + 密码,右上角可随时切换主题与语言。启用外部认证后,登录页按所选方式自动切换为门户引导页,本地表单仍在 /login/local。默认口令没改之前,登录后每个页面顶部都会挂一条红色警告。
admin 和 view
同步任务数、ETL 任务、数据库连接与 24 小时变更量一屏总览;管理员另见负载、CPU、内存与磁盘,以及进程 CPU / 堆内存 / GC 趋势曲线。
metrics.app-interval-ms 采集(默认 1 分钟),历史保留 metrics.retention-days(默认 7 天)
点连接列表里的折线按钮进入该连接的数据库性能页:连接延迟与可用性,会话数 / QPS / 缓存命中率 / 锁等待,以及表数、行数与占用空间曲线,可切换 1 小时 / 24 小时 / 7 天。
metrics.db-interval-ms(默认 5 分钟)与 metrics.capacity-interval-ms(默认 1 小时)可调;不需要时关闭 metrics.enabled
每个同步任务都有独立性能页:已同步行数、同步延迟、连续失败次数与运行状态,下方是「每个时间段的同步行数」「变更类型占比」「变更最多的表」。
metrics.task-interval-ms(默认 1 分钟)可调;历史默认保留 7 天(metrics.retention-days),采样关闭后已存样本仍可查看
右上角一键切换。看板、卡片、表格、图标都跟着走,不是只把背景刷黑、留下一片刺眼的浅色控件。
点导航栏的「中 / EN」按钮即可在中英文之间切换,菜单、表单、状态与错误提示整套文案一起换,选择记在浏览器里。首次访问未手动选择时,默认语言按浏览器时区智能推断。
连接按用途拆成「源数据库连接」「目标数据库连接」两张表,各自独立分页;同步任务表单的源、目标下拉只会列出对应一侧的连接,不会把只该写入的库错选成源。每一行都可以直接测试、编辑或删除,密码加密后入库。
先定用途,再从 34 种预置类型中选择数据库(含 OceanBase、GaussDB、GoldenDB、TDSQL、PolarDB、瀚高、海量、崖山等信创库,以及 SAP HANA、Doris、ClickHouse、Hive、Impala、Elasticsearch、MongoDB 等分析型引擎(SAP HANA 支持实时同步,其余六种可作实时同步源));默认端口随类型联动,填好主机、端口、库名后 JDBC URL 当场生成,不用记各家连接串格式。
主机名\实例名 或附加 instanceName
每个同步任务一组「源库 → 目标库」,独立启动/暂停,状态与最近同步时间一目了然。列表分页展示,页码多时也不会铺满整排。
表多、表名没有规律时不必手工拆。读一次源库目录统计(不扫表),按估算行数把表均衡分进 N 个任务,预览每箱的表清单后一次建出多个「未启动」的任务。
COUNT(*),单表 15 秒、整页 120 秒预算
实时同步负责「让两边持续一致」,ETL 负责「按你写的 SQL 取数、写进目标表」。批次任务与单表任务分区展示,每个任务保留自己的取数 SQL、目标表、写模式与最近运行结果。
select * 的成员
取数 SQL 可直接编辑,也可从本地载入 .sql 文件;最后一条 SELECT 提供结果行。目标表缺失时按结果列建一次,之后不再自动改结构。
同源同目标的一组表放进一个批次,运行时只建一对源 / 目标连接,组内按顺序执行 —— 不必为每张表各占一条调度、各做一次连接握手。
select *、目标表 = 表名、覆盖写模式
实时同步与 ETL 之外的第三条链路,用独立的搜索 / 文档连接做整库复制,不占用 JDBC 连接与同步任务席位。每类迁移都有预检、手动或 cron 运行、运行中可取消,并保留运行历史。
_id 与 routing,支持覆盖 / 追加 / 冲突即失败_id
在「配置管理 → 告警通知」填写 Webhook 地址、选择消息格式与分类,保存后可先发一条测试消息。告警评估只读 Jync 已有的运行状态,不改变同步、CDC 或 ETL 任务的行为。
表 / 视图 / 存储过程分组勾选,支持搜索与批量操作;每张表的增量检测策略直接标注,游标列可手动指定。
TIMESTAMP 策略:可检测更新IDENTITY / NONE 策略显著提示 —— 意味着更新可能同步不到FULL_COMPARE 策略:需主键的周期性整表比对;超出上限或当前间隔下负担过重时,页面会提示并给出建议间隔
MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 与崖山源可按同步任务从轮询切换到日志 CDC —— 直接解析数据库自身日志流,INSERT / UPDATE / DELETE 全捕获,严格按日志顺序回放。繁忙时捞到数据立即开下一轮(0 等待),只有真空闲才休眠轮询,延迟不再被固定 sleep 拖慢。
轮询与全量比对任务默认跟随全局 2 秒间隔。开启「自定义调度」后,可为该同步任务单独填写轮询间隔(毫秒)或 Quartz Cron 表达式(6 / 7 段,秒在最前);Cron 优先于轮询,留空则回落到全局默认值。
首次全量和 CDC 基线重建共用这些参数:批量大小控制每个 JDBC 批次的行数,默认 2000(1–20000);并行度控制分片 worker 数,默认 2,最高 8;分块大小控制单块行数,填小于等于 0 表示关闭分块。
按「表 + 列」添加规则,在写入目标库前于内存中依次执行,源库数据保持不变。规则同样作用于全量、增量与 CDC 回放;主键列参与匹配与删除时,也使用清洗后的值。
$1 分组引用;表达式与替换串在保存时校验
一个同步任务就是一条「源库 → 目标库」链路。新建时源、目标下拉各自只列出对应用途的连接,不会把只该写入的库错选成源。
对象名、变更类型、影响行数、耗时与完整错误详情。问题排查不靠猜,全在日志里。
在「各表同步进度」卡片点「核对行数」,确认后逐表串行执行。弹窗列出对象、源行数、目标行数、差值、累计同步与状态;每行可单独重查,表头徽标汇总不一致与异常数量。
「配置管理 → 外部认证」把企业现有的身份体系接进来:账号密码由 Jync 服务端 POST 到 OA 登录接口校验,网关头由网关传递已认证用户,票据模式由登录中心签发一次性 ticket。同一时刻只生效一种方式。
data.user 点路径与成功标识JYN_RESET_LOGIN=true 应急恢复
「日志管理 → 系统日志」直接读取日志目录里由滚动策略生成的文件,按文件、级别与关键字过滤,命中内容高亮显示。排查启动失败、连接异常或调度问题时,不用再登录服务器翻日志。
../ 与符号链接逃逸
「系统管理 → 系统配置」把过去必须改配置文件或数据库的事情搬进页面:上传证书让 Jync 自己提供 HTTPS,开关强制 HTTPS,导出 / 导入整套配置,还能先测一次候选元数据库。
./data/tls,不进元数据库、不进配置包.jync 用 AES-256-GCM + PBKDF2 口令加密,可整体迁移到另一个元数据库SPRING_DATASOURCE_* 环境变量块
登录、配置变更、任务启停、TLS 与配置包操作都会留下一条审计记录:时间、用户、操作与详情。只读、仅管理员可见,用来回答「这项配置是谁改的」,与变更日志、系统日志各归其位。
enc: 密文不入审计
存储过程里的不兼容语法,靠文本替换只能走到一定程度。AI 配置 提供另一条路:让模型起草一份候选,由你审阅后落库。
OpenAI 兼容、Anthropic 与 Ollama(本地) 三种选择max_tokens 下正文甚至会被思考挤空,表现成「一直转圈然后报模型返回空内容」sync.ai.enabled=false 可彻底下线该功能
新增 AI 供应商时,保存前会发一次真实请求探测端点,而非 TCP 探活 —— 密钥错误、模型名写错、Base URL 差一段路径这三类问题只有真发请求才暴露得出来。
复审页「用 AI 起草」把源过程体发给启用的供应商,候选边生成边渲染进编辑器,不再等超时才一次性看到全文。起草完成后页面只留一条提醒:AI 输出仅为候选,保存为覆盖前请先在目标库人工自测。
原「设置」菜单改名为「系统信息」:实例标识、Java 版本、已调度同步任务数、同步默认参数与并发恢复机制集中只读展示;版本信息卡片显示当前版本、GitHub 最新版本和本版更新内容。更新检查在后台进行,不拖慢页面,纯内网也能看当前版本和更新内容。
--app.update-check.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 不会改变它们的值,
那一行的游标值原地不动 —— 修改永远同步不到,只有新增能过去。
这不是缺陷,而是「用普通查询做增量」这个前提的必然代价 —— 如果更新必须被捕获,
源库又是 MySQL 兼容家族、Oracle、达梦、PostgreSQL 方言家族、SQL Server 或崖山,可以按同步任务切换日志 CDC:直接解析日志流,不依赖游标列。
💡 建议给游标列建索引(主要影响增量轮询)。首次全量按主键分块读取,不走游标列索引;但之后的每个增量周期都要执行 游标列 > 上次游标 的范围查询并按它排序 —— 有索引时只读新增区间,没有索引则每轮全表扫描再排序,表越大对源库的压力越明显。
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 不会被当作游标,因为字符串比较的顺序不可靠。
轮询依赖游标列,日志 CDC 直接解析数据库自身的日志流 —— INSERT / UPDATE / DELETE 全捕获,不建触发器、不写源库,按同步任务一键切换。MySQL binlog 近实时推送;LogMiner / 逻辑解码 / SQL Server CDC / YStream 四类轮询引擎捞到变更零等待续读,仅真空闲时按引擎默认 0.5~1 秒休眠(可按同步任务覆盖),失败才指数退避
Jync 伪装成一台只读从库订阅 ROW 格式 binlog,按事务流式回放。位点为「文件 + 偏移」(开启 GTID 时含 GTID 集)。七项就绪探测:版本、log_bin、binlog_format=ROW、binlog_row_image=FULL、server_id、复制权限、binlog 保留期。MySQL / MariaDB 与 GBase、OceanBase、TiDB、GoldenDB、TDSQL、PolarDB 等兼容产品按实际能力探测放行。
用数据库内建的 DBMS_LOGMNR 挖掘 redo 日志,从 V$LOGMNR_CONTENTS 流式读取变更回放,位点为 SCN。七项就绪探测:ARCHIVELOG 模式、补充日志(SUPPLEMENTAL LOG)、归档保留、LogMiner 权限等,逐项给出满足 / 不满足与原因。达梦 DM8 按方言家族放行,额外检查 ARCH_MODE=Y、RLOG_APPEND_LOGIC=2、V$ARCHIVED_LOG 权限,基线起点取最新归档的 NEXT_CHANGE#。
创建逻辑复制槽,经 test_decoding 插件解码 WAL 流式回放,位点为 LSN。五项就绪探测:wal_level=logical、复制槽可用、复制权限、WAL 保留等。槽的推进由 Jync 托管,停机期间变更留在 WAL 里,重启后续读。openGauss 等方言按 SELECT version() 识别,pg_current_wal_lsn 系列与 pg_current_xlog_location 按能力选择;基线期间每 30 秒采样槽滞留的 WAL,超过阈值标红告警。
读取数据库内建 CDC 特性生成的变更表(cdc.fn_cdc_get_all_changes),位点为 LSN。五项就绪探测:库级 CDC 开启、表级 CDC 开启、捕获作业运行中等。22054 等常见错误自动自愈,变更表被 purge 时停放同步任务而不是无限重试。
走崖山自带的逻辑日志(DBMS_YSTREAM_ADM),不建触发器、不改表结构。位点为提交 SCN、实例、组 LSN、组偏移与行号的五元组;源侧服务按任务生命周期管理,停止时一并回收。逐表检查归档模式、主库角色、权限与列补充日志,缺项给出可直接复制的 ALTER 语句。
先持久化当前日志位点,再做 keyset 分块全量装载 —— 基线期间源库的变更已被续读点覆盖,不会漏;基线中途崩溃则整体重跑,不留半份数据。
先提交目标库数据、复检租约、最后推进位点。任何一步崩溃都从上一位点重放,重叠窗口由幂等 upsert 吸收 —— 宁可重复,绝不丢失。
多实例按租约互斥,同一同步任务同一时刻至多一个节点消费,宕机接管 ≤ 60s;致命故障(日志被清理、位点失效)置 ERROR 帽等人处置,一键重建基线恢复。
不管用轮询还是日志 CDC,首次全量搬一张大表,快慢主要取决于三个旋钮 —— 一次提交多少行、同时开几条分片,以及索引什么时候建。前两项「够用就好」:再往上加,换来的主要是风险
批次与并行度只作用于首次 / 全量加载,增量轮询与 CDC 回放不受影响。并行覆盖所有有主键的表:整数前导键按区间算术切分,其余键形态按采样边界切分;无主键表按顺序加载。索引时机只影响本轮新建的表,已有表的结构同步行为不变。
| 取值 | 适用场景 | 相对默认 |
|---|---|---|
500 | 目标库敏感、库较老、单表只有几万行 | 慢约 10–15% |
1000–2000 | 均衡,默认 2000 | 基准 |
5000 | 内网低延迟 + SSD + 目标库余量充足 | 再快约 5–10% |
10000–20000 | 不建议,除非专门压测过 | 基本不再变快 |
依据是实测:MERGE 从 500 提到 2000 提速 13%,2000→5000 只再提 6%;而走 INSERT 路径时 batch 2000 已经打到约 20 万行/秒,再往上驱动和数据库都到瓶颈了。数值变大换来的主要是风险:单次事务的 undo/redo 成倍放大、失败时回滚更久、目标表被锁的时间更长、驱动端批缓冲占内存,Oracle 上还可能顶到 undo 表空间。所以 20000 那个上限只是防呆天花板,不是目标值。
同一张卡片里还有两个边界:读取批量同样限制在 1–20000,MySQL 源逐行流式读取时该值不参与;分块大小(chunk-size)必须大于 0,填小于等于 0 表示关闭分块,改为整表加载。
| 取值 | 适用场景 | 相对默认 |
|---|---|---|
1 | 数据库敏感、与生产共用、源和目标同一实例 | 慢约 35–40% |
2 | 均衡,默认 2 | 基准 |
4 | 专用库、多核、I/O 有余量 | 再快约 15–20% |
8 | 只建议在压测过的专库上用 | 收益很小,负载约翻倍 |
一个 worker 同时借 1 条源连接 + 1 条目标连接。并行度 4 意味着目标库上同时有 4 个写事务在提交 —— 数据库压力大致和并行度成正比,不是「只多占一点 CPU」。
源与目标使用不同连接配置时,要求 max-pool-size ≥ 并行度 + 1;源和目标指向同一个连接配置时,要求 max-pool-size ≥ 2 × 并行度 + 2。默认池大小 5 时,前者最多 4 个 worker,后者只剩 1 个。要真上 8,前者池至少 9,后者至少 18。
新建表的非唯一二级索引默认延后:先只建主键(CREATE TABLE 自带)和唯一索引,等首次全量提交完再一次性建普通索引。逐行维护二级索引是装载期实打实的开销 —— 50 万行、2 个索引的容器实测,边灌边建 11.1 秒,不建索引 5.9 秒,最后补建两个索引只要 0.5 秒,端到端快约 42%。
主键不能延(upsert 的冲突判断靠它),唯一索引也不延(重复值要在写进去的那一刻就报错);只同步结构、不跑数据时仍然全部立即创建。开关是 sync.defer-secondary-indexes,默认开。
table=ORDERS thread=full-load-ORDERS rows=100000 changed=100000 elapsed=0.9s rows/s=111111.1 read=18% write=74% commit=8% batches=50 rowsPerBatch=2000
sync.defer-secondary-indexes 控制。改全局默认或 max-pool-size,见 部署文档的配置项。
手写 CSS + 设计令牌,无框架、无构建步骤,内网离线可用
主题写在 <html data-theme>,只覆盖 CSS 变量,因此组件无需第二套深色规则。未手动选择时跟随系统 prefers-color-scheme 并实时响应变化。<head> 内联脚本在首屏渲染前应用主题,避免深色用户看到一帧白底闪烁。
优先级:语言 Cookie › 浏览器时区 › Accept-Language › 简体中文。
为什么时区优先?境外华人用户的浏览器语言常常是英文,但人在国内时区 —— 时区是「想看哪种语言」更准的信号。
所有前端资源均在仓库内,运行时不发起任何外部请求:手写样式、原生 JS、本地托管的图标字体、内联渐变 SVG。字体使用系统字体栈,不引入 webfont。静态资源总体积约 440KB。
验证方式:抓取任意页面 HTML,其中 src/href 引用的外部 http(s) 地址数量为 0。