diff --git a/docs/ROOT_CAUSE_DATA_LOSS_FIX.md b/docs/ROOT_CAUSE_DATA_LOSS_FIX.md new file mode 100644 index 00000000..e43651e9 --- /dev/null +++ b/docs/ROOT_CAUSE_DATA_LOSS_FIX.md @@ -0,0 +1,131 @@ +# 🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних + +## Дата виявлення: 2025-12-05 + +## Симптоми +- Дані (MicroDAO, агенти) періодично зникають +- "MicroDAO не знайдено" +- "Агенти не знайдені" (0 агентів) +- Це відбувалось **щодня** + +## Коренева причина + +**НЕСКІНЧЕННИЙ ЦИКЛ DROP DATABASE:** + +1. `monitor-db-stability.sh` (cron кожні 5 хвилин) перевіряв: + - Якщо агентів < 50 → **DROP DATABASE** і відновити з бекапу + +2. **Проблема**: Бекап від 2025-12-02 **НЕ МАВ NODE2 агентів** (50 агентів) + +3. Після відновлення з бекапу: лише 9 MicroDAO, 9 core агентів + +4. Monitor знову бачив < 50 агентів → знову DROP → **НЕСКІНЧЕННИЙ ЦИКЛ!** + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ Monitor бачить: Agents=9 (< 50) │ +│ ↓ │ +│ DROP DATABASE daarion │ +│ ↓ │ +│ Restore from backup (без NODE2 агентів) │ +│ ↓ │ +│ Agents=9 знову │ +│ ↓ │ +│ Monitor бачить: Agents=9 (< 50) → ЦИКЛ ПОВТОРЮЄТЬСЯ │ +└─────────────────────────────────────────────────────────────────┘ +``` + +## Виправлення + +### 1. Змінено логіку monitor-db-stability.sh + +**Старе (ПОМИЛКОВЕ):** +```bash +# Якщо агентів < 50 → DROP DATABASE +if [ "$AGENT_COUNT" -lt 50 ]; then + DROP DATABASE + RESTORE FROM BACKUP +fi +``` + +**Нове (ПРАВИЛЬНЕ):** +```bash +# CASE 1: CRITICAL - MicroDAOs missing → FULL RECOVERY (DROP) +if [ "$MICRODAO_COUNT" -lt 5 ]; then + DROP DATABASE + RESTORE FROM BACKUP + +# CASE 2: SOFT - MicroDAOs exist but agents missing → just sync agents (NO DROP!) +elif [ "$NODE2_AGENT_COUNT" -lt 45 ]; then + # NO DROP DATABASE! + python3 sync-node2-dagi-agents.py +fi +``` + +### 2. Створено новий бекап з NODE2 агентами + +```bash +full_backup_with_node2_2025-12-05_02-41.sql # 183KB з 59 агентами +pre_migration_2025-12-02_02-00.sql # 162KB без NODE2 агентів +``` + +### 3. Пріоритет бекапів + +Monitor тепер спочатку шукає `full_backup_with_node2*.sql`, потім інші. + +## Два режими відновлення + +| Ситуація | Режим | Дія | +|----------|-------|-----| +| MicroDAOs < 5 | 🔴 FULL RECOVERY | DROP DATABASE + restore + sync | +| MicroDAOs ≥ 5, NODE2 < 45 | 🟡 SOFT RECOVERY | Тільки sync NODE2 агентів (NO DROP!) | +| Все в нормі | ✅ OK | Нічого не робити | + +## Перевірка + +```bash +# Поточний стан +docker exec daarion-postgres psql -U postgres -d daarion -c " +SELECT + (SELECT COUNT(*) FROM microdaos) as microdaos, + (SELECT COUNT(*) FROM agents) as agents, + (SELECT COUNT(*) FROM agents WHERE node_id = 'node-2-macbook-m4max') as node2_agents; +" + +# Очікуваний результат: +# microdaos | agents | node2_agents +# ----------+--------+-------------- +# 9 | 59 | 50 +``` + +## Логи monitor + +```bash +# Перевірити що monitor не робить DROP +tail -50 /var/log/db-stability-monitor.log + +# Має показувати: +# ✅ Data integrity OK +# АБО +# 🟡 WARNING: NODE2 agents missing. Starting SOFT RECOVERY (no DROP)... +``` + +## Cron jobs + +```bash +crontab -l +# */5 * * * * /opt/microdao-daarion/scripts/monitor-db-stability.sh +# */30 * * * * /opt/microdao-daarion/scripts/db-health-check.sh +``` + +## Файли, що були змінені + +- `scripts/monitor-db-stability.sh` - головний фікс +- `db_backups/full_backup_with_node2_*.sql` - новий бекап + +## Статус: ✅ ВИРІШЕНО + +Проблема виникала через логічну помилку в monitor-db-stability.sh. +Виправлено розділенням на два режими: FULL та SOFT recovery. +Тепер DROP DATABASE відбувається тільки при критичній втраті MicroDAOs. +