
PgBackRest ile PostgreSQL Restore konulu yazımda, PostgreSQL veri tabanı için pgBackRest aracı kullanarak nasıl doğru bir şekilde restore (geri yükleme) işlemi yapılacağını adım adım anlatıyor olacağım. Özellikle standby sunucu kurulumu veya veri kurtarma işlemleri için bu yöntem oldukça kullanışlıdır.
Veri tabanları için backup almak ne kadar önemli ise de sorun anında restore yapamadıktan sonra herhangi bir işe yaramamaktadır. Bu sebeple backuplarımızın belli aralıklarla restore testlerinin yapılması doğru bir yaklaşımdır. Yani bir nevi felaket anında oluşabilecek senaryolar için kendimizi hazırlamamız gerekiyor.
Bu adımlara geçmeden önce elimizde doğru yöntemlerle alınmış bir backup silsilemizin olduğunu varsayarak işlemlerimize devam ediyorum. Daha önceki yazımda anlattığım PgBackRest Kurulumu ve Yapılandırması konulu yazıma linkten ulaşabilirsiniz.
Restore işlemini için benim ortamımda veri tabanı sunucusu ve backup sunucusu ayrı makinelerde ve restore işlemini backup sunucumun üzerinde yapacağım.
Backup sunucusu:192.168.26.104(host:management)
Stanza:prod_backup
Restore İşlemi İçin pgBackRest Konfigürasyon Dosyasının Oluşturulması
İlk adım olarak, restore işlemlerinde kullanılacak bir konfigürasyon dosyası (pgbackrest_restore.conf) oluşturuyoruz. Bu dosya, backup verilerinin hangi yoldan alınacağını ve restore işlemi sırasında hangi ayarların geçerli olacağını tanımlar.
vi /etc/pgbackrest_restore.conf[global]
repo1-path=/backup/pgbackrest/repo
repo1-host-user=postgres
repo1-host-config=/etc/pgbackrest_restore.conf
log-level-file=detail
log-level-console=warn
archive-async=y
process-max=32
[global:restore]
process-max=32
delta=y
[prod_backup]
pg1-path=/var/lib/pgsql/15/data- PostgreSQL Veri tabanını Kapatın
Restore işlemi başlamadan önce backup sunucumuzda PostgreSQL servisini durdurmanız gerekir. Çünkü veri tabanı çalışırken restore işlemi yapılamaz.
sudo systemctl stop postgresql-15.service- Restore İşleminin Başlatılması
PgBackRest cluster-level (tüm veritabanı) veya database-level bazda restore işlemi yapabilmektedir. Her iki işlem içinde örnek scriptler aşağıda verilmiştir.
Cluster-level seviyesinde restore işlemini aşağıdaki komutla başlatıyoruz:
su - postgres
pgbackrest --config=/etc/pgbackrest_restore.conf --stanza=prod_backup --log-level-console=info restoreİlk denemede aşağıdaki gibi bir hata alabilirsiniz. Bu hata, PostgreSQL’in hala çalıştığı veya eski bir postmaster.pid dosyasının bulunduğunu gösterir.
Eğer emin iseniz, postmaster.pid dosyasını yedekleyip silebilirsiniz.
ERROR: [038]: unable to restore while PostgreSQL is running
HINT: presence of 'postmaster.pid' in '/var/lib/pgsql/15/data' indicates PostgreSQL is running.Daha sonra tekrar restore komutunu çalıştırıp aşağıdaki gibi başarılı bir şekilde restore işleminin bittiğinigörüyoruz.
[postgres@management data]$ pgbackrest --config=/etc/pgbackrest_restore.conf --stanza=prod_backup --log-level-console=info restore
2025-02-24 13:54:35.115 P00 INFO: restore command begin 2.49: --config=/etc/pgbackrest_restore.conf --delta --exec-id=161703-e5cf4c6a --log-level-console=info --log-level-file=detail --pg1-path=/var/lib/pgsql/15/data --process-max=6 --repo1-host=192.168.26.104 --repo1-host-config=/etc/pgbackrest_restore.conf --repo1-host-user=postgres --repo1-path=/backup/pgbackrest/repo --stanza=prod_backup --type=standby
2025-02-24 13:54:35.375 P00 INFO: repo1: restore backup set 20250224-122924F, recovery will start at 2025-02-24 12:29:24
2025-02-24 13:54:35.378 P00 INFO: remove invalid files/links/paths from '/var/lib/pgsql/15/data'
2025-02-24 13:54:37.610 P00 INFO: write updated /var/lib/pgsql/15/data/postgresql.auto.conf
2025-02-24 13:54:37.612 P00 INFO: restore global/pg_control (performed last to ensure aborted restores cannot be started)
2025-02-24 13:54:37.612 P00 INFO: restore size = 29.7MB, file total = 1275
2025-02-24 13:54:37.612 P00 INFO: restore command end: completed successfully (2498ms)Database-level seviyesinde aşağıdaki gibi instance içindeki tek bir db yi include edebiliriz:
[postgres@management data]$ pgbackrest --delta --db-include=mg --type=immediate --config=/etc/pgbackrest_restore.conf --stanza=prod_backup --log-level-console=info restore Ayrıca aşağıdaki gibi belirli time line a restore işlemi yapılabilmektedir.
[postgres@management data]$ pgbackrest --stanza=prod_backup --delta --type=time "--target=2023-12-27 14:31:56.391278+03" --target-action=promote --log-level-console=detail restore- Restore sonrası postgresql.conf dosyasının düzenlenmesi
Restore işlemi başarılı bir şekilde bittikten sonra data dizinimizdeki postgresql.conf dosyası kaynaktan gelen conf dosyası olup backup sunucumuzdaki config lerin farklı olmasını isteyebilirsiniz. Bu sebeple gelen config dosyasını şu an default parametrelerle açılmasını sağlayacağım. Restore ile gelen conf dosyasını yedekle veya mevcuttaki conf dosyası düzenle.
mv postgresql.conf postgresql.conf_old
mv postgresql.base.conf postgresql.conf- PostgreSQL Servisini Başlatın
Artık restore tamamlandı PostgreSQL servisini başlatabilirsiniz :
sudo systemctl start postgresql-15.service Bu aşamaya kadar veri kurtarmak veya sistemimizi tekrar ayağa kaldırmak için restore adımlarını yapmış olduk. Restore işlemini yaptığımız bu sunucuyu FKM de yada başka bir konumda belirli bir süre geriden gelsin gibi isterimiz var ise:
Backup sunucuma recovery_min_apply_delay parametresini set edip wal logları istenilen sürede geriden işletmesi sağlanır. Burada wal logları prod dan değil pgbackrest den alması sağlanır.
Recovery Delay Süresinin Tanımlanması
Restore işlemi yapılan bu sunucumuzu gecikmeli replikasyon işlemi için postgresql.auto.conf dosyasına restore_command parametresini ekleyip sonra veri tabanı servisini açmanız gerekmektedir. Bu parametre ile wal logları 4 saat geriden gelecek şekilde pgbackrest ‘den dinleyip uygular.
vi /var/lib/pgsql/15/data/postgresql.auto.conf# Do not edit this file manually!
# It will be overwritten by the ALTER SYSTEM command.
restore_command = 'pgbackrest --config=/etc/pgbackrest_restore.conf --stanza=prod_backup archive-get %f "%p"'
recovery_min_apply_delay = '4h'Daha sonra veri tabanı içinden de bu süreyi aşağıdaki gibi set edebilirsiniz:
postgres=# alter system set recovery_min_apply_delay='6h';
ALTER SYSTEMDeğişikliklerin aktif olması için reload_conf:
postgres=# select pg_reload_conf();Bu adımları takip ederek PostgreSQL üzerinde pgBackRest ile güvenli bir şekilde restore işlemi yapabilir ve standby sunucunuzu hazır hale getirebilirsiniz. Özellikle kritik sistemlerde, yedekleme ve geri yükleme operasyonlarının eksiksiz ve doğru şekilde yapılması büyük önem taşır.
PgBackrest resmi dökümantasyon için tıklayınız.



Leave a Comment