Database Issues Runbook
Procedures for handling database-related issues in Aragora.
Quick Diagnosis
# Check database status via API
curl -s http://localhost:8080/api/health/detailed | jq .components
# Check disk space
df -h
# Check database file size (SQLite)
ls -lh /app/data/*.db
Common Issues
1. Database Locked
Symptoms:
- "database is locked" errors
- Timeouts on write operations
- Slow queries
Resolution:
# 1. Check for long-running queries (if using PostgreSQL)
# For SQLite, check for other processes holding locks:
sudo lsof /app/data/aragora.db
# 2. Restart the service to release locks
sudo systemctl restart aragora
# 3. If persists, check for zombie processes
ps aux | grep aragora
sudo kill -9 <zombie_pid>
2. Database Corruption
Symptoms:
- "malformed database schema" errors
- "database disk image is malformed"
- Query results are incorrect or partial
Resolution:
# 1. Stop the service
sudo systemctl stop aragora
# 2. Backup the corrupted database
cp /app/data/aragora.db /app/data/aragora.db.corrupted.$(date +%Y%m%d)
# 3. Try integrity check
sqlite3 /app/data/aragora.db "PRAGMA integrity_check;"
# 4. Attempt recovery
sqlite3 /app/data/aragora.db ".recover" | sqlite3 /app/data/aragora_recovered.db
# 5. If recovery succeeds, replace original
mv /app/data/aragora_recovered.db /app/data/aragora.db
# 6. Restart service
sudo systemctl start aragora
3. Disk Space Full
Symptoms:
- "disk full" or "no space left on device" errors
- Service crashes on write
- Database operations fail silently
Resolution:
# 1. Check disk usage
df -h
du -sh /app/data/*
# 2. Clean old logs
sudo journalctl --vacuum-time=7d
# 3. Run database maintenance (vacuum)
curl -X GET "http://localhost:8080/api/system/maintenance?task=vacuum"
# 4. Remove old backups
ls -la /app/data/backups/
rm /app/data/backups/aragora.db.backup.* # Keep recent ones
# 5. If using WAL mode, checkpoint
sqlite3 /app/data/aragora.db "PRAGMA wal_checkpoint(TRUNCATE);"
4. Connection Pool Exhaustion
Symptoms:
- "too many connections" errors
- Requests timing out
- Memory usage climbing
Resolution:
# 1. Check current connections
curl -s http://localhost:8080/api/health/detailed | jq .database
# 2. Restart to reset pool
sudo systemctl restart aragora
# 3. If persistent, increase pool size in config:
# Set DATABASE_POOL_SIZE environment variable
5. Supabase Connection Issues
Symptoms:
- "connection refused" to Supabase
- "authentication failed"
- Timeout errors on persistence operations
Resolution:
# 1. Check Supabase status
curl -s https://status.supabase.com/api/v2/status.json | jq .status
# 2. Test connection
curl -H "apikey: $SUPABASE_KEY" \
-H "Authorization: Bearer $SUPABASE_KEY" \
"$SUPABASE_URL/rest/v1/"
# 3. Verify credentials
echo "URL: $SUPABASE_URL"
echo "Key length: ${#SUPABASE_KEY}"
# 4. Check network connectivity
nc -zv ${SUPABASE_URL#https://} 443
# 5. If credentials rotated, update:
# - Update .env file
# - Update GitHub secrets
# - Update systemd environment
sudo systemctl daemon-reload
sudo systemctl restart aragora
Database Maintenance
Scheduled Maintenance
# Run full maintenance via API
curl -X GET "http://localhost:8080/api/system/maintenance?task=full"
# Individual tasks:
curl -X GET "http://localhost:8080/api/system/maintenance?task=vacuum"
curl -X GET "http://localhost:8080/api/system/maintenance?task=analyze"
curl -X GET "http://localhost:8080/api/system/maintenance?task=checkpoint"
Manual SQLite Maintenance
# Vacuum (reclaim space)
sqlite3 /app/data/aragora.db "VACUUM;"
# Analyze (update statistics)
sqlite3 /app/data/aragora.db "ANALYZE;"
# Integrity check
sqlite3 /app/data/aragora.db "PRAGMA integrity_check;"
# WAL checkpoint
sqlite3 /app/data/aragora.db "PRAGMA wal_checkpoint(TRUNCATE);"
Backup and Restore
Create Backup
# Hot backup (safe while service running)
sqlite3 /app/data/aragora.db ".backup /app/data/backups/aragora.$(date +%Y%m%d_%H%M%S).db"
# Or via API
curl -X POST http://localhost:8080/api/admin/backup
Restore from Backup
# 1. Stop service
sudo systemctl stop aragora
# 2. Backup current (corrupted) database
mv /app/data/aragora.db /app/data/aragora.db.bad
# 3. Restore from backup
cp /app/data/backups/aragora.YYYYMMDD_HHMMSS.db /app/data/aragora.db
# 4. Set permissions
chown aragora:aragora /app/data/aragora.db
# 5. Start service
sudo systemctl start aragora
# 6. Verify
curl http://localhost:8080/api/health
Monitoring Queries
Check Table Sizes
SELECT
name,
(SELECT COUNT(*) FROM debates) as count
FROM sqlite_master
WHERE type='table' AND name='debates';
Check Recent Activity
-- Recent debates
SELECT id, task, created_at
FROM debates
ORDER BY created_at DESC
LIMIT 10;
-- ELO updates
SELECT agent, rating, updated_at
FROM agent_ratings
ORDER BY updated_at DESC
LIMIT 10;
Escalation
If database issues persist after following this runbook:
-
Check logs for detailed error messages:
sudo journalctl -u aragora -n 500 --no-pager | grep -i "database\|sqlite\|supabase" -
Create backup before attempting risky operations
-
Consider failover to read-only mode if write corruption suspected
-
Contact support with:
- Error messages
- Database file size
- Disk usage stats
- Recent changes to configuration