Yedekten Belirli Bir Ana Geri Yükleme (Point-in Recovery - PITR)

PITR, full backup ile son WAL dosyası arasında bir noktaya geri yüklemeye olanak sağlar.
recovery_target_time/name/xid/lsn parametreleri ile istenen noktaya
kadar geri yükleme (recovery) yapılabilir.
Canlı ortamlarda veritabanı kapatılamaz ve diğer objeler güncellenmeye (DML) devam
ettiği için PITR farklı bir sunucuda yapılır ve gerekli veriler canlı ortama SQL/PLpgSQL
kodları ile alınabilir.
Örnek :
# 21:00- full yedek alınır. pg_basebackup -D /RA/basebackup/fullbackup -l "'date'" -c fast -P -v -F tar -z -X fetch -R # 21:15- autocommit açıkken, where koşulu unutulur ve yanlışlıkla 1000 satır güncellenir. update film set release_year = 2022 ; UPDATE 1000
update cümlesinden bir dakika öncesine 21:14’ e geri yükleme yapmak için aşağıdaki
adımlar izlenir. Çoğunlukla point-in recovery işlemi başka bir makinede yapılır.
PITR ve full recovery adımlarının çoğu aynıdır. Lakin karışıklığa neden olmaması için tüm
adımlar tek tek yeniden yapılarak bağımsız olarak tekrar anlatılmıştır.
Not: Yoğun güncelleme alan bir tablo ise bir önceki günün pg_dump yedeğine
dönülmek istenmeyecektir.
Adım 1
# Recovery işlemlerini geçilir. Klasörlerin sahibi postgres kullanıcısı olmaldır. postgres@srv1:/$ sudo mkdir /pg/data/13.6/ postgres@srv1:/$ sudo chown -R postgres:postgres /pg postgres@srv1:/$ sudo mkdir /erp postgres@srv1:/$ sudo chown -R postgres:postgres /erp postgres@srv1:/$ sudo mkdir /ik postgres@srv1:/$ sudo chown -R postgres:postgres /ik postgres@srv1:/$ sudo mkdir /tmp_tbs postgres@srv1:/$ sudo chown -R postgres:postgres /tmp_tbs/
Gerekli klasörler oluşturulur. Eğer farklı bir makineye yedekten geri yükleme yapılacaksa
önce postgresql 13.6 sürümünün (yani yedek alınan postgresql ile aynı sürüm)
kurulması gerekir (initdb çalıştırmadan). 1. bölümde kaynak koddan 16. bölümde
ise apt ile hazır paketlerden kurulum anlatıldığı için burada tekrar değinilmemiştir.
(postgres kullanıcısının .profile dosyasının da düzenlenmesi gerekir.)
Adım 2
# Orijinal lokasyonlara veri dosyaları restore edilir. tar xvf /RA/basebackup/fullbackup/base.tar.gz -C /pg/data/13.6/ tar xvf /RA/basebackup/fullbackup/33016.tar.gz -C /erp tar xvf /RA/basebackup/fullbackup/33024.tar.gz -C /ik tar xvf /RA/basebackup/fullbackup/33029.tar.gz -C /tmp_tbs/ # İşletim sistemi ile kopyalanan wal dosyaları silinir ve arşivlenmiş wal dosyaları kopyalanır. rm -rf /pg/data/13.6/pg_wal/* cp /RA/archive/* /pg/data/13.6/pg_wal/
tar dosyaları orijinal lokasyonlara çıkarılır (extract) . Burada dikkat edilmesi
gereken hem yedek için hem de veri için disk alanına ihtiyaç vardır. 100’lerce terabyte
verinin olduğu ortamlarda sorun olabilir. Bu yüzden işlemlere başlamadan önce ihtiyaç
duyulan disk alanları hesaplanmalıdır. Senaryosu çizilmelidir. Network hızı yeterli ise
yedeklerin bulunduğu diskler network üzerinden sisteme gösterilebilir (NFS mount).
Adım 3
ln -s /erp /pg/data/13.6/pg_tblspc/33016 ln -s /ik /pg/data/13.6/pg_tblspc/33024 ln -s /tmp_tbs /pg/data/13.6/pg_tblspc/33029
Linkler oluşturulur. /pg/data/13.6/tablespace_map dosyasında OID ve klasör
bilgileri gelir.
Adım 4
# Recovery moda alınır. postgres@srv1:/$ rm /pg/data/13.6/standby.signal postgres@srv1:/$ touch /pg/data/13.6/recovery.signal # Konfigurasyon dosyası düzenlenir. postgres@srv1:/$ vim /pg/data/13.6/postgresql.conf restore_command = ‘cp /RA/archive/%f “%p”’ recovery_target_time = ‘2022-08-13 18:14:00 GMT’
Recovery modda başlatmak için $PGDATA dizininde recovery.signal dosyası
oluşturulup standby.signal silinir. Her iki dosya aynı anda bulunursa standby mod
aktif olur.
postgresql.conf dosyasına restore_command ve
recovery_target_time parametreleri eklenir.
21:14’e geri yükleme yapabilmek için Türkiye GMT+3 olduğu için GMT 18:14 yazıldı.
SELECT EXTRACT(timezone_hour FROM now()),EXTRACT(timezone_minute FROM now());
Not: Versiyon 12 öncesinde bu parametreler recovery.conf dosyasına yazılırdı.
Adım 5
postgres@srv1:~$ which pg_ctl /pg/home/13.6/bin/pg_ctl pg_ctl -o ‘--config-file=/pg/data/13.6/postgresql.conf’ -D /pg/ data/13.6/ -l pg.log start # Loglar incelenir. Bazı dosyaları bulamadığına dair uyarı ve hatalar verebilir. tail -f postgresql-Sat.log starting PostgreSQL 13.6 on x86_64-pc-linux-gnu, compiled by gcc (Debian 8.3.0-6) 8.3.0, 64-bit listening on IPv4 address “0.0.0.0”, port 5434 starting point-in-time recovery to 2022-08-13 21:14:00+03 restored log file “000000020000000000000059” from archive redo starts at 0/59000028 consistent recovery state reached at 0/59000138 database system is ready to accept read only connections restored log file “00000002000000000000005A” from archive restored log file “00000002000000000000005B” from archive redo done at 0/5B000060 recovery ended before configured recovery target was reached startup process (PID 7066) exited with exit code 1 terminating any other active server processes database system is shut down
pg_wal ve archive dizininde aynı dosyalara sahip olduğunda aşağıdaki uyarı
mesajını verir.Not: WARNING: archiving write-ahead log file
“000000020000000000000055” failed too many times, will try again later
Archive dizinindekiler silinirse ya da başka bir lokasyona taşınırsa sorun kalmaz.
