Πώς κάνουμε Backup βάση δεδομένων PostgreSQL χωρίς την χρήση 3rd party tools

Πώς κάνουμε Backup βάση δεδομένων PostgreSQL χωρίς την χρήση 3rd party tools
Πώς κάνουμε Backup βάση δεδομένων PostgreSQL χωρίς την χρήση 3rd party tools

Σε αυτό το άρθρο θα δούμε βήμα βήμα πως κάνουμε backup χωρίς την χρήση 3rd party tools full backup και log backup ώστε να μπορούμε να κάνουμε PITR (Point in Time Recovery) αν χρειαστεί στο μέλλον. Τέλος θα δούμε πως μπορούμε να αυτοματοποιήσουμε την διαδικασία και την συντήρηση τους μέσω cronjobs.

Θα πρέπει να γνωρίζουμε οτι τα αντίστοιχα transaction / archive logs στη PostgreSQL ονομάζονται WAL (Write Ahead Logs).

Τα βήματα

Πρώτα θα φτιάξουμε τους φακέλους που θα περιέχουν τα backup και θα δώσουμε τα δικαιώματα που πρέπει να έχουν:

sudo mkdir -p /var/lib/postgresql/backup/full
sudo mkdir -p /var/lib/postgresql/backup/archived_wal

sudo chown -R postgres:postgres /var/lib/postgresql/backup
sudo chmod -R 700 /var/lib/postgresql/backup

Στη συνέχεια αν θέλουμε να έχουμε τη δυνατότητα Point in Time Recovery θα πρέπει με τον χρήστη postgres να ενεργοποιήσουμε το archiving και να δηλώσουμε την τοποθεσία τους:

su postgres
vi /var/lib/pgsql/11/data/postgresql.conf
# - Archiving -

archive_mode = on               # enables archiving; off, on, or always

archive_command = 'cp %p /var/lib/postgresql/backup/archived_wal/%f'

Όπως επίσης το wal_level:

wal_level = replica

Σε αυτό το σημείο θα χρειαστεί restart του service:

sudo systemctl restart postgresql-11

Φτιάχνουμε ένα executable file το οποίο θα περιέχει το script:

vi /usr/local/bin/pg_full_backup.sh

Στο script δηλώνουμε τον φάκελο που φτιάξαμε πριν για τα full backups και η εντολή pg_basebackup τρέχει την διαδικασία εξάγοντας τα αρχεία σε ένα συμπιεσμένο αρχείο. Σαν δεύτερο βήμα τρέχει η διαδικασία του maintenance που κρατάει τα αρχεία μόνο για 30 ημέρες:

#!/bin/bash
BACKUP_DIR="/var/lib/postgresql/backup/full"
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
DEST="$BACKUP_DIR/full_$TIMESTAMP"

#full backup
pg_basebackup -D "$DEST" -F t -z -P -X fetch

#30 days retention
find "$BACKUP_DIR" -mindepth 1 -maxdepth 1 -type d -mtime +30 -exec rm -rf {} +

Αφού το φτιάξουμε δίνουμε τα σωστά δικαιώματα:

sudo chown postgres:postgres /usr/local/bin/pg_full_backup.sh
sudo chmod +x /usr/local/bin/pg_full_backup.sh

Αντίστοιχα μπορούμε να φτιάξουμε executable για το maintenance των WAL:

vi /usr/local/bin/clean_wal.sh
#!/bin/bash

WAL_DIR="/var/lib/postgresql/archived_wal"

#retention 30 days
find "$WAL_DIR" -type f -mtime +30 -exec rm -f {} \;
sudo chown postgres:postgres /usr/local/bin/clean_wal.sh
sudo chmod +x /usr/local/bin/clean_wal.sh

Για να τα προσθέσουμε στο scheduler του cronjob τρέχουμε το παρακάτω:

sudo -u postgres crontab -e

Με τις παρακάτω γραμμές ουσιαστικά θα εκτελεστούν κάθε μερα στις 22:00 και 23:00 αντίστοιχα:

0 23 * * * /usr/local/bin/pg_full_backup.sh >/dev/null 2>&1
0 22 * * * /usr/local/bin/clean_wal.sh >/dev/null 2>&1

Differential / Incremental backup?

Έως την PostgreSQL 17 δεν υπήρχε τρόπος για block level backup οπότε η μόνη native λύση ήταν το full backup και έπειτα η χρήση των WAL, στις παλαίοτερες εκδόσεις για να μπορείς να κάνεις τέτοιου τύπου backup θα πρέπει να κάνεις χρήση 3rd party tools όπως των pgBackRest και Barman.

Πηγές:

Μοιράσου το

Αφήστε μία απάντηση