Incremental Backup in PostgreSQL
Database backups play an important role in an effective database recovery strategy in the production environment. It is very difficult for any database administrator to implement an effective backup strategy for real-time mission critical databases. There are multiple ways to take file system level backups on PostgreSQL Databases.
Barman is an open-source and very useful tool to perform PostgreSQL Database backups in the production environment. This tool is written in Python and allows you to list, keep, delete, archive, recover a full and incremental backup. You can manage the backup and recovery of multiple database servers from a single server. Barman uses Rsync and SSH to handle the full and incremental backups.
In this post, we will show you how to do an incremental backup in PostgreSQL with Barman.
Prerequisites
Two servers running Ubuntu 20.04 server.
A root password is configured on both server.
For the purpose of this tutorial, we will use the following setup:
Name IP Address Hostname PostgreSQL 45.58.44.108 pghost Barman 69.87.220.70 bmhost
Setup Hostname Resolution
Before starting, you will need to set up a hostname resolution on both servers so each server can communicate with each other by hostname.
To do so, edit the /etc/hosts
file on both servers:
nano /etc/hosts
Add the following lines:
45.58.44.108 pghost 69.87.220.70 bmhost
Save and close the file when you are finished.
Install PostgreSQL
First, you will need to install the PostgreSQL server on pghost
server. You can install it using the following command:
apt-get install postgresql rsync
Once the PostgreSQL is installed, log in to the PostgreSQL shell with the following command:
sudo -u postgres psql
Once you are log in, set a password to postgres user with the following command:
postgres=# ALTER USER postgres PASSWORD 'newpassword';
Next, exit from the PostgreSQL shell and proceed to the next step.
Install Barman
Next, you will need to install the Barman on the bmhost
server. You can install it with the following command:
apt-get install barman -y
Once the Barman server is installed, verify it with the following command:
barman --version
You should get the following output:
2.10 Barman by 2ndQuadrant (www.2ndQuadrant.com)
Next, set the password for Barman user with the following command:
passwd barman New password: Retype new password: passwd: password updated successfully
Configure SSH Key-based Authentication on Both Servers
Next, you will need to configure an SSH key-based authentication on both servers so both servers can connect using SSH without providing a password.
Configure SSH Key-based Authentication on PostgreSQL Server
On the PostgreSQL server, log in to Postgres user with the following command:
su - postgres
Next, generate RSA key with the following command:
ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa
Next, copy the generated key to the Barman server:
ssh-copy-id -i ~/.ssh/id_rsa.pub barman@bmhost
Next, set proper permission to authorized_keys
on Barman server.
ssh barman@bmhost "chmod 600 ~/.ssh/authorized_keys"
Next, exit from the Postgres user with the following command:
exit
Configure SSH Key-based Authentication on Barman Server
On the Barman server, log in as a barman user with the following command:
su - barman
Next, generate RSA key with the following command:
ssh-keygen -q -t rsa -N '' -f ~/.ssh/id_rsa
Next, copy the generated key to the PostgreSQL server:
ssh-copy-id -i ~/.ssh/id_rsa.pub postgres@pghost
Next, set proper permission to authorized_keys
on PostgreSQL server.
ssh postgres@pghost "chmod 600 ~/.ssh/authorized_keys"
Next, exit from the barman user with the following command:
exit
Configure PostgreSQL Server
By default, the PostgreSQL server listens only on localhost. So you will need to configure it to listen on the public-ip. You can set it by editing the PostgreSQL main configuration file:
nano /etc/postgresql/12/main/postgresql.conf
Change the following line to your server-ip:
listen_addresses = '45.58.44.108'
Next, enable the archive mode and define the path of a backup location on the Barman server.
wal_level = replica archive_mode = on archive_command = 'rsync -a %p barman@bmhost:/var/lib/barman/pghost/incoming/%f'
Save and close the file. Then, edit the PostgreSQL host-based authentication file and allow Barman server IP to connect to the PostgreSQL server.
nano /etc/postgresql/12/main/pg_hba.conf
Add the following lines:
host all all 69.87.220.70/32 md5 host replication all 69.87.220.70/32 md5
Save and close the file then restart the PostgreSQL service to apply the changes:
systemctl restart postgresql
Configure Barman Server
Next, you will need to configure the Barman server on the bmhost. First, edit the Barman main configuration file with the following command:
nano /etc/barman.conf
Change the following lines as per your requirements:
[barman] barman_user = barman configuration_files_directory = /etc/barman.d barman_home = /var/lib/barman log_file = /var/log/barman/barman.log log_level = INFO compression = gzip
Save and close the file then create a new configuration file to define your PostgreSQL host.
nano /etc/barman.d/pghost.conf
Add the following lines:
[pghost] description = "Postgres Server Configuration" ssh_command = ssh postgres@pghost conninfo = host=pghost user=postgres dbname=postgres port=5432 backup_method = rsync reuse_backup = link backup_options = concurrent_backup parallel_jobs = 2 archiver = on
Save and close the file when you are finished.
Next, log in as a barman user with the following command:
su - barman
Next, create a file to store the PostgreSQL user credentials:
nano ~/.pgpass
Add the following lines:
pghost:5432:*:postgres:newpassword
Save and close the file then set proper permission to ~/.pgpass
file:
chmod 0600 ~/.pgpass
Where:
pghost is the hostname of the PostgreSQL server.
5432 is the port number of the PostgreSQL server.
postgres is the super user of the PostgreSQL server.
newpassword is the password of the postgres user.
How to Backup PostgreSQL Database From Barman Server
At this point, the Barman server is configured to handle the PostgreSQL backup.
On the Barman server, log in as a barman user with the following command:
Now, list the backup server configured on the Barman server with the following command:
barman list-server
You should get the following output:
pghost - Postgres Server Configuration
Now, check the configuration of both servers:
barman check pghost
If every thing is fine, you should get the following output:
Server pghost: PostgreSQL: OK is_superuser: OK wal_level: OK directories: OK retention policy settings: OK backup maximum age: OK (no last_backup_maximum_age provided) compression settings: OK failed backups: OK (there are 0 failed backups) minimum redundancy requirements: OK (have 0 backups, expected at least 0) ssh: OK (PostgreSQL server) systemid coherence: OK (no system Id stored on disk) archive_mode: OK archive_command: OK continuous archiving: OK archiver errors: OK
You can also check the configuration of the pghost with the following command:
barman status pghost
You should get the following output:
Server pghost: Description: Postgres Server Configuration Active: True Disabled: False PostgreSQL version: 12.7 Cluster state: in production pgespresso extension: Not available Current data size: 23.9 MiB PostgreSQL Data directory: /var/lib/postgresql/12/main Current WAL segment: 000000010000000000000003 PostgreSQL 'archive_command' setting: rsync -a %p barman@bmhost:/var/lib/barman/pghost/incoming/%f Last archived WAL: No WAL segment shipped yet Failures of WAL archiver: 0 Passive node: False Retention policies: not enforced No. of available backups: 0 First available backup: None Last available backup: None Minimum redundancy requirements: satisfied (0/0)
Now, create your first backup with the following command:
barman backup pghost
You should get the following output:
Starting backup using rsync-concurrent method for server pghost in /var/lib/barman/pghost/base/20210727T101338 Backup start at LSN: 0/4000028 (000000010000000000000004, 00000028) This is the first backup for server pghost WAL segments preceding the current backup have been found: 000000010000000000000001 from server pghost has been removed Starting backup copy via rsync/SSH for 20210727T101338 (2 jobs) Copy done (time: 2 seconds) This is the first backup for server pghost Asking PostgreSQL server to finalize the backup. Backup size: 23.6 MiB. Actual size on disk: 23.6 MiB (-0.00% deduplication ratio). Backup end at LSN: 0/4000100 (000000010000000000000004, 00000100) Backup completed (start time: 2021-07-27 10:13:38.531348, elapsed time: 9 seconds) Processing xlog segments from file archival for pghost 000000010000000000000003 000000010000000000000004 000000010000000000000004.00000028.backup
To list your backup, run the following command:
barman list-backup pghost
You should see the following output:
pghost 20210727T101338 - Tue Jul 27 10:13:42 2021 - Size: 23.6 MiB - WAL Size: 0 B
To check the information of your backup, run the following command:
barman show-backup pghost 20210727T101338
You should see the following output:
Backup 20210727T101338: Server Name : pghost System Id : 6989524953855731927 Status : DONE PostgreSQL Version : 120007 PGDATA directory : /var/lib/postgresql/12/main Base backup information: Disk usage : 23.6 MiB (23.6 MiB with WALs) Incremental size : 23.6 MiB (-0.00%) Timeline : 1 Begin WAL : 000000010000000000000004 End WAL : 000000010000000000000004 WAL number : 1 WAL compression ratio: 99.90% Begin time : 2021-07-27 10:13:38.426340+00:00 End time : 2021-07-27 10:13:42.425332+00:00 Copy time : 2 seconds + 1 second startup Estimated throughput : 9.1 MiB/s (2 jobs) Begin Offset : 40 End Offset : 256 Begin LSN : 0/4000028 End LSN : 0/4000100 WAL information: No of files : 0 Disk usage : 0 B Last available : 000000010000000000000004 Catalog information: Retention Policy : not enforced Previous Backup : - (this is the oldest base backup) Next Backup : - (this is the latest base backup)
You can list the files base backup and required WAL files for a specific backup with the following command:
barman list-files pghost 20210727T101338
If you want to schedule a cron job to backup your server once a day at 10 PM, create a cron job with the following command:
crontab -e
Add the following line:
0 22 * * * barman /usr/bin/barman backup pghost
Save and close the file when you are finished.
Conclusion
In the above guide, we explained how to take incremental backup with Barman in PostgreSQL. You can now use Barman in the production environment to manage backups of multiple PostgreSQL servers. For more information, read the Barman official documentation.
Thank you for helping us improve!