diff --git a/.workbuddy/memory/2026-09-03.md b/.workbuddy/memory/2026-09-03.md new file mode 100644 index 0000000..683e728 --- /dev/null +++ b/.workbuddy/memory/2026-09-03.md @@ -0,0 +1,39 @@ +# 2026-09-03 同步 1062 复发 + Oracle 盒子过载 + +## 问题 +用户报 sync 状态卡在「同步中」+ `1062 Duplicate entry '...mp4' for key 'filename'`。 +游标停在 `2026-09-02 13:55:21`。 + +## 根因(与 8/29 identity_map 同一类) +Oracle FAM-Edge 的 SQLite 视频/人物 id 整体重排(2303 段 → 3408/4600+ 段), +NAS 镜像表 `sync_videos`/`sync_people` 旧 upsert 以 Oracle id 当主键插入, +与已存在的同 `filename`/`label` 行在 UNIQUE 键上二次冲突 → 1062,整批中止、游标不推进。 +量化:本次积压 348 videos 中 **114 行**会 1062;9 people 中 **6 行**会 1062。 +events/model_calls 仅 PK id(ON DUPLICATE 按 id 更新,不会 1062)→ 无需改。 + +## 修复(已部署 NAS + 提交推送 0238030) +- `upsert_sync_videos`:改以 `filename` 业务键去重,命中就地 UPDATE 保留 NAS 原 id + (防 sync_events/model_calls/identity_map 的 video_id 外键失效),Oracle id 落 + `oracle_id` 列溯源;未命中插入优先用 Oracle id 对齐子表引用,主键冲突回退自增。 +- `upsert_sync_people`:同模式,以 `label` 业务键去重(people.id 无外键引用)。 +- `scripts/ddl.sql`:sync_videos/sync_people 的 id 改 NAS 本地自增 + 新增 oracle_id 列。 +- NAS 现网迁移:两表加 oracle_id、回填 oracle_id=id、id 改 AUTO_INCREMENT,重启。 +- 验证:单批补拉 videos+348 events+1017 people+9 model_calls+500 identity_map+238, + 游标 → `2026-09-03 08:51:11`,无 1062。目标行保留 id=2303、oracle_id=3408。 + +## 第二个问题:Oracle 盒子过载/挂死(未解决,环境层) +NAS 日志 08:51–08:56 持续:`推送运动事件到 Oracle 失败 Connection reset` / +`500 {"error":"database is locked"}` / `RemoteDisconnected`。 +FAM-Edge /health 先 200(status ok)后变 HTTP 000;最终整盒 129.146.26.249 全暗 +(:80/:5000/:5300/:7000/:8123 均 000),但 TCP :22/:5000 端口 OPEN、SSH 握手被拒 +(kex 阶段 Connection closed)→ 进程卡死/资源耗尽(4C23G 上 FAM-Edge 分析管线 + +ai-gateway + garmin + auth-hub + frps + caddy 挤一起,SQLite 锁竞争 + 可能 OOM)。 +**SSH 连不进去,无法远程修复。** 需用户在 Oracle Cloud 控制台重启 VM,或等其自恢复。 +恢复后 NAS 的 oracle_sync 后台线程(30min 周期)会自动从游标 08:51:11 续拉, +motion_notifier 也会恢复推送。 + +## 经验 +- 所有以 Oracle id 为镜像主键的表迟早会因 Oracle 库重建/重排踩坑。已修: + identity_map(8/29)、videos+people(9/3)。events/model_calls 目前 PK-only 安全, + 但若将来 Oracle 重建导致子表引用错位,需同样改造(加 oracle_id + 业务键)。 +- Oracle 盒子服务过多挤在 4C23G,建议拆分或给 FAM-Edge SQLite 开 WAL + 限速。