Архивирование всех баз PostgreSQL на Windows

Задумал я архивировать базы PostgreSQL…

Желание похвальное. Тем более, что может статься, что когда-нибудь кто-нибудь «грохнет» свою базу, а тут я, как чёрт из табакерки, с архивной копией… Рыцарь в белых доспехах, да и только!!!

🙂

Надо сказать, что PostgreSQL у меня работает на Windows Server, обслуживает базы 1С…

Появились у меня мысли:

  • мне лень;
  • мне лень менять скрипт архивирования баз PostgreSQL в случае добавления/удаления баз;

🙂

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

Вот его текст:

@echo off

rem Скрипт архивирования всех баз PostgreSQL

rem Путь к исполняемым файлам PostgreSQL
set PGBINPATH=C:\Program Files\PostgreSQL\9.6.7-1.1C\bin

rem Путь к папке с архивами
set BACKUPPATH=F:\Program Files\Postgres

rem Переходим в папку с исполняемыми файлами PostgreSQL
c:
cd «%PGBINPATH%»

rem Получаем список всех баз PostgreSQL

psql -A -q -t -U postgres -c «select datname from pg_database» > C:\Windows\Temp\pgbases.txt

rem для каждой БД создадим собственную поддиректорию в BACKUPPATH

for /F %%B in ( C:\Windows\Temp\pgbases.txt ) do ( mkdir «%BACKUPPATH%\%%B» )

rem делаем архивную копию каждой базы

for /F %%B in ( C:\Windows\Temp\pgbases.txt ) do ( pg_dump -U postgres %%B > «%BACKUPPATH%\%%B\%%B-%date%-%time:~0,2%.%time:~3,2%.%time:~6,2%.dump» )

В папке с архивами для каждой базы создаётся своя директория, в которую-то и сохраняются архивные копии.

PS.

Слишком старые архивные копии удаляются отдельным скриптом. 🙂

PPS.

В Linux я создал файл ~/postgresbackup.sh со следующим содержимым

#!/bin/bash

PATH=»/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin»

myfile=»/root/pgbases.txt»
backupdir=»/mnt/raid5/backup/postgres»
mydate=`date`

# Получаем список всех баз PostgreSQL
psql -A -q -t -U postgres -c «select datname from pg_database» > $myfile

for var in $(cat $myfile)
do
echo «BackUp DB $var»

# для каждой БД создадим собственную поддиректорию
mkdir -p «$backupdir/$var»

# делаем архивную копию каждой базы
pg_dump -U postgres $var > «$backupdir/$var/$mydate.dump»

done