
Point In Time Recovery (PITR) ile son full backup alındığı zaman ile son kaydedilen WAL dosyaları arasında bir zamana geri yüklemeye olanak sağlanır. Son alınan pg_basebackup tan geri dönülür ardından istenilen zaman parametre olarak recovery_target_time (timestamp veya txid) girilir ve istenen zamana kadar WAL dosyaları da işletilir ve istenen zaman veritabanı getirilmiş olur. Bir önceki örnekte anlatılan adımların aynısı yapılır tek fark recovery_target_time parametresidir.
Bir önceki yazımızda pg_basebackup ile nasıl backup alacağımızı anlatmıştık, o yazının üzerine devam etmekteyiz. https://www.farukcevik.com.tr/postgresql-yedekleme-ve-kurtarma-2-backup-and-recovery/
Örnek ;
Mevcut veritabanımız hazırladığımız backup scripti olan pg_basebackup.sh scriptimizi çağırarak bir full backup alalım.
$ sh /postgres/backup/scripts/pg_basebackup.sh
$ date
Sun Jan 8 18:06:29 UTC 2023
Backup aldıktan sonra bazı tablolar üzerinde değişiklikler yapalım ve ardından veritabanımızı kapatalım
postgres=# select * from emp_info;
empno | ename | address
-------+--------+---------------
1 | john | 2 down str
2 | clark | 132 south avn
3 | soojle | Down st 17th
4 | Faruk | Ankara
postgres=# delete from emp_info where empno=4;
DELETE 1
Faruk kaydını sildik ve yedekten bu andan önceki bir zaman dönmek istiyoruz.
Veritabanını kapatıp $PGDATA dizinini ve Tablespace dizinini temizliyoruz
$ pg_ctl stop
waiting for server to shut down....... done
server stopped
$ pwd
/postgres/14/data
$ rm -rf *
$ pwd
/postgres/14/tablespaces
$ rm -rf *
Recover işlemlerine geçiyoruz, $PGDATA (data) dizini altına alınan backup taki base.tar.gz dosyamızı gönderip tar dan çıkaralım , ayrıca tüm tablespace tar dosyalarını da kendi dizinlerine göndererek tar dan çıkaralım;
$ tar -xvf /postgres/backup/DB_BACKUPS/20230108/base.tar.gz -C /postgres/14/data/
$ tar -xvf /postgres/backup/DB_BACKUPS/20230108/16397.tar.gz -C /postgres/14/tablespaces/
Tablespace ler için sembolik linkler oluşturulur;
$ ln -s /postgres/14/tablespaces /postgres/14/data/pg_tblspc/16397
Recovery modda başlatmak için $PGDATA altındaki recovery.signal dosyası oluşturulur ve standby.signal varsa dosyası silinir. Her iki dosya aynı anda bulunursa standby mode aktif olacaktır.
$ touch /postgres/14/data/recovery.signal
##postgresql.conf içerisinde
restore_command = 'cp /postgres/archive/%f "%p"'
recovery_target_time = '2023-01-08 18:06:00 UTC'
Artık veritabanını açabiliriz.
$ pg_ctl -o '--config-file=/postgres/14/data/postgresql.conf' -D /postgres/14/data/ -l pg.log start
waiting for server to start.... done
server started
Log dosyası kontrol edildiğinde
2023-01-08 18:53:50.893 UTC [2263739] DETAIL: The failed archive command was: test ! -f /postgres/archive/000000010000000000000005 && cp pg_wal/000000010000000000000005 /postgres/archive/000000010000000000000005
Şeklinde uyarılar alındı, ignore edilebilir bu uyarılar archive dizinindeki WAL dosyalarından kaynaklanmaktadır.
Sildiğimiz kaydı sorgulayalım;
[postgres@postgres-edu data]$ psql -p 5434
psql (14.5)
Type "help" for help.
postgres=# select * from emp_info ;
empno | ename | address
-------+--------+---------------
1 | john | 2 down str
2 | clark | 132 south avn
3 | soojle | Down st 17th
4 | Faruk | Ankara
(4 rows)
Sildiğimiz Faruk kaydını yerinde görünüyoruz, sildiğimiz kaydın öncesi durumuna veritabanını tekrar getirdik.
Bir yanıt yazın