Настроим PostgreSQL backup на ОС Linux (Debian).
Техническое задание
- PostgreSQL backup нужно делать автоматически по заданию cron каждый день в 4 утра;
- бекап нужен только одной базы PostgreSQL с именем db1c, владелец которой — пользователь postgres;
- хранить backup нужно 30 дней;
- сохранять бекапы нужно на отдельный раздел диска, идентификатор которого UUID=»cb541d40-4aad-4155-b1a3-c1294c7bbd1d»;
- перед сохранением бекап следует архивировать с использованием алгоритма gzip;
- имя файла с бекапом должно быть вида db1c.pgsql.ГГГГММДД.gz, где ГГГГ — это 4 цифры года бекапа, ММ — это две цифры месяца бекапа, ДД — это две цифры дня бекапа.
Разделы дисков и их идентификаторы UUID
Чтобы узнать, какие разделы дисков имеются в системе, введем команду:
lsblk
Пример вывода команды lsblk
:

Чтобы узнать идентификатор (UUID) раздела диска (sda1), введем команду:
blkid /dev/sda1
Пример вывода команды blkid
:

Чтобы узнать раздел диска, соответствующий заданному UUID (UUID=»cb541d40-4aad-4155-b1a3-c1294c7bbd1d»), введем команду:
blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"
Пример вывода команды:

Т.е. сохранять PostgreSQL backup будем на раздел /dev/sda1, который будем монтировать в директорию /media/files/ файловой системы.
Bash-скрипт для PostgreSQL backup
Создаем файл backupPostgresql.sh:
touch backupPostgresql.sh
Разрешаем владельцу выполнение файла backupPostgresql.sh:
chmod u+x backupPostgresql.sh
Добавляем в файл backupPostgresql.sh следующий текст:
#! /bin/bash
DEVICE=`/sbin/blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"`
MOUNTED=`/bin/df -h | /bin/grep /media/files | /usr/bin/wc -l`
FILENAME=`/bin/date +/media/files/db1c.pgsql.%Y%m%d.gz`
if [ $MOUNTED -eq 0 ]
then
/bin/mount $DEVICE /media/files/ && MOUNTED=1
fi
if [ $MOUNTED -eq 1 ]
then
/opt/pgpro/1c-14/bin/pg_dump --username=postgres --dbname=db1c | /bin/gzip > $FILENAME && /bin/ls -t /media/files/db1c.pgsql* | /usr/bin/tail -n+30 | /usr/bin/xargs -I{} /bin/rm {};
/bin/umount $DEVICE
fi
#! /bin/bash
— это путь к интерпретатору — программе, которая преобразует код нашего скрипта в машинопонятные инструкции;
DEVICE=`/sbin/blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"`
— результат выполнения команды /sbin/blkid -U «cb541d40-4aad-4155-b1a3-c1294c7bbd1d» сохраняем в переменную DEVICE. В моем случае в переменной DEVICE окажется строка /dev/sda1;
MOUNTED=`/bin/df -h | /bin/grep $DEVICE | /usr/bin/wc -l`
— результат выполнения команды /bin/df -h | /bin/grep $DEVICE | /usr/bin/wc -l сохраняем в переменной MOUNTED. В моем случае в MOUNTED будет 0, если раздел диска /dev/sda1 не примонтирован, и в переменной MOUNTED будет 1, если раздел диска /dev/sda1 был ранее примонтирован в директорию /media/files/;
FILENAME=`/bin/date +/media/files/db1c.pgsql.%Y%m%d.gz`
— в переменной FILENAME сохраняем полное имя файла бекапа в требуемом по ТЗ формате. Например, у меня в переменной FILENAME будет строка /media/files/db1c.pgsql.20230125.gz;
Если переменная MOUNTED равна 0, тогда:
/bin/mount $DEVICE /media/files/
— монтируем раздел диска в /media/files/;
Если переменная MOUNTED равна 1, тогда:
/opt/pgpro/1c-14/bin/pg_dump --username=postgres --dbname=db1c | /bin/gzip > $FILENAME
— создаем PostgreSQL backup базы db1c, владельцем которой является пользователь postgres, архивируем и сохраняем в /media/files/db1c.pgsql.ГГГГММДД.gz;/bin/ls -t /media/files/db1c.pgsql* | /usr/bin/tail -n+30 | /usr/bin/xargs -I{} /bin/rm {}
— удаляем старые бекапы базы, оставляем только 30 самых свежих;- объединение команд через
&&
означает, что вторая команда будет выполняться только в случае успешного завершения первой команды; /bin/umount $DEVICE
— отмонтируем раздел диска.
Запуск pg_dump без ввода пароля
Чтобы команда pg_dump (см. предыдущий раздел) запускалась без ввода пароля пользователя postgres, нужно отредактировать конфигурационный файл /var/lib/pgpro/1c-14/data/pg_hba.conf, выставить trust (т.е. доверять) для всех local (т.е. локальных соединений):

Перезапускаем PostgreSQL:
systemctl restart postgrespro-1c-14
Автоматический бекап
Под пользователем root откроем для редактирования конфигурационный файл crontab, в котором хранятся задания cron:
crontab -e
Добавим строку:
0 4 * * * /path/to/file/backupPostgresql.sh
где /path/to/file/
— это полный путь к bash-скрипту backupPostgresql.sh.
Все! Наш bash-скрипт будет запускать автоматически каждый день в 4 утра.
Выводы
С помощью маленького bash-скипта и записи в cron мы автоматизировали создание бекапа для PostgreSQL базы.
Как это может помочь бизнесу?
Когда в базе данных какие-то важные для бизнеса данные, то бекап базы данных — это жизненно необходимая вещь!
Комментарии