🔴 КРИТИЧНЕ ВИПРАВЛЕННЯ: Періодична втрата даних¶
Дата виявлення: 2025-12-05¶
Симптоми¶
- Дані (MicroDAO, агенти) періодично зникають
- "MicroDAO не знайдено"
- "Агенти не знайдені" (0 агентів)
- Це відбувалось щодня
Коренева причина¶
НЕСКІНЧЕННИЙ ЦИКЛ DROP DATABASE:
monitor-db-stability.sh(cron кожні 5 хвилин) перевіряв:-
Якщо агентів < 50 → DROP DATABASE і відновити з бекапу
-
Проблема: Бекап від 2025-12-02 НЕ МАВ NODE2 агентів (50 агентів)
-
Після відновлення з бекапу: лише 9 MicroDAO, 9 core агентів
-
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¶
Старе (ПОМИЛКОВЕ):
# Якщо агентів < 50 → DROP DATABASE
if [ "$AGENT_COUNT" -lt 50 ]; then
DROP DATABASE
RESTORE FROM BACKUP
fi
Нове (ПРАВИЛЬНЕ):
# 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 агентами¶
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 | Нічого не робити |
Перевірка¶
# Поточний стан
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¶
# Перевірити що monitor не робить DROP
tail -50 /var/log/db-stability-monitor.log
# Має показувати:
# ✅ Data integrity OK
# АБО
# 🟡 WARNING: NODE2 agents missing. Starting SOFT RECOVERY (no DROP)...
Cron jobs¶
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.