Bu yazıyı okumadan önce, ssh ayarlarınızı yaptığınıza emin olun
Bu yazı PostgreSQL 11 ve PgBackRest 2.15 için yazılmıştır
Öncelikle aşağıdaki komut ile pgbackrest kuralım:
sudo apt-get install pgbackrest -y
Sonra, /etc/pgbackrest.conf
'u açalım, içindekileri silelim ve şunları ekleyelim:
[global]
repo1-host=192.168.56.101
repo1-host-user=postgres
process-max=2
log-level-console=info
log-level-file=debug
[main_stanzamiz]
pg1-path=/var/lib/postgresql/11/main
pg1-port=5432
repo1-host
: Yedek sunucunuzun IP'si
repo1-host-user
: Yedek sunucunuzun kullanıcısı
not: postgres yerine başka bir kullanıcı da oluşturabilirdiniz. Bizim kurulumumuzda postgres kullanıcısı hazır geldiği için ve SSH ayarlarını ona göre yaptığımız için postgres kullandım.
pg1-path
: postgres clusterinizin data klasörü
main_stanzamiz olarak istediğiniz ismi verebilirsiniz.
stanza: bir cluster'in yedekleme, arşivleme gibi ayarlarını içeren konfigürasyon
repo: yedeğin alınacağı yer. local veya uzak bir makine olabilir
Şimdi, PostgreSQL'e, WAL dosyalarını pgbackrest'e göndermesini söyleyelim.
/etc/postgresql/11/main/postgresql.conf
içinde şu ayarları yapın:
archive_mode = on
archive_command = 'pgbackrest --stanza=main_stanzamiz archive-push %p'
Daha sonra,
systemctl reload postgresql@11-main
çalıştırın.
Yine pgbackrest kuralım:
sudo apt-get install pgbackrest -y
Sonra, /etc/pgbackrest.conf
'u açalım, içindekileri silelim ve şunları ekleyelim:
[global]
repo1-path=/var/lib/pgbackrest
repo1-retention-full=2
repo1-retention-diff=2
process-max=2
log-level-console=info
[main_stanzamiz]
pg1-path=/var/lib/postgresql/11/main/
pg1-host=192.168.56.102
pg1-host-user=postgres
repo1-path
: backup sunucumuzda yedeklerin kaydedileceği yer
repo1-retention-full
: full backupların sınırı, bu sayıdan sonra öncekiler silinir
repo1-retention-diff
: üsttekinin diff hali
pg1-path
: postgres cluster'inizin data klasörü
pg1-host
: postgres cluster IP
pg1-host-user
: postgres kullanıcı adı (genelde postgres)
Not: pg1-host-user'in cluster klasörünü okuma ve yazma yetkisi olmalıdır
Şimdi de stanza'yı oluşturalım.
postgres kullanıcısı olarak;
pgbackrest --stanza=main_stanzamiz stanza-create
SSH ile ilgili bir şey sorarsa "yes" yazın.
pgbackrest --stanza=main_stanzamiz check
ile kontrol sağlayın. Son satırda INFO: check command end: completed successfully (2502ms)
gibi bir çıktı almanız gerekiyor.
Aynı kontrolü master sunucusunda da yapın.
Kurulumu tamamladık.
Şimdi ilk backup'ımızı alalım.
- Backup, backup/repo sunucusundan alınır
- Restore, master sunucudan yapılır
Backup alacağımız için, backup/repo sunucusuna geçin.
pgbackrest --stanza=main_stanzamiz backup
pgbackrest varsayılan olarak incremental backup alacaktır. Fakat bizim full backup'ımız olmadığı için, ilk seferde full backup oluşturmak zorunda.
--type=full
ile full backup almaya zorlayabilirsiniz. incr
ve diff
de seçebilirsiniz.
Yedek Türü | Backup Hızı | Restore Hızı | Depolama |
---|---|---|---|
Full | En yavaş | Normal | En fazla |
Differential | Yavaş | Normal | En az |
Incremental | Hızlı | Yavaş | Orta |
Archive* | En hızlı | En yavaş | Fazla |
archive: otomatik gelen WAL dosyalarıyla yapılan backup
Benim incelemelerime göre böyle bir tablo çıkardım.
Örneğin, günlük incremental, haftalık differential, aylık full backup alabilirsiniz. Archive zaten otomatik alınıyor.
Restore hızı duruma göre değişkenlik gösterecektir.
Backup'ınız başarılı olduysa, PostgreSQL'i bozup deneyebiliriz. Önce, başarılı olup olmadığına bakalım. ```sh pgbackrest --stanza=main_stanzamiz info ``` Çıktı şöyle bir şey ise problem yok demektir; ``` ... full backup: 20190728-133937F timestamp start/stop: 2019-07-28 13:39:37 / 2019-07-28 13:39:56 wal start/stop: 000000010000000000000019 / 000000010000000000000019 database size: 98MB, backup size: 98MB repository size: 6.6MB, repository backup size: 6.6MB ... ``` # Restore etme **Master** sunucuya geçin, aşağıdaki komutları **root** olarak çalıştırın.
PostgreSQL'i öldürüp dosyalarını silelim.
killall -9 postgres
rm -rf /var/lib/postgresql/11/main/*
Başlatmaya çalışırken hata alacaksınız:
systemctl start postgresql@11-main
Şimdi de restore işlemi yapalım. Restore işlemi olduğu için, master sunucuda çalıştırıyoruz.
pgbackrest --stanza=main_stanzamiz restore
Eğer veritabanı klasörünüz boş değilse, --delta
parametresiyle checksum kontrolü yaparak restore yapabilirsiniz. Eğer dosya yoksa, veya farklıysa, değiştirilecektir.
Sadece bir database'i restore etmek için --db-include=test_database
kullanabilirsiniz.
Bir tablonuzu yanlışlıkla sildiniz diyelim. Böyle bir durumda, veritabanını belli bir tarihe geri döndürebilirsiniz.
Belirtilen bir tarihe dönmek için (örn. 2019-07-28 17:30);
(postgres kullanıcısında)
pgbackrest --stanza=main_stanzamiz --delta \
--type=time "--target=2019-07-28 17:30:00.000000+00" \
--target-action=promote restore
Bu işlem recovery.conf'u oluşturacaktır. İsterseniz cat /var/lib/postgresql/11/main/recovery.conf
ile inceleyebilirsiniz.
Postgres'i başlatalım, recovery işlemini yapsın, daha sonra da --target-action=promote
verdiğimiz için recovery'den çıksın.
(root kullanıcısında)
systemctl start postgresql
Not: PostgreSQL aslında geri gitmiyor. Verilen base backup'dan başlayıp, diğer backup/archive dosyaları ile ileri doğru gidiyor, belirtilen hedefte duruyor.
Eğer son backup'ınızdan daha önceki bir veriyi almak isterseniz,
--set=[backup label idsi]
parametresini ekleyebilirsiniz. Label ID'yi az önceki gibi info
ile öğrenebilirsiniz.
Not 2: Bir backup'ı sildiğinizde (veya retention ile kendi silinince), referansı olan backuplar da silinir. Örneğin bir full backup altında differential backup'ınız varken, full backup'ı silerseniz, differential backup'ınız da silinir.
Backup sunucunuzda /etc/pgbackrest.conf
içinde;
[global]
backup-standby=y
[main_stanzamiz]
pg2-host=192.168.56.104
pg2-host-user=postgres
pg2-path=/var/lib/postgresql/10/demo
şeklinde ekleme yapabilirsiniz. pg2
standby/replika sunucusu anlamına gelmektedir.
Bu sadece backuplar için geçerlidir. WAL dosyalarını zaten master sunucumuz backup'a direk gönderiyor.
Restore ederken bütün tablespace'lar orjinal yerlerinde olmalıdır. Eğer değilse, hata alırsınız.
Bunu çözmek için --tablespace-map
kullanılabilir.
pgbackrest ..... --tablespace-map=tablespace_1=/disk/tablespace_1/ restore
Birden fazla tablespace için --tablespace-map-all
kullanılabilir.
pgbackrest ..... --tablespace-map-all=/disk/tablespacelar/ restore
Debian tabanlı sistemlerde konfigürasyonlar /etc/postgresql/
altında olduğu için, pgbackrest bunları yedeklemeyecektir. Bunu siz kendiniz yapmalısınız.
scp
komutu ile sunucular arasında dosya kopyalayabilirsiniz.
Dikkat etmeniz gereken bir nokta, postgresql.conf
içerisinde "FILE LOCATIONS" altındaki dosya yollarını değiştirmektir. Bazen bunu yapmaya ihtiyacınız olmayabilir.
İsterseniz, pg_dumpall
kullanarak mantıksal yedekleme de yapmanız mümkündür. Bu komut SQL çıktısı üretir. Recovery daha uzun sürecek, indexler, konfigürasonlar ve daha bir çok şey yedeklenmeyecektir. Fakat daha portatif bir çözümdür.
archive_command
'ı direk olarak tar
veya cp
komutuna da verebilirsiniz. Bu sadece WAL dosyalarını kopyalayacağı için, fazla özelliği olmayacaktır. Backup ve restore işlemleri zor olabilir.
pgbackrest ile, bu yedekleri kolay bir şekilde yönetebilirsiniz.
Aynı makineye yedekleme yapabilirsiniz, fakat bu çoğu zaman mantıklı değildir. repo-host
ile aynı makinede farklı bir dizine/diske yedekleme yapabilirsiniz.
Postgres, WAL dosyalarını göndermeyi belirli aralıklarla tekrar dener. Backup sunucunuzun çalışıp çalışmadığını, disk alanını vs. kontrol eden sistemler (monitoring) kullanmanız önerilir. Postgres bu durumda WAL klasörüne yazmaya devam eder.
Eğer WAL klasörünün disk alanı dolarsa Postgres PANIC verip kendini kapatacaktır.
Hata: /tmp/pgbackrest permission denied
Çözüm: root'a geçip rm -rf /tmp/pgbackrest/
çalıştırın.
Sebep: pgbackrest'i root olarak çalıştırmışsınız. postgres kullanıcısından deneyin. (veya başka kullanıcınız varsa ondan)
Diğer hatalar için iletişime geçerseniz yardımcı olmaya çalışır, buraya da eklerim
https://pgbackrest.org/configuration.html
https://pgbackrest.org/user-guide.html
https://pgstef.github.io/2019/03/26/pgbackrest_archiving_tricks.html
https://pgstef.github.io/2018/01/04/introduction_to_pgbackrest.html