Database Administration Guide

Version: 1.0.0 | PostgreSQL 15

Common Operations

Backups

# Manual backup
sudo -u postgres pg_dump koprogo_db | gzip > backup_$(date +%Y%m%d).sql.gz

# Restore
gunzip -c backup_20251110.sql.gz | sudo -u postgres psql koprogo_db

Migrations

# Apply pending migrations
cd backend
sqlx migrate run

# Revert last migration
sqlx migrate revert

# Create new migration
sqlx migrate add add_column_x_to_table_y

Performance

-- Vacuum and analyze
VACUUM ANALYZE;

-- Reindex
REINDEX DATABASE koprogo_db;

-- Check table sizes
SELECT relname, pg_size_pretty(pg_total_relation_size(relid))
FROM pg_catalog.pg_statio_user_tables
ORDER BY pg_total_relation_size(relid) DESC;

-- Check index usage
SELECT schemaname, tablename, indexname, idx_scan
FROM pg_stat_user_indexes
ORDER BY idx_scan ASC;

Monitoring

-- Active connections
SELECT count(*) FROM pg_stat_activity WHERE state = 'active';

-- Long-running queries
SELECT pid, now() - query_start as duration, query
FROM pg_stat_activity
WHERE state = 'active' AND now() - query_start > interval '5 minutes';

-- Lock monitoring
SELECT * FROM pg_locks WHERE NOT granted;

Maintenance

-- Terminate idle connections
SELECT pg_terminate_backend(pid)
FROM pg_stat_activity
WHERE state = 'idle' AND now() - state_change > interval '10 minutes';

-- Update statistics
ANALYZE;

Troubleshooting

Connection exhausted

# Increase max_connections
sudo nano /etc/postgresql/15/main/postgresql.conf
# max_connections = 200

sudo systemctl restart postgresql

Slow queries

-- Enable slow query logging
ALTER DATABASE koprogo_db SET log_min_duration_statement = 1000; -- 1s

-- Check logs
sudo tail -f /var/log/postgresql/postgresql-15-main.log

Version: 1.0.0