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
/tmpveya 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.
