Veri Geri Yükleme: Bacula Restore İşlemleri

Yedek almak her sysadmin’in rutin işi, ama asıl mesele o yedeği geri yükleyebilmek. Bacula kullanan ortamlarda en sık karşılaştığım durum şu: Sistem düzgün yedek alıyor, loglar temiz görünüyor, ama restore gerektiğinde kimse tam olarak ne yapacağını bilmiyor. Bu yazıda Bacula’nın restore mekanizmasını gerçek dünya senaryolarıyla birlikte ele alacağız.

Bacula Restore’a Giriş Yapmadan Önce

Restore işlemine geçmeden önce Bacula’nın mimarisini kısaca hatırlayalım. Bacula üç ana bileşenden oluşuyor:

  • Director: Tüm operasyonları yöneten merkezi bileşen
  • Storage Daemon: Veriyi fiziksel olarak tutan servis
  • File Daemon: Yedeklenen ya da geri yüklenen makinede çalışan ajan

Restore işlemi her zaman Director üzerinden bconsole ile başlar. Director, katalog veritabanından hangi dosyanın hangi volumede olduğunu bulur ve Storage Daemon’a okuma talimatı verir. File Daemon ise gelen veriyi hedef sistemde yazacak olan bileşendir.

Bir de şunu belirteyim: Bacula’nın restore mekanizması diğer yedekleme araçlarına kıyasla biraz daha fazla adım içeriyor. İlk bakışta karmaşık gelebilir, ama bir kez alıştığınızda son derece güçlü bir araç olduğunu göreceksiniz.

bconsole’a Bağlanmak

Tüm restore işlemleri bconsole üzerinden yürütülür. Director’ın kurulu olduğu sunucuya SSH ile bağlandıktan sonra:

bconsole

Bağlantı başarılıysa şöyle bir karşılama mesajı görürsünüz:

Connecting to Director localhost:9101
1000 OK: 103 bacula-dir Version: 9.6.7 (10 December 2020)
Enter a h for help.
*

Yıldız işareti (*) bconsole prompt’u. Buradan itibaren tüm komutları bu prompt üzerinde çalıştıracağız.

Temel restore Komutu

Bacula’da en yaygın kullanılan restore yöntemi interaktif mod. Sadece restore yazıp Enter’a basın:

*restore

Karşınıza seçenek menüsü çıkacak:

To select the JobIds, you have the following choices:
     1: List last 20 Jobs run
     2: List Jobs where a given File is saved
     3: Enter list of comma separated JobIds to restore
     4: Enter SQL list command
     5: Select the most recent backup for a client
     6: Select backup for a client before a specified time
     7: Enter a list of files to restore
     8: Enter a list of files to restore before a specified time
     9: Find the JobIds of the most recent backup for a client
    10: Find the JobIds for a backup on a specific Volume
    11: Enter a list of directories to restore for found JobIds
    12: Select full restore to a specified Job date
    13: Cancel
Select item:  (1-13):

Her seçenek farklı bir senaryoya karşılık geliyor. Şimdi bunları tek tek inceleyelim.

Senaryo 1: En Son Yedeği Geri Yüklemek

Bu en sık kullanılan senaryo. Bir sunucuda bir şeyler bozuldu, en son temiz yedeği geri almak istiyorsunuz. 5 seçeneğini kullanın:

Select item:  (1-13): 5

Defined Clients:
     1: bacula-fd
     2: webserver01-fd
     3: dbserver01-fd
Select the Client (1-3): 2

Client seçtikten sonra restore için bir job definition seçmeniz gerekiyor:

Defined FileSet resources:
     1: Full Set
     2: WebData
     3: EtcBackup
Select FileSet resource (1-3): 2

Ardından Bacula size hangi dosyaları restore edeceğinizi seçebileceğiniz interaktif bir dosya tarayıcısı açacak:

+-------+-------+----------+-------------+
| JobId | Level | JobFiles | JobBytes    |
+-------+-------+----------+-------------+
| 1842  | F     | 15,420   | 2,847,293   |
| 1901  | I     | 234      | 45,821      |
| 1956  | I     | 89       | 12,440      |
+-------+-------+----------+-------------+

Burada Bacula Full ve Incremental job’ları otomatik olarak zincirleyecek. mark * komutuyla tüm dosyaları işaretleyebilir ya da tek tek dosya seçebilirsiniz.

$ mark *
$ done

Interaktif Dosya Tarayıcısında Gezinmek

