This guide covers logical (pg_dump/pg_restore) and physical (pg_basebackup) backup methods, along with Point-in-Time Recovery (PITR) for Debian-based PostgreSQL systems.
Logical backups export database objects (tables, schemas, data) as SQL or custom-format files, suitable for granular recovery (e.g., individual tables).
Install PostgreSQL Client Tools (if not installed):
sudo apt update && sudo apt install postgresql-client
Run pg_dump Command:
Use sudo -u postgres to execute as the PostgreSQL superuser. Key options:
-U: Database user (default: postgres).-d: Target database name.-F: Output format (t=custom binary, c=plain SQL, p=plain text).-f: Output file path.Examples:
sudo -u postgres pg_dump -U postgres -F t -f /var/backups/mydb_backup.tar mydb
gzip /var/backups/mydb_backup.tar # Optional compression
psql):sudo -u postgres pg_dump -U postgres -f /var/backups/mydb.sql mydb
sudo systemctl stop postgresql
sudo -u postgres pg_restore -U postgres -d mydb /var/backups/mydb_backup.tar
sudo -u postgres psql -U postgres -d mydb -f /var/backups/mydb.sql
sudo systemctl start postgresql
Physical backups copy the entire PostgreSQL data directory (including WAL files), ideal for large databases or full-cluster recovery.
sudo mkdir -p /mnt/pg_backup
sudo chown postgres:postgres /mnt/pg_backup
sudo -u postgres pg_basebackup -D /mnt/pg_backup -F t -z -P -h localhost -p 5432 -U postgres
-D: Backup destination.-F t: Tar format (compresses data).-z: Compress output.-P: Show progress.PITR recovers the database to a specific timestamp or transaction ID using WAL (Write-Ahead Logging) archiving.
Enable WAL Archiving:
Edit postgresql.conf (typically at /etc/postgresql/<version>/main/postgresql.conf):
wal_level = replica
archive_mode = on
archive_command = 'cp %p /mnt/pg_arch/%f'
max_wal_senders = 2
wal_keep_segments = 32
Restart PostgreSQL:
sudo systemctl restart postgresql
Perform Full Backup:
Use pg_basebackup (see above) to create a base backup before enabling PITR.
Stop PostgreSQL:
sudo systemctl stop postgresql
Clear Existing Data Directory:
sudo rm -rf /var/lib/postgresql/<version>/main/*
Restore Base Backup:
sudo cp -r /mnt/pg_backup/* /var/lib/postgresql/<version>/main/
Configure PITR Parameters:
Create/modify postgresql.auto.conf in the data directory:
restore_command = 'cp /mnt/pg_arch/%f %p'
recovery_target_time = '2025-11-07 10:00:00' # Target timestamp
recovery_target_timeline = 'latest'
Start PostgreSQL in Recovery Mode:
sudo systemctl start postgresql
PostgreSQL will apply WAL logs until reaching recovery_target_time, then exit recovery mode automatically.
Verify Recovery:
sudo -u postgres psql -c "\l" # List databases
sudo -u postgres psql -d mydb -c "\dt" # List tables
cron (e.g., daily at 2 AM):0 2 * * * sudo -u postgres pg_dump -U postgres -F t -f /var/backups/$(date +\%F)_mydb.tar mydb
pg_basebackup for physical backups (faster for large datasets).For detailed options, refer to the PostgreSQL documentation.