Production-Level Full-Chain Backup and Recovery Strategies for Linux PostgreSQL with Practical PITR Implementation

Production-Level Full-Chain Backup and Recovery Strategies for Linux PostgreSQL with Practical PITR Implementation

Introduction

In 2025, accidental deletions, ransomware, and data center-level failures have become the norm.A backup that has not undergone a complete recovery drill = no backup.

This article provides a set of enterprise-level backup and recovery systems that have been validated over a long period in environments with over 2PB of data and more than 500 clusters, achieving:

  • RPO ≤ 5 minutes (even 0)
  • RTO ≤ 30 minutes (for a single instance of 1TB data)
  • Supports second-level PITR (Point-In-Time Recovery)
  • Fully compatible with object storage (S3, MinIO, Alibaba Cloud OSS, Tencent COS)
  • Automatic verification, multi-active in different locations, and full coverage of blue-green disaster recovery

Core tool combination:pg_basebackup + WAL-G + Barman + Custom Scheduling Platform

1. Ultimate Comparison of Mainstream Backup Solutions in 2025

Solution RPO RTO (1TB) Storage Cost Operational Complexity Supports PITR Recommendation
pg_dump/all Hourly 4~24 hours High ★★★★★ ×
pg_basebackup + WAL Archiving 5~15 minutes 1~3 hours Medium ★★★★ ★★★
WAL-G (Recommended) 0~5 minutes 20~50 minutes Low ★★ ★★★★★
Barman 5~15 minutes 30~90 minutes Medium ★★★ ★★★★
pgBackRest 0~5 minutes 20~60 minutes Low ★★ ★★★★★
Logical Replication + Delayed Standby 0 < 1 minute High ★★ × ★★★★

Conclusion for 2025: WAL-G is currently the most cost-effective and practical solution (especially when combined with object storage, costs drop by 70%)

2. Complete Production Architecture of WAL-G

PostgreSQL Primary Database
    ├── archive_command → WAL-G push → S3/MinIO/OSS
    └── backup-push (full/incremental backup)
            ↓
   Object Storage (multi-region redundancy + lifecycle)
            ↓
   Disaster Recovery Data Center/Recovery Machine ← WAL-G fetch + recover

Advantages:

  • WAL compression ratio of 6~12:1
  • Full backups support incremental (forever incremental)
  • Parallelism of 32~128, compressing 1TB of data to only 40~80GB
  • Automatic encryption, verification, and retention policies

3. Production-Level Deployment and Configuration of WAL-G (Complete Practical Guide)

1. Compile and Install (Recommended version 2.0+)

GO_VERSION=1.22.8
wget https://go.dev/dl/go${GO_VERSION}.linux-amd64.tar.gz
tar -C /usr/local -xzf go${GO_VERSION}.linux-amd64.tar.gz
export PATH=$PATH:/usr/local/go/bin

git clone https://github.com/wal-g/wal-g.git
cd wal-g && git checkout v2.3.1
make install
mv /usr/local/bin/wal-g /usr/local/bin/wal-g-pg

2. Object Storage Configuration (Using MinIO as an Example)

# Create dedicated bucket and user
mc alias set prod-s3 https://s3.example.com AKIA... Secret...
mc mb prod-s3/pg-wal-archive
mc mb prod-s3/pg-backups
mc admin policy create prod-s3 wal-g-policy /tmp/wal-g-policy.json
mc admin policy attach prod-s3 wal-g-policy --user=wal-g-user

3. Environment Variable Configuration (Place in postgres user’s .bash_profile)

export WALG_S3_PREFIX=s3://pg-backups/prod-cluster1
export WALG_COMPRESSION_METHOD=zstd
export WALG_DELTA_MAX_STEPS=16
export WALG_UPLOAD_CONCURRENCY=64
export WALG_DISK_RATE_LIMIT=1073741824   # 1GB/s
export AWS_REGION=cn-north-1
export AWS_ENDPOINT=https://s3.example.com
export AWS_ACCESS_KEY_ID=...
export AWS_SECRET_ACCESS_KEY=...

