Настроим 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:

Команда lsblk чтобы узнать имеющиеся разделы дисков

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

blkid /dev/sda1

Пример вывода команды blkid:

Как узнать UUID раздела диска

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

blkid -U "cb541d40-4aad-4155-b1a3-c1294c7bbd1d"

Пример вывода команды:

Как узнать раздел диска по заданному UUID

Т.е. сохранять 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 (т.е. локальных соединений):

Конфигурационный файл pg_hba.conf

Перезапускаем 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 базы.

Как это может помочь бизнесу?

Когда в базе данных какие-то важные для бизнеса данные, то бекап базы данных — это жизненно необходимая вещь!

Комментарии

Добавить комментарий

Этот сайт защищен reCAPTCHA, и к нему применяются Google Политика конфиденциальности и Условия использования.

Войти

Зарегистрироваться

Сбросить пароль

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