Restore modundayken kullanabileceğiniz temel komutlar:

  • ls: Mevcut dizini listele
  • cd /dizin/yolu: Dizin değiştir
  • mark dosyaadi: Tek bir dosyayı restore için işaretle
  • mark *: Tüm dosyaları işaretle
  • unmark dosyaadi: İşareti kaldır
  • pwd: Bulunduğun dizini göster
  • lsmark: Sadece işaretlenmiş dosyaları listele
  • done: Seçimi tamamla ve devam et
  • help: Kullanılabilir komutları listele

Örnek bir oturum:

cwd is: /
$ cd /var/www/html
cwd is: /var/www/html
$ ls
-rwxr-xr-x   1 www-data www-data      4096 2024-01-15 14:23:12  index.php
-rwxr-xr-x   1 www-data www-data      8192 2024-01-14 09:15:44  config.php
drwxr-xr-x   2 www-data www-data      4096 2024-01-15 14:23:12  uploads/
$ mark config.php
1 file marked.
$ mark uploads
1 directory marked.
$ lsmark
-rwxr-xr-x   1 www-data www-data      8192 2024-01-14 09:15:44  *config.php
drwxr-xr-x   2 www-data www-data      4096 2024-01-15 14:23:12  *uploads/
$ done

Senaryo 2: Belirli Bir Tarihe Göre Restore

Diyelim ki bugün Pazartesi ve Cuma günü çalışan bir konfigürasyon dosyasını geri almak istiyorsunuz. Seçenek 6‘yı kullanın:

Select item:  (1-13): 6

The restored files will the most current backup
BEFORE the date you specify below.

Enter date as YYYY-MM-DD HH:MM:SS: 2024-01-12 18:00:00

Bu seçenek belirttiğiniz tarihten önceki en son yedekteki halini getirir. Production ortamlarında çok kullanışlı, özellikle “dün öğleden önce çalışıyordu” gibi durumlarda.

Senaryo 3: Belirli Bir Dosyayı Aramak

Bir dosyanın hangi job’larda yedeklendiğini bulmak için seçenek 2:

Select item:  (1-13): 2

Enter Filename (no path): nginx.conf

Bacula katalogda bu dosya adını arayarak hangi job’larda geçtiğini listeleyecek:

+-------+----------------------------+----------+
| JobId | StartTime                  | Client   |
+-------+----------------------------+----------+
| 1823  | 2024-01-10 02:01:15        | webserver|
| 1756  | 2024-01-09 02:00:58        | webserver|
| 1701  | 2024-01-08 02:01:22        | webserver|
+-------+----------------------------+----------+

Restore Job’ını Yapılandırmak

Dosyaları seçip done dedikten sonra Bacula restore job’ının detaylarını soracak:

Bootstrap records written to /var/lib/bacula/bacula-dir.restore.1.bsr

The job will require the following
   Volume(s)                 Storage(s)                SD Device(s)
===========================================================================
   FULL-0001                 File                      FileStorage
   INC-0023                  File                      FileStorage

Volumes marked with "*" are online.

1 file selected to be restored.

The defined Restore Job resources are:
     1: RestoreFiles
Select Restore Job (1-1): 1

Ardından hedef istemciyi seçmeniz istenecek:

Defined Clients:
     1: bacula-fd
     2: webserver01-fd
     3: dbserver01-fd
Run Restore job
JobName:    RestoreFiles
Bootstrap:  /var/lib/bacula/bacula-dir.restore.1.bsr
Where:      /tmp/bacula-restores
Replace:    Always
FileSet:    Full Set
Backup Client: webserver01-fd
Restore Client: webserver01-fd
Storage:    File
When:       2024-01-15 16:30:00
Catalog:    MyCatalog
Priority:   10
Plugin Options: *None*
OK to run? (yes/mod/no):

Dikkat: Where alanı kritik. Varsayılan olarak /tmp/bacula-restores gibi bir yola koyuyor. Orijinal konuma restore etmek istiyorsanız mod seçeneğiyle değiştirmeniz gerekiyor.

Where Parametresini Düzenlemek

mod yazarak restore parametrelerini değiştirebilirsiniz:

OK to run? (yes/mod/no): mod

Parameters to modify:
     1: Level
     2: Storage
     3: Job
     4: FileSet
     5: Restore Client
     6: When
     7: Priority
     8: Bootstrap
     9: Where
    10: File Relocation
    11: Replace
    12: JobId
Select parameter to modify (1-12): 9

Please enter the full path prefix for restore (/ for none): /

/ girdiğinizde dosyalar orijinal konumlarına restore edilir. Bu seçeneği dikkatli kullanın, mevcut dosyaların üzerine yazar.

Daha güvenli yaklaşım: Önce /tmp/bacula-restores gibi bir yere restore edin, dosyaları kontrol edin, sonra manuel olarak taşıyın:

