Инкрементальный бэкап в PostgreSQL 17

Ну вот оно!

Долгожданное обновление в PostgreSQL 17 теперь умеет штатно создавать инкрементные (инкрементальные) бэкапы!

Да, то что MS SQL умел нверное со времен когда «колесо» придумало человека )

Согласен! Лучше поздно, чем никогда.

Мы не будем сильно углубляться в теорию, как и в очевидные выгоды такого способа резервного копирования.

Понятно, что преимущество сделать копию только изменений вместо создания снова и снова ежедневно полной копии кластера будет очевидным.

Вы экономите место на диске скорость в десятки раз выше и тому подобное.

Наша задача в сегодняшней статье разобраться, как это по факту работает, как создать такой бэкап и восстановится из него.

 

Что ж тянуть не будем, приступаем к работе!

У нас есть тестовая база БП 3.0 и Ubuntu server 24.04, где уже установлен PostgreSQL 17 от Postgres Pro для 1С.

Документ Требование-накладная

Поставленная задача:

Создать полную резервную копию кластера (Где есть база БП 3.0 и восстановится на среду, используя инкременты)

На первом шаге нам надо включить WAL Summary в PostgreSQL 17

Postgres 17 поставляется с новым фоновым рабочим процессом, называемым процессом WAL summaryer , который создает «сводки» файлов WAL в каталоге pg_wal/summaries .

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

 

Включение WAL Summary в PostgreSQL

Для активации summarize_wal и перезагрузки конфигурации PostgreSQL выполняем:

Входим в psql под пользователем postgres

sudo -u postgres psql

Включаем summarize_wal

ALTER SYSTEM SET summarize_wal = on;

Затем достаточно перезагрузить саму конфигурацию без перезагрузки PostgreSQL !

Перезагружаем конфигурацию PostgreSQL

SELECT pg_reload_conf();

ALTER SYSTEM SET summarize_wal = on

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

Создаём директории:

sudo mkdir -p /backups/fullbackup

sudo mkdir -p /backups/{incr_Monday,incr_Tuesday,incr_Wednesday,incr_Thursday,incr_Friday}

Устанавливаем правильные права для них:

sudo chown -R postgres:postgres /backups && sudo chmod -R 755 /backups

Запускаем первое полное резервное копирование:

Выполняем его с помощью pg_basebackup:

sudo -u postgres pg_basebackup -D /backups/fullbackup

Проверяем содержимое каталога с полным бэкапом:

ls /backups/fullbackup
sudo du -sh /backups/fullbackup

sudo du -sh backups fullbackup

И посмотрим его размер:

Полный размер бэкапа 587 мб

Отлично!

Создаем инкрементальные бэкапы

Инкрементальные бэкапы мы делаем по ночам, всю рабочую неделю каждый день:

sudo -u postgres pg_basebackup --incremental=/backups/fullbackup/backup_manifest -D /backups/incr_Monday/
sudo -u postgres pg_basebackup --incremental=/backups/incr_Monday/backup_manifest -D /backups/incr_Tuesday/
sudo -u postgres pg_basebackup --incremental=/backups/incr_Tuesday/backup_manifest -D /backups/incr_Wednesday/
sudo -u postgres pg_basebackup --incremental=/backups/incr_Wednesday/backup_manifest -D /backups/incr_Thursday/
sudo -u postgres pg_basebackup --incremental=/backups/incr_Thursday/backup_manifest -D /backups/incr_Friday/

В понедельник:

Первый документ в понедельник

Затем также во вторник, среду, четверг, и пятницу (11,12,13,14,15 число)

Проверим размер инкрементальных бэкапов, что мы создали например в понедельник (Инкременты также включают кластер)

du -sh /backups/incr_Monday/

Инкрементный бэкап - Понедельник

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

Рекомендую также создать скрипт для удаления старых бэкапов, чтоб не забивать диск, всегда перед первым полным бэкапом (Предварительно копируя его и инкременты в облако).

 

ВОССТАНОВЛЕНИЕ:

И так, чтоб восстановится из бэкапа если наступит такая необходимость мы должны снова собрать в один полный бэкап наши инкременты. (Присоединив их к первому полному) до того момента на который хотим восстановится, например если нас интересует среда делаем так:

Создаём директорию для объединённого бэкапа

sudo mkdir -p /combinebackup

Устанавливаем правильные права:

sudo chown -R postgres:postgres /combinebackup

sudo chmod -R 755 /combinebackup

Объединяем полный и инкрементальные бэкапы (До среды включая):

Доступно после бесплатной регистрации
sudo -u postgres pg_combinebackup /backups/fullbackup/ /backups/incr_Monday/ /backups/incr_Tuesday/ /backups/incr_Wednesday/ -o /combinebackup Проверяем содержимое объединённого бэкапа: ls /combinebackup sudo du -sh /combinebackup Остановка PostgreSQL перед восстановлением: sudo systemctl stop postgrespro-1c-17 Копируем файлы из объединённого бэкапа в директ

Подробное видео о выше проделаной работе смотрите здесь >>>

Полный подробный курс по Администрированию PostgreSQL и 1С здесь >>>

4 комментария к “Инкрементальный бэкап в PostgreSQL 17”

  1. Добрый день извиняюсь.

    А вот тут «Рекомендую также создать скрипт для удаления старых бэкапов, чтоб не забивать диск, всегда перед первым полным бэкапом (Предварительно копируя его и инкременты в облако).»

    То есть удалять нужно содержимое папки fulbackup полные бекапы или инкрементальные?
    И вообще получается вот эту команду также надо в cron вешать?
    sudo -u postgres pg_basebackup -D /backups/fullbackup

    Немного что то не допонял, что удалять и какие именно бекапы? и как все это запускать автоматически?

Оставьте комментарий

База знаний 1С