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:
- pgAdmin'de File → Preferences menüsünü açın.
- Paths → Binary paths bölümüne gidin.
- PostgreSQL Binary Path tablosunda sunucunuzun sürümüne ait satıra PostgreSQL'in
binklasörünü yazın, örneğinC:\Program Files\PostgreSQL\16\bin. - 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:
postgresql.confiçindearchive_mode = onve WAL dosyalarını bir klasöre kopyalayan birarchive_commandtanımlayın.pg_basebackupile sunucunun fiziksel tam yedeğini alın.- Geri yüklerken temel yedeği açın,
recovery_target_timeile 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.
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.