Skip to main content

PostgreSQL Backup and Restore Guide

This guide provides comprehensive instructions for backing up and restoring PostgreSQL databases in Docker containers.

Data Backups Repository Structure

Backups are stored in a structured repository following this hierarchy:

data-backups/
├── README.md
└── opengin
├── development
│ ├── mongodb
│ │ └── opengin.tar.gz
│ ├── neo4j
│ │ └── neo4j.dump
│ └── postgres
│ └── opengin.tar.gz
├── production
│ ├── mongodb
│ └── neo4j
└── staging
├── mongodb
└── neo4j

This structure allows for:

  • Environment separation: development, staging, production
  • Database type organization: mongodb, neo4j, postgres
  • Version management: 0.0.1, 0.0.2, etc.
  • Consistent naming: All backups follow the same pattern

Prerequisites

  • Docker installed and running
  • PostgreSQL container running (using docker-compose)
  • Access to PostgreSQL container
  • PostgreSQL credentials (replace <your_username> and <your_password> in commands below)

Backup and Restore Commands

1.1 Create PostgreSQL Backup

# Create backup directory
mkdir -p ./backups/postgres

# Create PostgreSQL dump
docker exec postgres pg_dump -U <your_username> -h localhost -d <your_database> -f /var/lib/postgresql/backup/opengin.sql

# Copy backup from container to host
docker cp postgres:/var/lib/postgresql/backup/opengin.sql ./backups/postgres/

# Create compressed archive
cd ./backups/postgres
tar -czf opengin.tar.gz opengin.sql
rm -rf opengin.sql

# Clean up container backup
docker exec postgres rm -rf /var/lib/postgresql/backup/opengin.sql

1.2 Restore PostgreSQL from Backup

# Extract backup file
tar -xzf opengin.tar.gz

# Copy backup to container
docker cp opengin.sql postgres:/var/lib/postgresql/backup/

# Restore database
docker exec postgres psql -U <your_username> -d <your_database> -f /var/lib/postgresql/backup/opengin.sql

# Clean up
docker exec postgres rm -rf /var/lib/postgresql/backup/opengin.sql
rm -rf opengin.sql

Method 2: Using Docker Volume Mounts

2.1 Create Backup with Volume Mount

# Create backup directory
mkdir -p ./backups/postgres

# Run pg_dump with volume mount
docker run --rm \
--network=ldf-network \
--volume=postgres_data:/var/lib/postgresql/data \
--volume=$(pwd)/backups/postgres:/backups \
postgres:16 \
pg_dump -U <your_username> -h postgres -d <your_database> -f /backups/opengin.sql

# Create compressed archive
cd ./backups/postgres
tar -czf opengin.tar.gz opengin.sql
rm -rf opengin.sql

2.2 Restore with Volume Mount

# Extract backup file
tar -xzf opengin.tar.gz

# Run psql with volume mount
docker run --rm \
--network=ldf-network \
--volume=postgres_data:/var/lib/postgresql/data \
--volume=$(pwd)/backups/postgres:/backups \
postgres:16 \
psql -U <your_username> -h postgres -d <your_database> -f /backups/opengin.sql

# Clean up
rm -rf opengin.sql

Configuration

Environment Variables

The backup process uses the following environment variables from configs/backup.env:

# PostgreSQL Backup Configuration
POSTGRES_BACKUP_DIR=/path/to/backup/directory
POSTGRES_USER=postgres
POSTGRES_PASSWORD=postgres
POSTGRES_DATABASE=opengin

Docker Compose Volumes

The PostgreSQL service uses the following volumes:

volumes:
- postgres_data:/var/lib/postgresql/data # Database data
- postgres_backup:/var/lib/postgresql/backup # Backup storage

Backup Strategies

1. Full Database Backup

# Backup entire database
docker exec postgres pg_dump -U <your_username> -h localhost -d <your_database> -f /var/lib/postgresql/backup/opengin.sql

2. Specific Schema Backup

# Backup specific schema
docker exec postgres pg_dump -U <your_username> -h localhost -d <your_database> -n <schema_name> -f /var/lib/postgresql/backup/schema_backup.sql

3. Compressed Backup

# Create compressed backup
docker exec postgres pg_dump -U <your_username> -h localhost -d <your_database> -Z 9 -f /var/lib/postgresql/backup/opengin.sql.gz

4. Custom Format Backup

# Create custom format backup (binary format)
docker exec postgres pg_dump -U <your_username> -h localhost -d <your_database> -Fc -f /var/lib/postgresql/backup/opengin.dump

Restore Strategies

1. Full Database Restore

# Restore entire database
docker exec postgres psql -U <your_username> -d <your_database> -f /var/lib/postgresql/backup/opengin.sql

2. Custom Format Restore

# Restore from custom format backup
docker exec postgres pg_restore -U <your_username> -h localhost -d <your_database> /var/lib/postgresql/backup/opengin.dump

3. Schema-only Restore

# Restore schema only (no data)
docker exec postgres psql -U <your_username> -d <your_database> -f /var/lib/postgresql/backup/schema_backup.sql

Troubleshooting

Common Issues

1. Connection Refused

# Check if PostgreSQL container is running
docker ps | grep postgres

# Check container logs
docker logs postgres

# Test connection
docker exec postgres pg_isready -U postgres

2. Permission Denied

# Check file permissions in container
docker exec postgres ls -la /var/lib/postgresql/backup/

# Fix permissions if needed
docker exec postgres chown postgres:postgres /var/lib/postgresql/backup/

3. Database Not Found

# List available databases
docker exec postgres psql -U postgres -c "\l"

# Create database if needed
docker exec postgres createdb -U postgres <database_name>

4. Backup File Not Found

# Check if backup directory exists
docker exec postgres ls -la /var/lib/postgresql/

# Create backup directory
docker exec postgres mkdir -p /var/lib/postgresql/backup

Advanced Troubleshooting

1. Check PostgreSQL Version

docker exec postgres psql -U postgres -c "SELECT version();"

2. Check Database Size

docker exec postgres psql -U postgres -c "SELECT pg_size_pretty(pg_database_size('<database_name>'));"

3. Check Active Connections

docker exec postgres psql -U postgres -c "SELECT * FROM pg_stat_activity;"

Restoring in Neon

psql "<connection-string-from-neon>" -f <path-to-backup-folder>/opengin.sql

Best Practices

1. Regular Backups

  • Schedule automated backups using cron jobs
  • Keep multiple backup versions
  • Test restore procedures regularly

2. Backup Storage

  • Store backups in multiple locations
  • Use compression to save space
  • Encrypt sensitive backup data

3. Monitoring

  • Monitor backup success/failure
  • Set up alerts for backup failures
  • Log backup activities

4. Security

  • Use strong passwords
  • Limit backup file permissions
  • Secure backup storage locations