# Restore edilen dosyaları kontrol et
ls -la /tmp/bacula-restores/var/www/html/

# Orijinal konuma kopyala
cp -p /tmp/bacula-restores/var/www/html/config.php /var/www/html/config.php

# Sahiplik ve izinleri kontrol et
stat /var/www/html/config.php

Restore Job’ını İzlemek

Job başladıktan sonra ilerlemeyi messages komutuyla takip edebilirsiniz:

*messages

Ya da başka bir terminalde:

watch -n 5 'echo "status dir" | bconsole'

Daha detaylı job durumu için:

*status dir

Bu komut çalışan tüm job’ları, bekleyen job’ları ve son tamamlanan job’ları gösterir.

Komut Satırından Otomatik Restore

Scriptleme ya da acil durumlarda interaktif moda girmeden komut satırından restore yapabilirsiniz. Bootstrap dosyası ile:

bacula-fd -b /var/lib/bacula/bacula-dir.restore.1.bsr 
          -d 10 
          -v

Ya da bconsole’a komut pipe’lamak:

echo "restore client=webserver01-fd where=/tmp/restore select all done yes" | bconsole

Bu yöntemi özellikle şu durumlarda kullanıyorum:

  • Gece yarısı acil restore scripti çalıştırmak gerektiğinde
  • Aynı restore’u birden fazla client için tekrarlamak gerektiğinde
  • Monitoring sisteminden otomatik restore tetiklemek gerektiğinde

Senaryo 4: Silinen Dosyaları Geri Yüklemek

Bu en klasik restore senaryosu. Birisi rm -rf çalıştırdı ve önemli bir dizin gitti. Böyle bir durumda önce hangi job’un silme öncesi son yedek olduğunu bulun:

*list jobs client=webserver01-fd

Çıktıda job ID’lerini gördükten sonra:

*restore
Select item:  (1-13): 3

Enter JobId(s), comma separated, to restore: 1842,1901

Burada Full job ve sonraki Incremental job’ları virgülle ayırarak girebilirsiniz. Bacula otomatik olarak zinciri birleştirip en güncel halini size sunacak.

Replace Parametresi

Restore sırasında dosya çakışmalarını nasıl yöneteceğinizi Replace parametresiyle belirleyebilirsiniz:

  • Always: Her zaman mevcut dosyanın üstüne yaz
  • Never: Mevcut dosya varsa restore etme
  • IfNewer: Yedekteki dosya daha yeniyse yaz
  • IfOlder: Yedekteki dosya daha eskiyse yaz

Production’da genellikle önce /tmp altına restore edip manuel müdahale yapıyorum. Ama acil durumlarda Always ile orijinal konuma direk restore da yapılabilir.

Katalog Bilgisini Sorgulamak

Restore öncesinde katalogdan bilgi almak çok işe yarıyor. Hangi job’ların mevcut olduğunu görmek için:

*list jobs client=dbserver01-fd last 10

Belirli bir job’daki dosyaları listelemek:

*list files jobid=1842

Volume bilgisini kontrol etmek:

*list volumes

Tape ya da disk bazlı volumelerde hangi job’ların bulunduğunu görmek:

*list jobid=1842 jobmedia

Disaster Recovery Senaryosu

En zorlu senaryo: Sunucunun kendisi çöktü, hem işletim sistemi hem de Bacula File Daemon gitti. Bu durumda adımlar şöyle:

1. Önce yeni sistemi kurun ve Bacula File Daemon’ı yükleyin:

apt-get install bacula-fd
# veya
yum install bacula-client

2. bacula-fd.conf dosyasını eski ayarlarla yapılandırın:

# /etc/bacula/bacula-fd.conf
FileDaemon {
  Name = webserver01-fd
  FDAddress = 192.168.1.50
  FDPort = 9102
  WorkingDirectory = /var/lib/bacula
  Pid Directory = /run/bacula
  Maximum Concurrent Jobs = 20
}

Director {
  Name = bacula-dir
  Password = "eski-sifre-buraya"
}

3. File Daemon’ı başlatın:

systemctl start bacula-fd
systemctl enable bacula-fd

4. Director’dan client’ın erişilebilir olduğunu test edin:

*status client=webserver01-fd

5. Restore işlemini başlatın:

*restore client=webserver01-fd where=/
Select item:  (1-13): 5

Bu senaryoda where=/ diyerek tüm dosya sistemini orijinal konumlarına alabilirsiniz. Ancak /etc/bacula/bacula-fd.conf gibi yeni kurulumla çakışabilecek dosyalara dikkat edin.

Restore Job Log’larını İncelemek

