Files
microdao-daarion/docs/ROOT_CAUSE_DATA_LOSS_FIX.md

132 lines
4.8 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# 🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних
## Дата виявлення: 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.