Yedekleme ve Geri Yükleme

pg_dump, pg_restore ve Point-in-Time Recovery

pg_dump ile Yedekleme

Temel Formatlar

FormatParametreÖzellikler
Plain SQL-FpOkunabilir, büyük boyut
Custom-FcSıkıştırılmış, önerilen
Directory-FdParalel yedekleme
Tar-FtTar arşivi

Yedekleme Örnekleri

# SQL formatında
pg_dump -U postgres myapp > myapp_backup.sql

# Custom format (önerilen)
pg_dump -U postgres -Fc myapp > myapp_backup.dump

# Sıkıştırılmış SQL
pg_dump -U postgres myapp | gzip > myapp_backup.sql.gz

# Sadece schema (yapı)
pg_dump -U postgres --schema-only myapp > schema.sql

# Sadece data
pg_dump -U postgres --data-only myapp > data.sql

# Belirli tablolar
pg_dump -U postgres -t users -t orders myapp > tables.sql

# Tablo hariç
pg_dump -U postgres --exclude-table=logs myapp > myapp.sql

Tüm Veritabanlarını Yedekle

pg_dumpall -U postgres > all_databases.sql

Geri Yükleme

SQL Dosyasından

# Mevcut veritabanına
psql -U postgres -d myapp < myapp_backup.sql

# Yeni veritabanına
createdb -U postgres myapp_new
psql -U postgres -d myapp_new < myapp_backup.sql

Custom Format'tan

# Tam geri yükleme
pg_restore -U postgres -d myapp myapp_backup.dump

# Yeni veritabanı oluşturarak
pg_restore -U postgres -C -d postgres myapp_backup.dump

# Sadece belirli tablo
pg_restore -U postgres -t users -d myapp myapp_backup.dump

# Paralel geri yükleme (hızlı)
pg_restore -U postgres -j 4 -d myapp myapp_backup.dump

Otomatik Yedekleme Script'i

#!/bin/bash
# /opt/scripts/pg_backup.sh

BACKUP_DIR="/var/backups/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7

# Tüm veritabanlarını yedekle
for DB in $(psql -U postgres -t -c "SELECT datname FROM pg_database WHERE datistemplate = false AND datname != 'postgres'"); do
    pg_dump -U postgres -Fc $DB > "$BACKUP_DIR/${DB}_${DATE}.dump"
    echo "Yedeklendi: ${DB}_${DATE}.dump"
done

# Eski yedekleri sil
find $BACKUP_DIR -name "*.dump" -mtime +$RETENTION_DAYS -delete
echo "$(date): Yedekleme tamamlandı" >> /var/log/pg_backup.log

Crontab'a Ekle

# Her gece 02:00
0 2 * * * /opt/scripts/pg_backup.sh 2>&1 | tee -a /var/log/pg_backup.log

Point-in-Time Recovery (PITR)

PITR ile belirli bir zamana geri dönebilirsiniz. WAL arşivleme gerektirir.

WAL Arşivleme Ayarları (postgresql.conf)

wal_level = replica
archive_mode = on
archive_command = 'cp %p /var/lib/postgresql/wal_archive/%f'