Skip to content

Database Issues

Database-related problems and their solutions.

PostgreSQL Issues

Connection Problems

Symptoms: - Services can't connect to database - Connection timeouts - "Connection refused" errors

Diagnosis:

# Check PostgreSQL status
docker ps | grep postgres

# Test database connectivity
docker exec postgres psql -U homelab -d homelab -c "SELECT 1;"

# Check database logs
docker logs postgres --tail 50

# Check network connectivity
docker exec service_name ping postgres

Solutions:

Restart Database

# Restart PostgreSQL
docker restart postgres

# Wait for startup
sleep 10

# Test connection
docker exec postgres psql -U homelab -d homelab -c "SELECT 1;"

User Authentication Issues

# Check existing users
docker exec postgres psql -U homelab -d homelab -c "\du"

# Recreate user
docker exec postgres psql -U homelab -d homelab -c "
  DROP USER IF EXISTS service_user;
  CREATE USER service_user WITH PASSWORD 'password';
  GRANT ALL PRIVILEGES ON DATABASE service_db TO service_user;
"

# Test new user
docker exec postgres psql -U service_user -d service_db -c "SELECT 1;"

Network Issues

# Check network configuration
docker network ls
docker network inspect network_name

# Reconnect service to network
docker network connect network_name service_name

Database Performance

Symptoms: - Slow queries - High memory usage - Database locks

Diagnosis:

# Check active connections
docker exec postgres psql -U homelab -d homelab -c "SELECT count(*) FROM pg_stat_activity;"

# Check slow queries
docker exec postgres psql -U homelab -d homelab -c "
  SELECT query, mean_time, calls 
  FROM pg_stat_statements 
  ORDER BY mean_time DESC 
  LIMIT 10;
"

# Check database size
docker exec postgres psql -U homelab -d homelab -c "
  SELECT pg_database.datname, 
         pg_size_pretty(pg_database.datname) 
  FROM pg_database.datname;
"

Solutions:

Optimize Database

# Vacuum and analyze
docker exec postgres psql -U homelab -d homelab -c "VACUUM ANALYZE;"

# Reindex database
docker exec postgres psql -U homelab -d homelab -c "REINDEX DATABASE homelab;"

# Update statistics
docker exec postgres psql -U homelab -d homelab -c "ANALYZE;"

Connection Pooling

# Update service configuration
environment:
  - DB_MAX_CONNECTIONS=20
  - DB_MIN_CONNECTIONS=5

Storage Issues

Symptoms: - Disk space full - Database corruption - WAL file growth

Diagnosis:

# Check disk usage
df -h

# Check database size
docker exec postgres psql -U homelab -d homelab -c "
  SELECT pg_size_pretty(pg_database_size('homelab'));
"

# Check WAL files
docker exec postgres du -sh /var/lib/postgresql/pg_wal

Solutions:

Clean Up WAL Files

# Archive old WAL files
docker exec postgres psql -U homelab -d homelab -c "SELECT pg_switch_wal();"

# Reduce WAL retention
docker exec postgres psql -U homelab -d postgres -c "
  ALTER SYSTEM SET wal_keep_segments = 10;
"

Vacuum Full

# Perform full vacuum (requires exclusive access)
docker exec postgres psql -U homelab -d homelab -c "VACUUM FULL;"

MariaDB/MySQL Issues

Connection Problems

# Check MariaDB status
docker ps | grep mariadb

# Test connection
docker exec mariadb mysql -u root -prootpassword123 -e "SELECT 1;"

# Check logs
docker logs mariadb --tail 50

Performance Issues

# Optimize tables
docker exec mariadb mysql -u root -prootpassword123 -e "
  OPTIMIZE TABLE flarum_posts;
  OPTIMIZE TABLE flarum_users;
"

# Check slow queries
docker exec mariadb mysql -u root -prootpassword123 -e "
  SELECT * FROM mysql.slow_log ORDER BY start_time DESC LIMIT 10;
"

Database Backup and Recovery

PostgreSQL Backup

# Full database backup
docker exec postgres pg_dump -U homelab homelab > /opt/homelab/backups/postgres-$(date +%Y%m%d).sql

# Individual database backup
docker exec postgres pg_dump -U homelab freshrss > /opt/homelab/backups/freshrss-$(date +%Y%m%d).sql

# Compressed backup
docker exec postgres pg_dump -U homelab homelab | gzip > /opt/homelab/backups/postgres-$(date +%Y%m%d).sql.gz

PostgreSQL Restore

# Restore full database
docker exec postgres psql -U homelab -d homelab < /opt/homelab/backups/postgres-20260116.sql

# Restore individual database
docker exec postgres psql -U homelab -d freshrss < /opt/homelab/backups/freshrss-20260116.sql

# Drop and recreate database
docker exec postgres psql -U homelab -d postgres -c "DROP DATABASE IF EXISTS old_db;"
docker exec postgres psql -U homelab -d postgres -c "CREATE DATABASE new_db;"

MariaDB Backup

# Full backup
docker exec mariadb mysqldump -u root -prootpassword123 --all-databases > /opt/homelab/backups/mariadb-$(date +%Y%m%d).sql

# Individual database backup
docker exec mariadb mysqldump -u root -prootpassword123 flarum > /opt/homelab/backups/flarum-$(date +%Y%m%d).sql

MariaDB Restore

# Restore full backup
docker exec mariadb mysql -u root -prootpassword123 < /opt/homelab/backups/mariadb-20260116.sql

# Restore individual database
docker exec mariadb mysql -u root -prootpassword123 flarum < /opt/homelab/backups/flarum-20260116.sql

Database Migration

PostgreSQL Version Upgrade

# Check current version
docker exec postgres psql -U homelab -d homelab -c "SELECT version();"

# Backup before upgrade
docker exec postgres pg_dump -U homelab homelab > /opt/homelab/backups/pre-upgrade.sql

# Upgrade PostgreSQL (update docker-compose.yml image)
docker compose down
docker compose up -d

# Run upgrade
docker exec postgres pg_upgrade -U homelab -d homelab -b /opt/homelab/backups/pre-upgrade.sql

Data Migration

# Export data
docker exec postgres pg_dump -U homelab -d old_db > /opt/homelab/backups/old_db.sql

# Create new database
docker exec postgres psql -U homelab -d postgres -c "CREATE DATABASE new_db;"

# Import data
docker exec postgres psql -U homelab -d new_db < /opt/homelab/backups/old_db.sql

Prevention

Regular Maintenance

  • Monitor database size
  • Check connection limits
  • Run regular backups
  • Optimize performance

Best Practices

  • Set appropriate connection limits
  • Use connection pooling
  • Monitor slow queries
  • Keep regular backups

Monitoring

# Database size monitoring
docker exec postgres psql -U homelab -d homelab -c "
  SELECT pg_database.datname, 
         pg_size_pretty(pg_database_size(pg_database.datname)) 
  FROM pg_database.datname;
"

# Connection monitoring
docker exec postgres psql -U homelab -d homelab -c "SELECT count(*) FROM pg_stat_activity;"

# Performance monitoring
docker exec postgres psql -U homelab -d homelab -c "
  SELECT datname, numbackends, xact_commit, xact_rollback, blks_read, blks_hit
  FROM pg_stat_database 
  WHERE datname = 'homelab';
"

Getting Help

Before Reporting Issues

  • Checked database connectivity
  • Verified user permissions
  • Tested basic queries
  • Reviewed error logs

Information to Include

  • Database version
  • Connection test results
  • Error messages
  • Recent changes
  • Performance statistics