PostgreSQL yedek alma: pg_dump, geri yükleme ve otomatik yedek

Bu rehberde PostgreSQL'de yedeğin pg_dump ile nasıl alındığını, pg_restore ile nasıl geri yüklendiğini ve Windows'ta nasıl otomatikleştirildiğini anlatıyoruz. pgAdmin'de sık karşılaşılan "Utility file not found" hatasının çözümünü ve belirli bir dakikaya dönmenin yolunu da ekledik.

pg_dump ile yedek alma

pg_dump, tek bir veritabanının o anki hâlini dosyaya yazar. Özel biçim (-Fc) hem sıkıştırılmıştır hem de geri yüklerken tablo seçmeye izin verir:

Komut satırı

pg_dump -h localhost -U postgres -Fc -f "D:\Yedek\muhasebe.dump" muhasebe

pg_dump kullanıcıları ve rolleri yedeklemez. Onlar için ayrıca şu komutu çalıştırın:

Komut satırı

pg_dumpall -h localhost -U postgres --globals-only -f "D:\Yedek\roller.sql"

pg_restore ile geri yükleme

Yedeği önce yeni ve boş bir veritabanına geri yüklemek en güvenli yoldur:

Komut satırı

createdb -h localhost -U postgres muhasebe_test
pg_restore -h localhost -U postgres -d muhasebe_test "D:\Yedek\muhasebe.dump"

Var olan bir veritabanının üzerine yüklemek için --clean --if-exists seçenekleri nesneleri silip yeniden oluşturur. Bunu yalnızca ne yaptığınızdan eminseniz kullanın.

pgAdmin: "Utility file not found" hatası

pgAdmin'de yedek ya da geri yükleme başlatınca "Utility file not found. Please correct the Binary Path in the Preferences dialog" hatası alıyorsanız, pgAdmin pg_dump ve pg_restore programlarının yerini bilmiyor demektir. Çözüm:

  1. pgAdmin'de File → Preferences menüsünü açın.
  2. Paths → Binary paths bölümüne gidin.
  3. PostgreSQL Binary Path tablosunda sunucunuzun sürümüne ait satıra PostgreSQL'in bin klasörünü yazın, örneğin C:\Program Files\PostgreSQL\16\bin.
  4. Satırı varsayılan olarak işaretleyip Save ile kaydedin.

pg_dump sürümü, yedeklenen sunucunun sürümüyle aynı ya da ondan yeni olmalıdır. Eski bir pg_dump yeni sunucuya bağlanmayı reddeder.

Otomatik yedek

Komutun parola sormadan çalışması için parolayı pgpass.conf dosyasına yazın. Windows'ta dosyanın yeri %APPDATA%\postgresql\pgpass.conf'tur:

pgpass.conf

localhost:5432:*:postgres:PAROLANIZ

Ardından bir toplu iş dosyası hazırlayıp Windows Görev Zamanlayıcı ile her gece çalıştırın:

yedekle.bat

@echo off
set TARIH=%date:~-4%%date:~3,2%%date:~0,2%
"C:\Program Files\PostgreSQL\16\bin\pg_dump.exe" -h localhost -U postgres -Fc -f "D:\Yedek\muhasebe_%TARIH%.dump" muhasebe
forfiles /p "D:\Yedek" /m *.dump /d -14 /c "cmd /c del @path"

Linux'ta aynı işi cron yapar:

crontab

0 2 * * * pg_dump -h localhost -U postgres -Fc -f /yedek/muhasebe_$(date +\%Y\%m\%d).dump muhasebe

Belirli bir dakikaya dönmek

pg_dump yedeği alındığı anın fotoğrafıdır; öğleden sonra yaşanan bir sorunda yalnızca gece alınan yedeğe dönebilirsiniz. Belirli bir dakikaya dönmek için PostgreSQL'in WAL (işlem kaydı) dosyalarının arşivlenmesi gerekir:

  1. postgresql.conf içinde archive_mode = on ve WAL dosyalarını bir klasöre kopyalayan bir archive_command tanımlayın.
  2. pg_basebackup ile sunucunun fiziksel tam yedeğini alın.
  3. Geri yüklerken temel yedeği açın, recovery_target_time ile hedef anı yazın ve arşivdeki WAL dosyalarını uygulatın.

Bu yapı güçlüdür ama kurulumu ve özellikle geri yüklemesi dikkat ister: arşivde tek bir WAL dosyası eksikse o noktadan sonrasına dönülemez.

Yedek+ ile PostgreSQL yedeği

Yedek+ PostgreSQL'de fiziksel yedeği ve WAL arşivini kendisi yönetir. Geri yüklerken dönmek istediğiniz anı seçersiniz; gereken temel yedeği ve WAL dosyalarını Yedek+ bulur. Yedekler düzenli olarak geri yüklenip test edilir.

Yedek+ veritabanı türü seçimi: SQL Server, MySQL/MariaDB, PostgreSQL (fiziksel yedek ve WAL ile zamana dönüş), MongoDB, SQLite, dosya/klasör
Desteklenen veritabanları: PostgreSQL için fiziksel yedek ve WAL arşivi.
Yedek+ geri yükleme ekranı: seçilen ana dönmek için gereken yedek zinciri
Geri yükleme ekranı (örnekte bir SQL Server veritabanı; PostgreSQL için de aynı ekran kullanılır).

Sık sorulan sorular

PostgreSQL yedeği nasıl alınır?

En yaygın yol pg_dump komutudur: pg_dump -U postgres -Fc -f yedek.dump veritabani_adi. Kullanıcıları ve rolleri de yedeklemek için ayrıca pg_dumpall --globals-only çalıştırılır.

pgAdmin "Utility file not found" hatası nasıl çözülür?

pgAdmin'de File → Preferences → Paths → Binary paths bölümüne PostgreSQL'in bin klasörünün yolunu (örneğin C:\Program Files\PostgreSQL\16\bin) yazıp kaydedin.

pg_dump ile belirli bir dakikaya dönülebilir mi?

Hayır. pg_dump yalnızca alındığı anı yedekler. Belirli bir dakikaya dönmek için fiziksel yedek (pg_basebackup) ve WAL arşivi gerekir.