任务定义 · 命令面 · 预检清单 · 错误模型 · 状态表与幂等 · 指标 · 校验协议(已进仓库,CI 绿)
undo;CLI/UI 改的都是这个文件。mode: frequency: continuous+initial # once | continuous+initial | continuous | interval | full_interval interval: 5m incremental_column: updated_at # 仅 interval 需要 lookback: 5m # 重叠回看,防同值/时钟漂移漏数 target: on_exists: error # error(默认)| append | recreate create_indexes: defer # 同步完再建,最快 guard: slot_warn_lag: 5GB on_exceed: pause # pause | invalidate(PG13+) | advance(需确认)
| 命令 | 作用 | 写库 |
|---|---|---|
plan | 预演:探测+预检+算体量+打印动作清单 | 否 |
preflight | 只跑检查,三级报告 | 否 |
preview | 看「源行 → 目标行」 | 否 |
verify | 分块校验,输出订正 SQL | 否(--fix 才写) |
doctor / status | 体检 / 一屏状态 | 否 |
gc | 清孤儿对象,默认 dry-run | --force 才写 |
run / undo / conflicts resolve | 执行 / 撤销代做动作 / 处理冲突 | 是 |
退出码 0 成功 · 3 需要你处理 · 4 重试用尽 · 5 冲突未决 · 1 一般失败 · 2 参数错误
| PG | 检查 | 不通过 |
|---|---|---|
| PG-01 | wal_level=logical | blocked(给 ALTER SYSTEM + 重启 + 回滚) |
| PG-02/03 | slots / wal_senders 余量 | autofixable(ALTER SYSTEM + reload) |
| PG-04 | 账号有 REPLICATION | autofixable(我们建账号并授权) |
| PG-05 | pg_hba 允许复制连接(真连验证) | blocked(给具体行) |
| PG-06 | 有主键 / REPLICA IDENTITY 够用 | blocked(给出改法) |
| PG-07 | 有无 slot 磁盘阀(13+) | 记补偿:「只能告警不能自动失效」 |
| MY-01/02 | log_bin / binlog_format=ROW | blocked(my.cnf + 重启) |
| MY-03 | binlog_row_image=FULL | autofixable(SET GLOBAL) |
| MY-05 | server_id 唯一 | blocked(给建议值) |
| MY-08 | 存储引擎 | MyISAM → blocked(无事务) |
| MY-09 | 认证插件(8.4/9.x 移除 native) | autofixable(建 caching_sha2 账号) |
| Code | 类别 | 人话 | 下一步 |
|---|---|---|---|
| E1001 | user_action | 源库没开启「变更流水」 | 执行 ALTER SYSTEM → 重启 → 回来续跑 |
| E1002 | user_action | 目标表已存在,按当前设置停止 | 改 on_exists: append 或换 schema |
| E1005 | user_action | 已有另一个实例在跑这个任务 | 确认旧进程,或等租约过期 |
| E2001 | retryable | 目标库连接被重置 | 自动重试 5s/20s/60s |
| E3001 | fatal | 位点已不连续(变更流水被清) | run --resync 重新初始化 |
| E4001 | bug | 遇到未支持的类型 | 附日志提 issue |
--verbose。六张表全落目标库:_ds_lease(租约,TTL 30s,防双写)· _ds_meta(阶段 + 权威位点)· _ds_chunk(快照块级断点)· _ds_conflict · _ds_dead_letter · _ds_event(补偿载体,接源端触发器的 TRUNCATE/DDL)。
count(*) 与 sum(xxhash64(规范化整行))。--fix 生成并执行 upsert,写进 _ds_conflict 留痕。verify 必须报出。`internal/source/contract.go` 与 `internal/sink/contract.go` 已经进仓库并通过 vet/build —— 设计不再是文字,接口对不上就编不过。
Capability / Compensation{Level: auto|costly|blocked}:能力探测与补偿是一等公民,而不是散落的 if。Source:Probe / Catalog / Preflight / Prepare / Snapshot / Stream / Advance / Cleanup。Sink.Apply(ctx, events, position) —— 位点参数是强制的,从接口上就堵死"忘了提交位点"。Action{What, SQL, Undo, Applied}:「系统为你做了什么」的载体。