Коротко о главном
Данный материал является продолжением Быстро, дёшево и массово подстраховать базы клиентов от утери. Комплексная система удалённого резервного копирования, только для PostgreSQL. О rsync, о том, как настраивать серверную часть написано в предыдущей статье, и необходимо с ней ознакомиться, чтобы в полной мере понять данный материал. Вся статья посвящена настройке клиента на Windows (в unix-подобных гораздо сделать такой скрипт гораздо проще). Решение не требует ни наличия белых адресов со стороны клиента, ни VPN. Связь инициируется клиентом. Механизмы репликации не задействованы, и поэтому поднятие pgsql на стороне сервера не требуется. Интерес к PG усилился, после того как поступили сведения, что по производительности он уже уверенно идёт в очковой зоне противника (MSSQL 34 попугая, а Postgres 47. Не пойму где я недоглядел. (Тест Гилёва))
MSSQL - прекрасна, несколько раз тыкнул мышкой, и в рабочее время у тебя через несколько минут рабочая копия. Никого не выгнал, никому не помешал - красота. Чтобы добиться такого эффекта от PG, пришлось покубатурить, при этом решить вопрос передачи резервной копии на удалённый сервер. Ниже будет показано как я реализовал два подхода к резервному копированию PG. Подходы решают задачи архивирования БД и их восстановления. Ни то ни другое не требует прерываний в работе пользователя.
Среди поставленных задач:
- обеспечить себе удобную работу с копиями на серверах клиентов (а-ля MSSQL);
- обеспечить передачу резервных копий на свой сервер, с минимальной нагрузкой на сеть;
- поделиться материалом народом, получить советы, конструктивную критику и помощь.
Также я обновил бинарную составляющую клиентской части, а именно rsync и ssh. Файлы взяты из последней установки cygwin и будут включены в архив с составе статьи за шеккель (таки должен же шо то я с этого поиметь). Но вообще его можно не качать и собрать всё самостоятельно, всё что есть в архиве - есть в статье, остальное выдернуть из cygwin или взять например вот тут. В новых версиях cygwin есть один момент с установкой $HOME, на его решение пришлось затратить некоторое кол-во времени. (Но по большому счету можно этого не делать, и использовать какой-нибудь старый рабочий вариант).
Варианты
Без архивации WAL
Подход позволяет делать ежесуточные копии (ну вообще любой периодичности, но это на вкус и цвет) и отправлять их на удалённый резервный сервер. (только изменения). Среди минусов - невозможность восстановить копию на какой-то конкретный час, и невысокая скорость восстановления копии. Среди плюсов, простота, нет необходимости архивировать сегменты WAL, занимает меньше места и система резервного копирования и сами копии. Забегая вперёд, думаю, что это будет наиболее популярный вариант в моей практике.
Суть подхода сводится к pg_dump > pigz --resyncable. Всё просто, pigz - аналог gzip имеющий на борту --resyncable (не везде --rsyncable в gzip работает). Получается SQL-ный dump запаковывается в архив, предназначенный для передачи его rsync (блоки не перемешиваются), и одни и те же дампы или слабоизмененные доходят оч быстро. Это копия, сделанная pg_dump, так называемая логическая копия представляет собой грубо говоря сжатый SQL файл, который можно накатить на любую версию PG. После передачи файл отправляется в архив. Архив хранится n дней.
Вот так переносятся 2,4GB база, в которой немного поработали день по каналу в 2Mbit/s:
С WAL (архивация журнала транзакций)
С архивами WAL можно восстановить копию на любой момент времени. В течение дня можно передавать на удалённый сервер файлы WAL, таким образом удалённая копия будет актуальная в течение дня. Файловая копия экземпляра сервера, это тоже самое, как если бы вы остановили сервер, скопировали из него папку data и запустили в другом месте, только без остановки сервера.
Минусы:
- Нельзя сделать делать копию одной какой-то базы;
- примерно в 1,5 раза больший размер дневной копии;
- не всякая версия PG сможет проиграть вашу копию, желательно, чтобы была та же самая версия;
- громоздкость.
Плюсы
- Можно получить копию на любой момент времени;
- восстанавливается быстрее, чем логическая копия.
Мой подход
Архивирование
Раз в сутки (ночью), выполняется pg_basebackup в папку rsync\data (полная базовая копия всего экземпляра сервера). Оттуда rsync отправляет её на север в виде файлов и не удаляет. То есть всегда за счет этого занято место полного размера экземпляра(1). Я пошёл на это сознательно, так так есть шанс, что место на диске займёт что-нибудь другое и резервное копирование вообще не сработает, так же этой копией можно быстро восстанавливать текущую копию.(тем же самым rsync). После создания копии, база в виде набора файлов (несжатая) отправляется на сервер посредством rsync. Такой подход даёт минимальную нагрузку на сеть (speedup более 200(в 200 раз быстрее, чем передача всех данных)). Я пробовал экономить место отправляя tar+ --rsyncable pigz и получил (speedup около 40). После передачи данных файл сжимается и кладётся в postgres\archive
Включен режим архивирования журнала wal в папку rsync\wal_archive. Оттуда каждый час архивированные файлы wal уходят на backup-сервер.
Вот так переносятся та же 2,4GB(dt) база, по каналу 2Mbit/s, в виде копии экземпляра сервера:
Восстановление
Поскольку восстановить можно только весь экземпляр, а останавливать основной нельзя, то должен существовать второй экземпляр, назовём его текущая копия. Текущую копию необходимо инициализировать, то есть создать службу Windows(это несложно). Затем перенести из папки postgres\rsync\data, если копия сегодняшняя, либо достать из архива базовую копию за запрошенный день. И в зависимости от того, какую часть дня нужно восстановить накатывается журнал транзакций. То есть появляется ещё одна папка postgres\current_copy, которая занимает столько же места, сколько основной экземпляр(2).
Итого: Для того, чтобы функционировал мой вариант потребуется дополнительное место, занимаемое основным экземпляром PGSQL умноженным на два, и каждая дневная сжатая копия будет весить примерно в 1,5 больше, чем копия сделанная pg_dump. Это основной минус моего подхода. Ну и следствие вот такой архитектуры резервного копирования PG в том, что нельзя восстановить почасовую копию какой-то одной базы данных, восстанавливать придётся все, или нужно распределять базы по экземплярам, что ещё хуже (но возможно с привлечением какой-нибудь автоматики, написанной к примеру на 1С).
Таким образом вот этот способ не подойдёт для основного моего сервера, где множество мелких баз, к которым желательно сохранять почасовые копии, так как восстанавливать все базы для получения последней копии одной из них будет накладнее, чем pg_dump/pg_restore одной базы. Может быть будут применяться оба метода, но однозначно PosgreSQL вот именно в этом аспекте существенно неудобнее MSSQL, но дарёному слону в зубы не смотрят. PG зато выигрывает в части переноса базовой копии на удалённый backup-сервер так как полная копия MSSQL ни черта не rsyncable.
Процесс восстановления базы за сегодняшний день на 10 часов, при том, что сегодня эту базу на сегодня уже восстанавливали:
Процесс занимает около 3-х минут. Если день другой, то восстановление будет занимать около 10 минут. На этой машине, которая мне досталась, всего одна 2,4 база, SATA HDD и i5-7400.
Матчасть
Инициализация
Ставьте версию от postgrespro. Настройте PG, поменяйте pg_hba.conf так, чтобы пароль не был нужен для подключения с localhost. Определитесь с местонахождением папки с программой и архивами, в моём случае это C:\Backup, но желательно переносить её на тот диск, на котором есть место под архивы. (Заготовка для папки под статьёй)
Папка имеет следующую структуру:
C:\Backup - папка содержащаяя в себе всё (полностью готовая лежит под статьёй)
C:\Backup\home - содержит .ssh, в которой ключи от соединения rsync. .ssh должна быть доступна только пользователю, который будет запускать резервное копирование.
C:\backup\bin - содержит бинарные файлы и нижеуказанные скрипты. Должна указываться в планировщике заданий Windows в качестве рабочей при составлении заданий на резервное копирование. Запуск скриптов производить находясь в этой папке.
C:\Backup\postgres\temp - временные файлы
C:\Backup\postgres - папка для работы скриптов PostgreSQL
C:\Backup\postgres\archive - хранит резервные копии в виде сжатых файлов
C:\Backup\postgres\current_copy - используется для хранения текущей копии (вариант с арх WAL)
C:\Backup\postgres\rsync - содержит базовую копию (папка base) и журнал (wal_archive)
Последние две папки используются только в варианте с архивированием WAL.
C:\Backup\etc - содержит файл nsswitch.conf необходимый для определения $HOME.
Для того, чтобы бинарники, производные от новых cygwin могли найти $HOME необходимо заполнить файл /etc/nsswitch.conf
db_home: /cygdrive/C/Backup/home
Это укажет, что home именно там и нигде иначе, и указать cygwin где вообще находится корень, чтобы он мог найти etc/nsswitch.conf.
Windows Registry Editor Version 5.00
[HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Cygwin\setup]
"rootdir"="C:\\Backup"
Если правильно указали ключи и настроили права на C:\Backup\home\.ssh, то ssh ключи должны попасть в эту папку по нажатию C:\Backup\bin\ssh-keygen.exe.
Включите архивацию в файле postgresql.conf
wal_level = replica
archive_mode = on
archive_command = 'copy "%p" "C:\\Backup\\postgres\\rsync\\wal_archive\\%f"'
#archive_timeout=3600
archive_timeout - это время в секундах, по истечению которого файл WAL будет сформирован, даже если он не заполнен до конца. Весить и заполненный и незаполненный файл будет одинаково. Если интенсивность работы с базой невысокая, а вам необходимо иметь почасовую копию, то поставьте 3600 (час). Я для себя выключил, так как посчитал излишним.
Вариант без архивации WAL
PostgresSimple.bat
"PostgresSimple.bat backup" создаст резервную копию и отправит на удалённый сервер
"PostgresSimple.bat restore base base_copy" Сделает текущую копию базы base в base_backup
"PostgresSimple.bat restore base base_copy 2019-07-29" Восстановит копию базы base в base_backup за 2019.07.29
@echo off
SETLOCAL EnableDelayedExpansion enableextensions
rem chcp 866 >nul
rem Пути к программе
set PROGFOLDER=C:\Backup
set PROGFOLDER_UNiX=/cygdrive/C/Backup
set pgsql_folder=C:\Program Files\PostgresPro\11
rem rsync логин & сервер
set RSYNCLOGIN=someclient
set RSYNCHOST=backupserver.org
set RSYNCSSHPORT=22
set PGUSER=postgres
set PGPASSWORD=lalapass
set pg_threads=8
:: 1Mb/s = 125 KB/s
set speed=70
set keepdays=7
set HOME=%PROGFOLDER_UNiX%/home
set archive_folder=%PROGFOLDER%\postgres\archive
set archive_folder_unix=%PROGFOLDER_UNiX%/postgres/archive
SET LOGPATH=%PROGFOLDER%/backup.log
SET LOGPATH_UNiX=%PROGFOLDER_UNiX%/backup.log
SET RSYNC=%PROGFOLDER%\bin\rsync.exe
FOR /F "usebackq tokens=*" %%t IN (`powershell -NoProfile -Command "(Get-Date).ToString('yyyy-MM-dd')"`) DO (SET "Today=%%t")
if "%~1"=="" (
GOTO Usage:
)
if "%~1"=="backup" (
ECHO %DATE% %TIME% ================== Backup just have been started ============= >> %LOGPATH%
for /f "tokens=*" %%i in (postgresbases.txt) do (
set CurrentBase=%%i
"%pgsql_folder%\bin\pg_dump.exe" -U %PGUSER% -Z0 -Fc !CurrentBase! | pigz.exe --rsyncable > %archive_folder%\!CurrentBase!.pigz
IF NOT %ERRORLEVEL%==0 GOTO Error
ECHO %DATE% %TIME% ================== Backup have been done without errors ============= >> %LOGPATH%
ECHO. >> %LOGPATH%
%RSYNC% -avhP --rsh='%PROGFOLDER_UNiX%/bin/ssh.exe -p %RSYNCSSHPORT% -T -o Compression=no -x' --bwlimit=%speed% --log-file=%LOGPATH_UNiX% --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "%archive_folder_unix%/!CurrentBase!.pigz" %RSYNCLOGIN%@%RSYNCHOST%:~/
move "%archive_folder%\!CurrentBase!.pigz" "%archive_folder%\!CurrentBase!_%Today%.pigz"
)
forfiles /P "%archive_folder%" /D -%keepdays% /C "cmd /c del @path /q"
goto:eof
)
if "%~1"=="restore" (
if "%~2"=="" GOTO Usage:
if "%~3"=="" GOTO Usage:
if "%~4" equ "" (
"%pgsql_folder%\bin\dropdb.exe" -U %PGUSER% %~3
"%pgsql_folder%\bin\createdb.exe" -U %PGUSER% -T template0 %~3
"%pgsql_folder%\bin\pg_dump.exe" -U %PGUSER% -Fd -j %pg_threads% -f "%PROGFOLDER%\postgres\Temp" %~2
"%pgsql_folder%\bin\pg_restore.exe" -U %PGUSER% -c -Fd -j %pg_threads% -d %~3 "%PROGFOLDER%\postgres\Temp"
del /q "%archive_folder%\Temp\*"
for /d %%x in ("%archive_folder%\Temp\*") do @rd /s /q "%%x"
) else (
if not exist %archive_folder%\%~2_%~4.pigz (
echo File %archive_folder%\%~2_%~4.pigz is not exist.
goto :EOF
)
"%pgsql_folder%\bin\dropdb.exe" -U %PGUSER% %~3
"%pgsql_folder%\bin\createdb.exe" -U %PGUSER% -T template0 %~3
pigz.exe -dc %archive_folder%\%~2_%~4.pigz | "%pgsql_folder%\bin\pg_restore.exe" -U %PGUSER% -c -Fc -d %~3
)
goto:EOF
)
:Usage
echo Usage:
echo "PostgresSimple.bat backup" создаст резервную копию и отправит на удалённый сервер
echo "PostgresSimple.bat restore base base_copy" Сделает текущую копию базы base в base_backup
echo "PostgresSimple.bat restore base base_copy 2019-07-29" Восстановит копию базы base в base_backup за 2019.07.29
goto:EOF
:Error
echo Usage:
ECHO %DATE% %TIME% ================== Backup have been done with error ============= >> %LOGPATH%
ECHO. >> %LOGPATH%
goto:EOF
Так же необходимо создать файл C:\Backup\bin\postgresbases.txt вида:
base1
base2
Для того, чтобы знать что архивировать.
Вариант с архивацией WAL
PostgresWAL.bat
"PostgresWAL.bat backup" создаст и отправит на сервер полную резервную копию (запускается раз в сутки, ночью)
"PostgresWAL.bat backup h" отправит на сервер журнал WAL (запускается каждый час в рабочее время)
"PostgresWAL.bat init" создаст службу postgres_copy на которой будет работать скопированный экземпляр
"PostgresWAL.bat restore [день] [время]" Восстановит экземпляр сервера на указанные дату и время
[день] - today (сегодняшний день), либо дата в формате 2019-07-29
[время] - пусто - начало дня, last - конец дня, либо дата в форматe 13:00:00
Например:
"PostgresWAL.bat restore today last" - последняя сегодняшняя копия
"PostgresWAL.bat restore today" самая ранняя сегодняшняя копия
"PostgresWAL.bat restore 2019-07-29 13:00:00" конкретные время и день
@echo off
SETLOCAL EnableDelayedExpansion enableextensions
rem Пути к программам
set PROGFOLDER=C:\Backup
set PROGFOLDER_UNIX=/cygdrive/C/Backup
set pgsql_folder=C:\Program Files\PostgresPro\11
set zip=C:\Program Files\7-Zip\7z.exe
rem rsync логин & сервер
set RSYNCLOGIN=somebody
set RSYNCHOST=backupserver.org
set RSYNCSSHPORT=22
set PGUSER=postgres
set PGPASSWORD=lalapass
set pg_threads=8
:: 1Mb/s = 125 KB/s
set speed=70
set keepdays=7
SET RSYNC=%PROGFOLDER%\bin\rsync.exe
set HOME=%PROGFOLDER_UNiX%/home
set archive_folder=%PROGFOLDER%\postgres\archive
set archive_folder_unix=%PROGFOLDER_UNiX%/postgres/archive
SET LOGPATH=%PROGFOLDER%/backup.log
SET LOGPATH_UNiX=%PROGFOLDER_UNIX%/backup.log
set rsync_data_folder=%PROGFOLDER%\postgres\rsync
set rsync_data_folder_unix=%PROGFOLDER_UNIX%/postgres/rsync
set current_copy=%PROGFOLDER%\postgres\current_copy
set current_copy_unix=%PROGFOLDER_UNIX%/postgres/current_copy
FOR /F "usebackq tokens=*" %%t IN (`powershell -NoProfile -Command "(Get-Date).ToString('yyyy-MM-dd')"`) DO (SET "Today=%%t")
FOR /F "usebackq tokens=*" %%t IN (`powershell -NoProfile -Command "(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')"`) DO (SET "Yesterday=%%t")
if "%~1"=="" (
GOTO Usage:
)
if "%~1"=="backup" (
ECHO %DATE% %TIME% ================== Backup just have been started ============= >> %LOGPATH%
if "%~2"=="h" (
%rsync% -zavhP --rsh='%PROGFOLDER_UNiX%/bin/ssh.exe -p %RSYNCSSHPORT% -T -o Compression=no -x' --bwlimit=%speed% --delete --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "%rsync_data_folder_unix%/wal_archive" %RSYNCLOGIN%@%RSYNCHOST%:~/postgres
) else (
rem Сохраняем wal вчерашним днём, очищаем
"%zip%" a "%archive_folder%\%Yesterday%_wal.7z" "%rsync_data_folder%\wal_archive\*"
forfiles /P "%rsync_data_folder%\wal_archive" /C "cmd /c del @path /q"
%rsync% -zavhP --rsh='%PROGFOLDER_UNiX%/bin/ssh.exe -p %RSYNCSSHPORT% -T -o Compression=no -x' --bwlimit=%speed% --delete-before --stats --modify-window=1 --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "%rsync_data_folder_unix%/wal_archive" %RSYNCLOGIN%@%RSYNCHOST%:~/postgres
rem Очисткака каталога под резервную копию
del /q "%rsync_data_folder%\data\*"
for /d %%x in ("%rsync_data_folder%\data\*") do @rd /s /q "%%x"
call "%pgsql_folder%\bin\pg_basebackup.exe" -D "%rsync_data_folder%\data" -U %PGUSER% -X fetch --progress 3>>%LOGPATH%
IF NOT %ERRORLEVEL%==0 GOTO Error
ECHO %DATE% %TIME% Базовая копия %Today% готова >> %LOGPATH%
"%zip%" a "%archive_folder%\%Today%.7z" "%rsync_data_folder%\data\*"
%rsync% -zahP --rsh='%PROGFOLDER_UNiX%/bin/ssh.exe -p %RSYNCSSHPORT% -T -o Compression=no -x' --log-file=%LOGPATH_UNiX% --bwlimit=%speed% --delete --stats --chmod=u+rw,og-rwx,Du+rw,Dog-rwx "%rsync_data_folder_unix%/data" %RSYNCLOGIN%@%RSYNCHOST%:~/postgres
forfiles /P "%archive_folder%" /D -%keepdays% /C "cmd /c del @path /q"
)
goto:EOF
)
rem ================================================ INIT ZONE =====================================================================
if "%~1"=="init" (
"%pgsql_folder%\bin\pg_ctl.exe" register -N postgres -D "%current_copy%"
copy "%pgsql_folder%\data\postgresql.conf" "%current_copy%\postgresql.conf"
call replaceinfile.bat %current_copy%\postgresql.conf 5432 5433
call replaceinfile.bat %current_copy%\postgresql.conf archive_mode #archive_mode
call replaceinfile.bat %current_copy%\postgresql.conf archive_command #archive_command
call replaceinfile.bat %current_copy%\postgresql.conf archive_timeout #archive_timeout
call replaceinfile.bat %current_copy%\postgresql.conf wal_level #wal_level
goto:EOF
)
rem ================================================ RESTORE ZONE ==================================================================
if "%~1"=="restore" (
if "%~2"=="" GOTO Usage:
rem Тормозим сервис
net stop postgres_copy
rem Если today, тогда берём из rsync (сегодняшняя копия)
if "%~2"=="today" (
"%rsync%" -avhP --delete --stats "%rsync_data_folder_unix%/data/" "%current_copy_unix%" --inplace --exclude="postgresql.conf"
set restorewalfolder=%rsync_data_folder%\wal_archive
set restore_date=%Today%
) else (
set restorewalfolder=%PROGFOLDER%\postgres\temp
set restore_date=%~2
set recovery_end_command=
if "%~3" neq "" (
rem восстановление WAL
"%zip%" x "%archive_folder%\!restore_date!_wal.7z" -o"!restorewalfolder!"
set recovery_end_command=forfiles /P "!restorewalfolder!" /C "cmd /c del @path /q" && echo "Ready to connect"
)
move %current_copy%\postgresql.conf %PROGFOLDER%\postgres\temp\postgresql.conf
rem очистка папки с данными
del /q "%current_copy%"\*
for /d %%x in ("%current_copy%\*") do @rd /s /q "%%x"
rem восстановление папки с данными
"%zip%" x "%archive_folder%\!restore_date!.7z" -o"%current_copy%"
move %PROGFOLDER%\postgres\temp\postgresql.conf %current_copy%\postgresql.conf
)
rem Если параметр не time и не last, то восстанавливаем на начало дня (не подгружаем wal)
if "%~3" equ "last" (
set restoretime=23:59:59
) else (
set restoretime=%~3
)
set restorewalfolder_double=!restorewalfolder:\=\\!
echo restore_command='copy "!restorewalfolder_double!\\%%f" "%%p"' > %current_copy%\recovery.conf
echo recovery_target_action=promote >> %current_copy%\recovery.conf
if "%~3" equ "" (
echo recovery_target='immediate' >> %current_copy%\recovery.conf
) else (
echo recovery_target_time='!restore_date! !restoretime!' >> %current_copy%\recovery.conf
)
echo recovery_end_command='!recovery_end_command!' >> %current_copy%\recovery.conf
net start postgres_copy
echo "PostgreSQL has been started. Please wait while recovery.conf became renamed recovery.done in %current_copy%"
goto:EOF
)
:Usage
echo Usage:
echo "PostgresWAL.bat backup" создаст и отправит на сервер полную резервную копию
echo "PostgresWAL.bat backup h" создаст и отправит на сервер журнал WAL
echo "PostgresWAL.bat init" создаст службу postgres_copy на которой будет крутиться скопированный экземпляр
echo "PostgresWAL.bat restore [день] [время]" Восстановит экземпляр сервера на указанные дату и время
echo [день] - today (сегодняшний день), либо дата в формате 2019-07-29
echo [время] - пусто - начало дня, last - конец дня, либо дата в форматe 13:00:00
echo "Например:"
echo "PostgresWAL.bat restore today last" - последняя сегодняшняя копия
echo "PostgresWAL.bat restore today" самая ранняя сегодняшняя копия
echo "PostgresWAL.bat restore 2019-07-29 13:00:00" конкретные время и день
goto:EOF
:Error
echo Usage:
ECHO %DATE% %TIME% ================== Backup have been done with error ============= >> %LOGPATH%
ECHO. >> %LOGPATH%
goto:EOF
Канэс
На сегодняшний день мной ещё не накоплен ни опыт использования механизмов, указанных в статье, ни эксплуатации postgres в боевых условиях, почти нет телеметрии, достаточной для того, чтобы её показать. Отталкиваясь статьи планирую внедрять PG по мере необходимости и добывать драгоценный опыт. Кто использует PG, напишите пожалуйста, есть ли в скриптах или методике ошибки, которые могут сыграть роковую роль? На что стоит обратить внимание? Как бы вы сделали?
Напрягает кодировка логов после PGSQL - не знаю что с ней делать, некритично, но проблема есть. Возможно стоит доработать скрипт отправкой email, если что-то не так. Пока на данный момент угроблено огромное количество времени и уже пока завязывать исследования до лучших времён.
Да, есть ещё интересные инструменты, в частности Barman и pg_probackup. Я узнал о них уже после того как потратил много времени на классические варианты это во-первых, во-вторых эти инструменты не совсем мне подходят.
Barman требует двустороннего контакта с клиентом и таким образом от клиента требуется либо белый адрес и NAT либо VPN. Я не могу на такое пойти, так как хочу массово сохранять копии, а такие усложнения ставят крест на этих планах. Pg_probackup при поверхностном знакомстве мне очень понравился, но не ясно как переносить изменения на удалённый rsync сервер. Только раскрывать последний архив и отправлять его таким образом, что тоже самое. В общем не стал, у кого есть время может и попробует.
Огромное спасибо блогу http://renbuar.blogspot.com за его существование. Из него я очень многое для себя подчекрнул.