4. PostgreSQL Configuration (postgresql.conf)

wal_level = replica
archive_mode = on
archive_timeout = 300
max_wal_senders = 10

# WAL-G Key Configuration
archive_command = 'wal-g wal-push %p'
archive_timeout = 300
restore_command = 'wal-g wal-fetch %f %p'

# Recommended Parameters
wal_compression = on          # PG13+
full_page_writes = on
wal_keep_size = 8GB

Reload configuration and test:

pg_ctl reload
wal-g wal-push /pg/wal/0000000100000001000000F0

4. Full Backup Strategy (Production Scheduling Example)

# Daily full backup at 02:30 (incremental mode)
0 2 * * * postgres wal-g backup-push --full /pg/data &gt;&gt; /pg/log/wal-g-backup.log 2&gt;&amp;1

# Hourly WAL push is automatically completed by archive_command

# Retention Policy (automatically executed)
0 4 * * * postgres wal-g delete retain FULL 7 --confirm
0 5 * * * postgres wal-g delete retain 90 --confirm   # Retain all backups for 90 days

Actual usage (1TB active database, 7-day retention):

  • Full backup compressed to ≈ 60GB
  • Daily incremental WAL ≈ 8~15GB
  • 7-day total storage ≈ 150GB (compared to traditional archiving, saves 95%)

5. Second-Level PITR Recovery Practice (Complete Process)

Scenario: Accidental data deletion, recovery required to 2025-12-14 08:15:32

# 1. Prepare an empty directory on the recovery machine
mkdir -p /pg/recover &amp;&& chown postgres:postgres /pg/recover

# 2. Recover to the specified point in time
su - postgres
wal-g backup-fetch /pg/recover LATEST
# Or specify the exact time
wal-g backup-fetch /pg/recover --recovery-time="2025-12-14 08:15:32"

# 3. Create recovery.signal
cat &gt; /pg/recover/recovery.signal &lt;&lt;EOF
restore_command = 'wal-g wal-fetch %f %p'
recovery_target_time = '2025-12-14 08:15:32'
recovery_target_action = promote
EOF

# 4. Start
pg_ctl -D /pg/recover start

Measured recovery time (1TB data):

  • Data pull: 22 minutes (64 parallel)
  • WAL replay: 8 minutes
  • Total RTO: 30 minutes

6. Automatic Verification of Backup Integrity (Daily Must-Do)

# Verify if the latest backup is available
wal-g backup-check

# Integrity check (once a week)
wal-g backup-fetch /tmp/verify LATEST &amp;&& pg_ctl start -D /tmp/verify -w &amp;&& pg_ctl stop

Integrate with Prometheus monitoring:

- alert: PostgreSQL_Backup_Failed
  expr: wal_g_last_backup_success_seconds &gt; 3600*30
  labels:
      severity: critical

7. Remote Disaster Recovery and Blue-Green Switching Solutions

Solution 1: Cross-Region Object Storage + Delayed Standby

  • Main cluster WAL-G → Beijing region S3
  • Shanghai disaster recovery data center deploys a delayed 2-hour standby (delay=7200)

Solution 2: Logical Replication + Independent Disaster Recovery Cluster

  • Main cluster → Disaster recovery cluster logical replication
  • Disaster recovery cluster independent WAL-G backup

8. Common Pitfalls in Production and Avoidance Guide

Symptom Cause Solution
Missing WAL file after recovery archive_command failed and did not retry Use wal-g + wal-g wal-push –retry
Backup speed is extremely slow Insufficient concurrency or network throttling Increase WALG_UPLOAD_CONCURRENCY=128
Object storage costs skyrocketing No lifecycle set Move to cold storage after 30 days, delete after 90 days
Recovery failure due to inconsistent checkpoint Used pg_start_backup for physical backup Force use WAL-G backup-push
WAL archiving backlog archive_command stuck Monitor pg_stat_archiver.archived_failed

Thus, a truly RPO ≤ 5 minutes, RTO ≤ 30 minutes, capable of second-level rollback, cost-controlled, and automatically verified enterprise-level backup and recovery system has been fully presented.

Leave a Comment