Press ESC to close

POSTGRESQL YEDEKLEME VE KURTARMA -3 (BACKUP AND RECOVERY) POINT IN TIME RECOVERY (PITR)

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

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir