Fun with pgbackrest

Fun with pgbackrest

pgbackrest is an amazing tool that saves entire PostgreSQL clusters with ease.

In this post we’ll go trough the configuration of the backup using a remote backup server.

For the extensive documentation and detailed instructions please refer to the user guide.

operating system configuration

For our example we’ll use two virtual machines on virtualbox with devuan 1.0 Jessie installed.

Each machine is configured in the same way.

  • 1 cpu
  • 1 GB ram
  • Hard disk of 12 GB with single partition ext4
  • sshd up and running

The machines have one bridged network adapter eth0. The network configuration is using a static ip address.

allow-hotplug eth0
iface eth0 inet static

allow-hotplug eth0
iface eth0 inet static

pgbackrest and PostgreSQL installation

Devuan Jessie is compatible with the pgdg repositories which configuration is very well explained on The only difference is that we need to use the root user without sudo because Devuan doesn’t ship sudo by default.

Alternatively you may install sudo before proceeding.

apt-get install wget ca-certificates
wget --quiet -O - | apt-key add -
sh -c 'echo "deb $(lsb_release -cs)-pgdg main" > /etc/apt/sources.list.d/pgdg.list'
apt-get update
apt-get install pgbackrest postgresql-10 postgresql-client-10 postgresql-contrib-10

ssh configuration

Because we don’t have a for name resolution it’s a good idea to configure the hosts file on both machine in order to use names instead of ip addresses.

#db01       localhost       db01    backupsrv

#backupsrv       localhost       backupsrv    db01

On both hosts db01 and backupsrv we need to setup the cross ssh login without password for the os user postgres.

pgbackrest configuration

Now we can configure pgbackrest on both database and backup server.

The default configuration file is /etc/pgbackrest.conf

configuration for the database host db01



Quoting the pgbackrest user manual

A stanza is the configuration for a PostgreSQL database cluster that defines where it is located, how it will be backed up, archiving options, etc. Most db servers will only have one Postgres database cluster and therefore one stanza, whereas backup servers will have a stanza for every database cluster that needs to be backed up.

In the database host’s configuration file we define the stanza db01 which lists only the database path and port. The global section sets the location of the backup-host along with the username which is used for accessing the backup-host via ssh. In global we also set location of the pgbackrest executable on the remote server.

configuration for the backup server backupsrv



We still have the stanza db01 but along with the data area there are also the database host and port. The parameter retention-full tells pgbackrest the amount of full backups should be kept before the expiration.

The global section lists the repo-path location and the the backup-user and backup-cmd necessary to access the remote server if needed.

We are now ready to initialise the stanza db01 on backupsrv.

postgres@backupsrv:~$ mkdir /var/lib/postgresql/pgbackrest
postgres@backupsrv:~$ pgbackrest stanza-create --stanza db01 --log-level-console=info
2018-01-27 21:08:10.999 P00   INFO: stanza-create command begin 1.27: --db1-host=db01 --db1-path=/var/lib/postgresql/10/main --db1-port=5432 --log-level-console=info --repo-path=/var/lib/postgresql/pgbackrest --stanza=db01
2018-01-27 21:08:12.050 P00   INFO: stanza-create command end: completed successfully

PostgreSQL configuration

We now need to configure PostgreSQL for the physical backup.

We need to change the wal_level to replica, enable the archive mode and set the archive command to pgbackrest specifying the stanza’s name and the command archive-push followed by the placeholder for the archived wal file %p.

We are also changing the max_wal_senders to 3. This will be useful if we want to setup a standby server with the streaming replication.

ALTER SYSTEM SET max_wal_senders=3;
ALTER SYSTEM SET wal_level='replica';
ALTER SYSTEM SET archive_mode='on';
ALTER SYSTEM SET listen_addresses = '*';
ALTER SYSTEM SET archive_command = 'pgbackrest --stanza=db01 archive-push %p';

We now shall restart postgres to apply the changes and verify that pgbackrest works properly with the check command.

postgres@db01:~$ pg_ctlcluster 10 main stop -m fast
postgres@db01:~$ pg_ctlcluster 10 main start
postgres@db01:~$ pgbackrest check --stanza db01 --log-level-console=info
2018-01-27 21:09:55.859 P00   INFO: check command begin 1.27: --backup-cmd=/usr/bin/pgbackrest --backup-host=backupsrv --backup-user=postgres --db1-path=/var/lib/postgresql/10/main --db1-port=5432 --log-level-console=info --repo-path=/var/lib/postgresql/pgbackrest --stanza=db01
2018-01-27 21:09:57.682 P00   INFO: WAL segment 000000010000000000000002 successfully stored in the archive at '/var/lib/postgresql/pgbackrest/archive/db01/10-1/0000000100000000/000000010000000000000002-803e4b17ddc85d8aa2263f44bb1085f4a229de40.gz'
2018-01-27 21:09:57.693 P00   INFO: check command end: completed successfully

If pgbackrest is correctly configured the previous command will work on db01 and backupsrv.

performing the backup

We are now ready to to backup the database. Let’s login on backupsrv as postgres user.

pgbackrest backup --stanza db01 --log-level-console=info

The last command of the shell cast is pgbackrest info, which displays the backup status with some useful statistics like the total backup size and the compressed size within the repository.

wrap up

This basic tutorial shows a very simple way to setup a backup on a remote server. The thin I love most of pgbackrest is that the repository is self contained and allows a great flexibility when running a restore.

In the next post we’ll see the different backup strategies offered by pgbackrest and how to perform a restore.

Thanks for reading

Framed, copyright Federico Campoli