docs(deploy): METHODOLOGY补dsync章节——dmig管结构/dsync管配置数据的职责边界(用户定夺:数据一条通道,m0016撤销)、域定义+24条门禁+只增改不删+机构过滤+密钥直迁+单事务ROLLBACK语义、实测记录(PRIMARY约束名坑)、生产导入时机(晚于create_tables)

This commit is contained in:
yumoqing 2026-09-09 16:57:55 +08:00
parent 2fe3d446dc
commit 929a538527

View File

@ -166,3 +166,39 @@ CREATE TABLE IF NOT EXISTS pipeline_deploy_ledger (
2. **只在测试跑 DDL 口头说"生产一样"** → 必然漂移。用 `ddiff.py` 强制对账。
3. **回退没有 down** → 不可逆变更DROP 列、删数据)必须有备份兜底,备份在操作前。
4. **破坏性语句进自动化** → 永远 `[NEEDS_APPROVAL]`,人工执行。
## 7. 配置数据同步dsync.py2026-09-09 用户定夺:数据一条通道)
**职责边界**dmig 只管表结构DDL与环境参数业务配置数据模型网关/定价/产品/
折扣/供应商/记账配置)**不走 git 迁移**,一律由 `dsync.py` 按域同步m0016 种子迁移已撤销——
同一份数据两条通道毫无意义。事务数据usage/balance/detail/bill/subscription永远不同步。
**域定义** `deploy/dsync_domains.json`:每域 = 表清单 + 机构过滤列 + order 拓扑序;
`gate` 段 = 全库悬空引用门禁 SQL模型→供应商/账号/模板/ppid、供应商→机构注册+记账开户、
产品→分类/资源实体、折扣→产品……返回行 = 失败)。加新域 = 加一段配置 + 补对应门禁。
**流程**
```
测试机: ./py3/bin/python deploy/dsync.py export -o /tmp/pkg.json # 全部域
传输: ssh 管道 cat 直传(包内含 llm_account.api_key 密文——禁入 git禁落中间盘
生产机: ./py3/bin/python deploy/dsync.py import pkg.json --dry-run # 预演
生产机: ./py3/bin/python deploy/dsync.py import pkg.json # 正式
生产机: ./py3/bin/python deploy/dsync.py gate # 日常体检(只读)
```
**安全语义**
- 只增改不删:按主键 upsert目标多出的行保留生产专属数据绝不误删
- 机构过滤:只带 org ∈ {'0','*',''} 目标环境 organization 实有机构(测试 test_* 机构数据跳过)
- 密钥直迁:两环境 password_key sha256 一致已核对api_key 密文原样搬运
- 前置检查:目标缺表直接中止(提示先跑 create_tables.py
- 导入前强制 dbackup 备份涉及表;全部导入 + 24 条门禁在**单事务**内,任一悬空 →
ROLLBACK绝不落地半份数据全绿才 COMMIT
- 门禁失败 exit 2 / 一般失败 exit 1 / 成功 exit 0
**实测记录2026-09-09 测试机自导自入 + 负向验证)**241 行全 updated 幂等;
篡改 vendor_id 为悬空值 → 门禁精准拦截「模型→供应商 1 行悬空」→ ROLLBACK → 复跑 gate
全绿零污染。踩坑information_schema 主键约束名是 `PRIMARY` 不是 `PRIMARY KEY`
(查空 → upsert 全走 INSERT 撞 1062首版即崩测试机负向验证抓到
**生产导入时机**:必须晚于 create_tables.py 建表llm_* 等 13 张表在生产不存在时
前置检查会正确中止)。