Передача баз PostgreSQL на удалённый сервер резервных копий, удобное восстановление. Почасовой и ежесуточный вариант. В общем, ещё один скрипт

27.05.20

База данных - Архивирование (backup)

Скрипты сохраняют резервную копию в архив и отправляют на удалённый rsync сервер самым оптимальным образом. Вы без проблем сделаете текущую резервную копию или восстановите за любой другой день, не выгоняя пользователей. Есть вариант с восстановлением на любое время. Не нужны ни белые IP адреса клиентов с NAT, ни VPN. Максимально облегчённый вариант, позволит вам массово подстраховать базы клиентов, и стоить вам будет это почти ничего.

Скачать файлы

Наименование Файл Версия Размер
Шаблон-папка Backup. Всё необходимое для резервного копирования PostgreSQL на удалённый сервер.
.7z 3,87Mb
10
.7z 1.0 3,87Mb 10 Скачать

Коротко о главном

Данный материал является продолжением Быстро, дёшево и массово подстраховать базы клиентов от утери. Комплексная система удалённого резервного копирования, только для 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 за его существование. Из него я очень многое для себя подчекрнул.

postgres rsync резервное копирование backup postgre

См. также

Журнал изменений с восстановлением состояния ссылочных объектов и архивацией по HTTP / COM (расширение + конфигурация, 8.3.14+, ЛЮБАЯ конфигурация)

Архивирование (backup) Журнал регистрации Поиск данных Платформа 1С v8.3 Управляемые формы Конфигурации 1cv8 1С:Управление торговлей 11 Платные (руб)

База данных «сама» меняет данные в документах/справочниках? Тогда данный журнал изменений для Вас! Практически не влияет на скорость записи объектов за счет быстрого алгоритма! Скорость работы почти в 2 раза выше типового механизма "История изменений"! Позволяет следить за изменениями и удалением в любых ссылочных объектах конфигурации, с возможностью архивации по HTTP(!) или COM, и сверткой данных. А так же, может восстановить состояние реквизитов (значения) до момента изменения или удаления объекта из базы. Есть ДЕМО-база где можно самостоятельно протестировать часть функционала! Работает на любых платформах выше 8.3.14+ и любых конфигурациях! Версия 3.1 от 24.08.2023!

19200 руб.

15.05.2017    42522    10    24    

38

BackUPv8 - система резервного копирования баз 1С

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Платные (руб)

Автоматическое создание копий файловых и серверных информационных баз 1С Предприятие 8 и размещение копий в облаке Яндекс.Диск, локальном или сетевом ресурсе.

1200 руб.

03.09.2014    14733    13    6    

18

Резервное копирование журнала транзакций, наконец-то!

Архивирование (backup) Администрирование СУБД Россия Бесплатно (free)

Постараюсь объяснить, зачем нужно резервное копирование именно журнала транзакций, а не только базы данных, и почему я словно сбросил груз, настроив его - как, покажу, естественно. Кстати, будут скрипты T-SQL (с подробными комментариями) - отличный способ сделать администрирование базы более уютным.

04.12.2023    5873    n_mezentsev    15    

25

Резервное копирование и восстановление 1С баз на PostgreSQL в Windows с помощью pgAdmin, bat-файлов и планировщика

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Бесплатно (free)

В данной инструкции будет описано, как с помощью pgAdmin, bat-файлов и планировщика заданий Windows организовать резервное копирование, восстановление и хранение копий баз данных.

07.10.2022    19827    sapervodichka    36    

142

Архивирование базы в dt и дамп postgres

Архивирование (backup) Платформа 1С v8.3 Конфигурации 1cv8 Россия Абонемент ($m)

Захотелось клиентам выгрузку архива баз, и выгрузку в дт, готовые скрипты с сети не заработали. Может, кому-то поможет. Релиз 8.3.18.1741.

1 стартмани

25.08.2022    4718    2    Gnom-Gluck    6    

6

Утилита копирования баз данных 1С

Архивирование (backup) Платформа 1С v8.3 Абонемент ($m)

Небольшая утилита для копирования файловых баз данных 1С.

1 стартмани

02.06.2022    4236    3    Giblarium    12    

5
Оставьте свое сообщение