Эта короткая статья поможет вам настроить автоматическое создание бэкапов вашей базы PostgreSQL с помощью утилиты pg_basebackup.

На сервере, где размещена БД

Для работы нужно на сервере, где находится база:

Создать пользователя backuper:

sudo -u postgres createuser -U postgres backuper -P -c 5 --replication

Отредактировать конфиг:

sudo nano /etc/postgresql/12/main/pg_hba.conf

Добавить:

host    replication     all             IP_СЕРВЕРА/32        trust

Где вы указываете IP сервера, где будете хранить бэкапы.

Примечание: trust - делает соединение с указанного ip доверенным и позволяет войти под backuper. Можно использовать md5, тогда нужно настроить доступ с паролем в .pgpass https://www.postgresql.org/docs/9.2/libpq-pgpass.html

Отредактировать конфиг:

sudo nano /etc/postgresql/12/main/postgresql.conf

Добавить:

listen_addresses = '*'

wal_keep_segments = 64

Перезагрузить postgresql:

sudo service postgresql restart

Сервер, где будут храниться бэкапы

Для начала, необходимо чтобы на сервере где будут храниться бэкапы была установлена точно такая же версия PostgreSQL, которая используется в вашем проекте.

Затем следует настроить cron:

1 1 * * * pg_basebackup -F t -h хост_вашего_проекта -p 5432 -U backuper -X f -D ~/backup/project-prod/$(date +\%d-\%b-\%Y) -z > ~/backup.log

1 1 * * * find /var/lib/postgresql/backup/project-prod/ -maxdepth 1 -mtime +4 -exec rm -rf {} \;

Первая команда создает бэкап, вторая удаляет старые ненужные бекапы. В данном примере, оставляются только 4 последних бэкапа.

Как восстановить бекап

  • На сервере бекапов скопировать бекап на продовый (или иной) сервер:
scp /var/lib/postgresql/backup/project-prod/15-Sep-2022/base.tar.gz www-php@[ip адрес]:/tmp
  • Распаковать архив:
gunzip /tmp/base.tar.gz
  • Остановить postgres:
sudo service postgresql stop
  • Проверить, что действительно остановлен:
systemctl status postgresql.service
  • Подключить под postgres пользователем:
sudo su - postgres
  • Переименовить каталог или сделать куда-нибудь копию:
/var/lib/postgresql/12/main
  • Заменить этот каталог данными из бекапа:
tar -xf /tmp/base.tar -C /var/lib/postgresql/12/main
  • Запустить postgres:
sudo service postgresql restart
  • Проверить статус:
systemctl status postgresql.service