PostgreSQL Otomatik Yedekleme İşlemleri
Bu doküman, veritabaniYedek.ps1 PowerShell betiğini kullanarak PostgreSQL veritabanlarının nasıl otomatik olarak yedeklendiğini açıklar.
Sisteme Genel Bakış
Sistem, ana yedekleme işleminden oluşur: Bu işlemler, .bat dosyaları aracılığıyla tetiklenen PowerShell (.ps1) betikleri tarafından yürütülür.
Önemli Not: veritabaniYedek.bat dosyası, Windows Görev Zamanlayıcı (Task Scheduler) kullanılarak otomatik olarak çalıştırılmak üzere ayarlanmıştır. Bu .bat dosyaları, ilgili PowerShell betiklerini ExecutionPolicy Bypass parametresiyle çalıştırır.
1. Öğlen Yedeği (veritabaniYedek.ps1)
Bu betik, yedeklemeyi bir ağ sürücüsüne (File Server) alır.
Tetikleyici: veritabaniYedek.bat
İşlem Adımları:
- Sunucu Bilgileri:
- Host:
{veritabani_ip_adresi} - Kullanıcı:
{veritabani_user}
- Host:
- Veritabanı Listeleme:
- Betik, sunucuya bağlanır.
- Yedekleme dışı bırakılması gereken temel sistem veritabanları haricindeki tüm veritabanlarını otomatik olarak sorgular.
- Yedekleme Yolu:
- Ağ üzerindeki
{veritabani_yedek_klasoru_path}klasörünü kullanır.
- Ağ üzerindeki
- Yedekleme İşlemi:
- Bu klasörün içinde
Linux_YYYYAAgg_SSddssformatında yeni bir klasör oluşturur. - Bulunan her bir veritabanı için
pg_dumpkomutunu çalıştırır. - Her veritabanını, oluşturulan bu zaman damgalı klasörün içine
veritabani_adi.sqlolarak kaydeder.
- Bu klasörün içinde
PostgreSQL Yedeklerini Geri Yükleme
Bu doküman, .sql formatındaki PostgreSQL yedeklerinin sunucuya nasıl geri yükleneceğini açıklar. İki yöntem sunulmuştur: DBeaver kullanarak manuel yükleme veya RestoreAllDatabases.bat ile otomatik geri yükleme.
Yöntem 1: DBeaver ile Manuel Geri Yükleme
pg_dump ile oluşturulmuş .sql (düz metin) dosyalarını DBeaver'a yüklemenin en güvenilir yolu "Betik Çalıştırma" (Execute Script) aracıdır.
Adım 1: Boş Veritabanı Oluşturma
Yedeği yüklemeden önce, verilerin içe aktarılacağı boş bir veritabanına ihtiyacınız vardır.
- DBeaver'da
{veritabani_ip_adresi}sunucusuna bağlanın. - Sol paneldeki "Databases" (Veritabanları) üzerine sağ tıklayın.
- "Create New Database" (Yeni Veritabanı) seçeneğini seçin.
- Yedeği yükleyeceğiniz veritabanının adını (örn:
testdb_restore) girin ve "OK" tıklayın.
Adım 2: SQL Betiğini Çalıştırma (Execute Script)
- Oluşturduğunuz bu yeni ve boş veritabanına (örn:
testdb_restore) sağ tıklayın. - Açılan menüden "Tools" (Araçlar) -> "Execute Script" (Betik Çalıştır) seçeneğini seçin. (Bazı sürümlerde "Run Script" olarak da geçebilir).
- Bir sihirbaz penceresi açılacaktır.
- "Script file(s)" (Betik dosyaları) bölümünde, "Select File(s)" (Dosya Seç) düğmesini kullanarak bilgisayarınızdaki
.sqlyedek dosyasını (örn:C:\Yedekler\testdb.sql) seçin. - Herhangi bir ayarı değiştirmenize gerek yoktur.
- "Start" (Başlat) düğmesine tıklayın.
DBeaver, .sql dosyasındaki tüm komutları sırayla çalıştırarak tabloları oluşturacak ve verileri yeni veritabanınıza yükleyecektir.
Yöntem 2: Otomatik Geri Yükleme (RestoreAllDatabases.bat)
RestoreAllDatabases.bat betiği, belirli bir klasördeki tüm .sql dosyalarını {veritabani_ip_adresi} sunucusuna geri yüklemek için tasarlanmıştır.
Ön Koşullar:
- Geri yüklenecek
.sqldosyaları hazır olmalıdır. .sqldosyasının adı, oluşturulacak veritabanının adıyla aynı olmalıdır (örn:musteridb.sqldosyasımusteridbadında bir veritabanı oluşturacaktır).
Adımlar:
- Yedekleri Hazırlayın:
- Geri yüklemek istediğiniz tüm
.sqldosyalarını (örneğin akşam yedeğinden çıkardığınız dosyaları)C:\SERENDERYEDEKklasörünün içine kopyalayın. - Not: Betik bu klasörü kullanmak üzere ayarlanmıştır. Yolu değiştirmek isterseniz
.batdosyasını düzenlemeniz gerekir.
- Geri yüklemek istediğiniz tüm
- Betiği Çalıştırın:
RestoreAllDatabases.batdosyasına çift tıklayarak çalıştırın.
Betik Ne Yapar? (Teknik İşleyiş)
C:\SERENDERYEDEKklasöründeki her bir.sqldosyası için bir döngü başlatır.- Dosya adından veritabanı adını çıkarır (örn:
testdb.sql->testdb). psqlkomutunu kullanarak sunucuda bu isimle yeni bir veritabanı oluşturmaya çalışır (CREATE DATABASE "testdb").- Veritabanı zaten varsa,
CREATE DATABASEkomutu bir hata verir ancak betik2>nulile bu hata mesajını gizler ve geri yükleme işlemine devam eder. - Son olarak,
psqlkomutunu kullanarak ilgili.sqldosyasını o veritabanının içine yükler.
Örnek PowerShell Betiği
[Console]::OutputEncoding = [System.Text.Encoding]::UTF8
$pgHost = "{veritabani_ip_adresi}"
$pgPort = "5432"
$pgUser = "{veritabani_user}"
$pgPassword = 'your_password'
$env:PGPASSWORD = $pgPassword
$date = Get-Date -Format "yyyyMMdd_HHmmss"
$backupParentPath = "{veritabani_yedek_klasoru_path}"
$backupFolderPath = Join-Path $backupParentPath "Linux_$date"
$folderPathToDelete = "C:\Yedek\SunucuYedek"
# Veritabanı isimleri - PostgreSQL sunucusundan otomatik olarak alınıyor
Write-Host "Veritabanı listesi PostgreSQL sunucusundan alınıyor..."
$psqlCommand = "psql -h $pgHost -p $pgPort -U $pgUser -d postgres -t -A -c `"SELECT datname FROM pg_database WHERE NOT datistemplate AND datname NOT IN ('postgres','sonarqube', 'wikidb') AND datname NOT LIKE 'template%';`""
$databases = Invoke-Expression $psqlCommand | Where-Object { $_ -ne '' }
Write-Host "Toplam $($databases.Count) veritabanı bulundu."
# Klasör oluşturma
New-Item -ItemType Directory -Force -Path $backupFolderPath
# Her bir veritabanı için yedek alma işlemi
foreach ($dbname in $databases) {
$outputFile = Join-Path $backupFolderPath "$dbname.sql"
$dumpCommand = "pg_dump -h $pgHost -p $pgPort -U $pgUser -d $dbname -E UTF8 --encoding=UTF8 --no-privileges --no-owner | Out-File -Encoding UTF8 -FilePath `"$outputFile`""
Write-Host "Yedek alınıyor: $outputFile"
Invoke-Expression $dumpCommand
Write-Host "Yedek alma işlemi tamamlandı: $outputFile"
}
Write-Host "Tüm yedekler alındı ve '$backupFolderPath' klasörüne kaydedildi."
if (Test-Path $folderPathToDelete) {
Remove-Item -Path $folderPathToDelete\* -Recurse -Force
Write-Host "Klasör içeriği başarıyla silindi: $folderPathToDelete"
} else {
Write-Host "Silinecek klasör bulunamadı: $folderPathToDelete"
}
# Klasördeki yedek dosyalarını alma
$backupFiles = Get-ChildItem -Path $backupParentPath -File | Where-Object { $_.Extension -eq ".sql" }
$backupFilesSorted = $backupFiles | Sort-Object LastWriteTime -Descending
$newestFiles = $backupFilesSorted | Select-Object -First 10
foreach ($file in $backupFilesSorted) {
if (-not ($newestFiles -contains $file)) {
Remove-Item -Path $file.FullName -Force
Write-Host "Eski yedek dosyası silindi: $($file.FullName)"
}
}
$rarFileName = "$backupParentPath\Linux_$date.rar"
Compress-Archive -Path $backupFolderPath -DestinationPath $rarFileName
Write-Host "Yedek klasörü sıkıştırıldı: $rarFileName"
Örnek BAT Dosyası
@echo off
:: Script adı
set "scriptName=veritabaniYedek.ps1"
:: Mevcut bat dosyasının bulunduğu dizini al
set "batDir=%~dp0"
:: Script dosya yolunu oluştur
set "scriptPath=%batDir%%scriptName%"
:: Dosya var mı kontrol et ve bulunan dosyayı PowerShell ile çalıştır
if exist "%scriptPath%" (
echo Script bulundu: %scriptPath%
echo Script calistiriliyor...
PowerShell.exe -NoProfile -ExecutionPolicy Bypass -File "%scriptPath%"
) else (
echo Script bulunamadi: %scriptName%
)
:: Bekleme işlemi
pause