Ana içeriğe geç

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ı:

  1. Sunucu Bilgileri:
    • Host: {veritabani_ip_adresi}
    • Kullanıcı: {veritabani_user}
  2. Veritabanı Listeleme:
    • Betik, sunucuya bağlanır.
    • Yedekleme dışı bırakılması gereken temel sistem veritabanları haricindeki tüm veritabanlarını otomatik olarak sorgular.
  3. Yedekleme Yolu:
    • Ağ üzerindeki {veritabani_yedek_klasoru_path} klasörünü kullanır.
  4. Yedekleme İşlemi:
    • Bu klasörün içinde Linux_YYYYAAgg_SSddss formatında yeni bir klasör oluşturur.
    • Bulunan her bir veritabanı için pg_dump komutunu çalıştırır.
    • Her veritabanını, oluşturulan bu zaman damgalı klasörün içine veritabani_adi.sql olarak kaydeder.

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.

  1. DBeaver'da {veritabani_ip_adresi} sunucusuna bağlanın.
  2. Sol paneldeki "Databases" (Veritabanları) üzerine sağ tıklayın.
  3. "Create New Database" (Yeni Veritabanı) seçeneğini seçin.
  4. 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)

  1. Oluşturduğunuz bu yeni ve boş veritabanına (örn: testdb_restore) sağ tıklayın.
  2. 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).
  3. Bir sihirbaz penceresi açılacaktır.
  4. "Script file(s)" (Betik dosyaları) bölümünde, "Select File(s)" (Dosya Seç) düğmesini kullanarak bilgisayarınızdaki .sql yedek dosyasını (örn: C:\Yedekler\testdb.sql) seçin.
  5. Herhangi bir ayarı değiştirmenize gerek yoktur.
  6. "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 .sql dosyaları hazır olmalıdır.
  • .sql dosyasının adı, oluşturulacak veritabanının adıyla aynı olmalıdır (örn: musteridb.sql dosyası musteridb adında bir veritabanı oluşturacaktır).

Adımlar:

  1. Yedekleri Hazırlayın:
    • Geri yüklemek istediğiniz tüm .sql dosyalarını (örneğin akşam yedeğinden çıkardığınız dosyaları) C:\SERENDERYEDEK klasörünün içine kopyalayın.
    • Not: Betik bu klasörü kullanmak üzere ayarlanmıştır. Yolu değiştirmek isterseniz .bat dosyasını düzenlemeniz gerekir.
  2. Betiği Çalıştırın:
    • RestoreAllDatabases.bat dosyasına çift tıklayarak çalıştırın.

Betik Ne Yapar? (Teknik İşleyiş)

  1. C:\SERENDERYEDEK klasöründeki her bir .sql dosyası için bir döngü başlatır.
  2. Dosya adından veritabanı adını çıkarır (örn: testdb.sql -> testdb).
  3. psql komutunu kullanarak sunucuda bu isimle yeni bir veritabanı oluşturmaya çalışır (CREATE DATABASE "testdb").
  4. Veritabanı zaten varsa, CREATE DATABASE komutu bir hata verir ancak betik 2>nul ile bu hata mesajını gizler ve geri yükleme işlemine devam eder.
  5. Son olarak, psql komutunu kullanarak ilgili .sql dosyası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