Restore tamamlandıktan sonra detaylı logu incelemek:

*list joblog jobid=1985

Ya da son job’un detayları:

*list joblog last=1

Hata varsa log’da açıkça görünecektir:

# Başarılı bir restore log örneği
2024-01-15 16:45:23 webserver01-fd: Start Restore Job RestoreFiles.2024-01-15_16.44.55_03
2024-01-15 16:45:23 webserver01-fd: Using Device "FileStorage"
2024-01-15 16:45:31 webserver01-fd: Bacula 9.6.7 (10Dec20): 2024-01-15 16:45:31
Build OS:               x86_64-pc-linux-gnu redhat
JobId:                  1985
Job:                    RestoreFiles.2024-01-15_16.44.55_03
Restore Client:         webserver01-fd
Start time:             15-Jan-2024 16:44:57
End time:               15-Jan-2024 16:45:31
Files Expected:         234
Files Restored:         234
Bytes Restored:         45,821,334
Rate:                   1,350.0 KB/s
FD Errors:              0
FD termination status:  OK
SD termination status:  OK
Termination:            Restore OK

FD Errors: 0 ve Termination: Restore OK görüyorsanız işlem başarılı.

Sık Karşılaşılan Sorunlar ve Çözümleri

Volume bulunamıyor hatası: Storage Daemon’ın volume’e erişip erişemediğini kontrol edin:

*status storage=File
*list volumes
*update volume=FULL-0001

Client’a bağlanamıyor hatası: File Daemon’ın çalışıp çalışmadığını ve firewall kurallarını kontrol edin:

# Hedef sistemde
systemctl status bacula-fd
ss -tlnp | grep 9102

# Director'dan
*status client=webserver01-fd

Şifre uyuşmazlığı: Director konfigürasyonundaki şifreyle FD konfigürasyonundaki şifre aynı olmalı:

# Director'da /etc/bacula/bacula-dir.conf
Client {
  Name = webserver01-fd
  Address = 192.168.1.50
  FDPort = 9102
  Catalog = MyCatalog
  Password = "sifre-buraya"   # Bu
  File Retention = 60 days
  Job Retention = 6 months
}

# FD'de /etc/bacula/bacula-fd.conf
Director {
  Name = bacula-dir
  Password = "sifre-buraya"   # Bu ile aynı olmalı
}

Bootstrap dosyası hatası: Bootstrap dosyasının okunabilir olup olmadığını kontrol edin:

ls -la /var/lib/bacula/*.bsr
cat /var/lib/bacula/bacula-dir.restore.1.bsr

Restore Doğrulaması: Test Etmek Zorunluluktur

Restore işlemi bittiğinde doğrulama yapmanız şart. Ben genellikle şu kontrolleri yapıyorum:

# Dosya sayısını karşılaştır
find /tmp/bacula-restores/var/www/html -type f | wc -l

# Checksumları kontrol et (eğer yedek öncesi checksum aldıysanız)
find /tmp/bacula-restores -type f -exec md5sum {} ; > /tmp/restore-checksums.txt
diff /tmp/pre-backup-checksums.txt /tmp/restore-checksums.txt

# Kritik servisleri test et
# Web sunucusu için:
nginx -t -c /tmp/bacula-restores/etc/nginx/nginx.conf

# Veritabanı için restore edilen dump'ı test et
mysql -u testuser -p testdb < /tmp/bacula-restores/var/backups/db-dump.sql

Ayda en az bir kez gerçek restore testi yapın. Sadece backup alınıp alınmadığını değil, restore’un çalışıp çalışmadığını test etmek gerekiyor. Bunu calendar’ınıza ekleyin, gerçekten önemli.

Sonuç

Bacula’nın restore mekanizması ilk bakışta karmaşık görünse de mantığını kavradıktan sonra son derece esnek ve güvenilir bir araç. Önemli noktaları özetleyelim:

  • Her zaman önce /tmp veya alternatif bir konuma restore edin, dosyaları doğruladıktan sonra taşıyın
  • where=/ ile direkt orijinal konuma restore ederken ekstra dikkatli olun
  • Katalog sağlıklı kaldıkça geçmişteki herhangi bir noktaya dönebilirsiniz
  • Disaster recovery senaryolarında FD konfigürasyonunu ve şifrelerini kayıt altında tutun
  • Restore test etmeden yedekleme çözümünüze güvenmeyin

Gerçek bir felaket anında panik yapmadan bu adımları uygulamak için ortam sakin olduğunda pratik yapın. Bir test sunucusunda kasıtlı olarak dosya silin ve restore edin. O deneyim, gerçek kriz anında size çok fazla zaman kazandıracak.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir