docs: Document root cause of daily data loss and fix
This commit is contained in:
131
docs/ROOT_CAUSE_DATA_LOSS_FIX.md
Normal file
131
docs/ROOT_CAUSE_DATA_LOSS_FIX.md
Normal file
@@ -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.
|
||||
|
||||
Reference in New Issue
Block a user