Files
sentinel-home-ai/.workbuddy/memory/MEMORY.md
ericwyuan 988c63a8f9 fix(fam-core): 修复 sync_identity_map 增量同步 1062 主键冲突导致游标卡死
Oracle→NAS 增量同步反复报 (1062, "Duplicate entry '1073-汤圆' for key
'uq_video_raw_uid'"),整批失败、游标永不推进,同步状态页卡在"同步中"。

根因:sync_identity_map 以 Oracle person_identity_map.id(代理自增键)
作 NAS 主键,但 Oracle 库重建/恢复后这个 id 会被复用——实测 Oracle 现在
的 id=744 对应 (1073,'汤圆'),NAS 上 id=744 还是旧的 (1302,'人物E')。
upsert 先按 PK id 命中旧行,UPDATE 成 (1073,'汤圆') 后与已存在的同名行
在 uq_video_raw_uid 上二次冲突。

修复:镜像表改为 NAS 本地自增 id 主键,业务键 (video_id, raw_uid) 唯一,
Oracle 的 id 只落 oracle_id 列做溯源;upsert 的 UPDATE 子句不再改写
video_id/raw_uid 这两个键列,只更新 oracle_id/canonical_name/source 等。
ddl.sql 同步更新表定义。

已在 NAS 上完成现网迁移(ADD COLUMN oracle_id -> 回填 -> 主键改自增)并
验证:补拉同步成功恢复,游标正常推进,手动触发同步验证通过。

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
2026-08-29 23:11:10 +08:00

3.5 KiB
Raw Blame History

sentinel-home-ai 项目长期记忆

项目概况

  • 家庭多模态智能监控系统,仓库 http://192.168.50.64:3000/ericwyuan/sentinel-home-aiGitea 内网)
  • 本地 /Users/ericwyuan/Desktop/Work/sentinel-home-aimonorepofam-core NAS 端 + fam-edge Oracle 端 + fam-ui Vue3 前端)

架构 v32026-08-22 定稿:运动事件驱动)

  • 不再分析整段视频。Google Drive --rclone--> Oracle gdrive_videos整段素材保留 Oracle 按 NAS 推送的 ss_motion_eventsstart_time/durationUnix epochffmpeg 分割运动片段 -c:v copy -c:a aac 保留音频,产物 /opt/fam-edge/motion_clips/只分析运动片段
  • Drive 中转是跨境提速设计(非仅 NAT 原因):中国→海外裸 HTTP/SCP 直传 Oracle 很难(跨境单 TCP 流 丢包掉速);改走 GoogleCloudSync 分块并发 + 断点续传,抗抖动)→ Oracle rclone 每 5min 拉取 海外数据中心互联Gbps不要轻易提议砍掉 Drive 改 NAS 直连 Oracle
  • NAS MotionNotifier 轮询 SS EventCenter.Event.List60scamera_ids=2, event_types=10推送 /api/ss/motion游标 MariaDB 续用 + 失败批次不前进 + 心跳。Webhook 端点保留为可选补充。
  • SS duration=0 = 动作进行中(结束才回填真实时长),分割只处理已结束事件。
  • 前端fam-ui Vue3不改/api/ui/videos|stats|people|attention-events|... 契约保持; 事件帧图 /api/proxy/frame 用绝对 ts event_start_time 偏移取帧,运动片段天然兼容。

服务器与部署

  • NAS (192.168.50.64)SSH 2222, ericwyuan/iLoveJava5fam-core 代码 /volume1/web/sentinel-home-ai venv fam-core/venvstart_core.sh source .env重启 = kill gunicorn + setsid bash start_core.sh NAS 无 systemd 守护)。
  • Oracle云服务器 129.146.26.249SSH key ~/.ssh/oracle_newfam-edge 由 systemd fam-edge.service 守护Restart=always——部署代码后必须 sudo systemctl restart fam-edge 手动 setsid 会端口冲突venv /opt/fam-edge/venv;库 /opt/fam-edge/data/oracle.db 素材 /opt/fam-edge/gdrive_videoslogs 目录 ubuntu 可写。 前端亦托管于此机 Caddy :80fam-ui SPA + /api 反代回 NAS fam-core :8000 经 frp 隧道);旧机 129.146.203.203 已退役。
  • 部署:本地 git 提交 push Gitea → tar 管道NAS 直接解包Oracle --strip-components=1 到临时目录再 cp避免动 data/venv
  • NAS 部署坑2026-08-29 踩过):拷贝 .py 会带旧 mtime.pyc.pyPython 加载陈旧字节码 (旧逻辑上线,曾导致 1062 假象)。部署后必须 find src -name __pycache__ -exec rm -rf {} + 再重启; pkill -f 会匹配 SSH 自身命令导致断连(用 PID 文件或精确 pattern
  • 镜像表键设计2026-08-29 定稿)sync_identity_map 不再以 Oracle person_identity_map.id 作主键 Oracle 库重建会复用 id改 NAS 本地自增 id + 唯一键 (video_id, raw_uid)Oracle id 落 oracle_id 列溯源; 同批 upsert 的 UPDATE 子句不改写键列,避免 uq 二次冲突 1062。sync_videos/events/model_calls 同理(风险低未改)。

提交规范(强制)

  • 格式 [阶段X.Y子任务号] 子任务名称 - 完成内容简述Bug 修复 fix(模块): 问题简述
  • 一任务一 commit开工先 git pull --rebase;阻塞先 commit 加 [WIP]
  • 禁止 git push --force--no-verify