Top.Mail.Ru

Автоматический бэкап базы данных PostgreSQL | pg backup database

Автоматический бэкап базы данных PostgreSQL | pg backup database

Создание резервных копий дело крайне важное, так как может помочь вам в критической ситуации и сейчас мы рассмотрим один скрипт, благодаря которому можно автоматически создавать backup базы данных PostgreSQL и автоматически удалять устаревшие резервные копии.

Запись видеоурока во ВКонтакте

Запись видеоурока на RuTuBe

Запись видеоурока на YouTuBe



P.S. Напоминаем, что сейчас идет набор в группу обучения "Linux: установка, настройка и администрирование"

Подробности здесь 👉 https://pages.it-skills.online/luna-linux-ustanovka-nastrojka-administrirovanie.html

Создадим файл скрипта, располагаться он будет у нас в системной директории bin

cd \bin

touch backup_db_postgresql.sh

sudo !!

nano backup_db_postgresql.sh

sudo !!

 

Вставляем текст скрипта:

#!/bin/bash

set -euo pipefail

 

DB_NAME="test_demo"

BACKUP_DIR="/1CBase"

DATE_SUFFIX=$(date +%d_%H-%M-%S)

FILENAME="$BACKUP_DIR/${DB_NAME}_$DATE_SUFFIX.dump"

 

# Создание дампа

 

pg_dump -U postgres -h localhost -v -F c -b -f "$FILENAME" $DB_NAME

 

В данном скрипте, для указания пути и имени файла резервной копии, будем использовать переменные, поэтому, для своей ситуации вы можете изменить путь назначение и имя базы данных на своё.

Ctrl + O, Ctrl + X - сохраним изменения и выйдем из текстового редактора

Посмотрим, был ли действительно создан данный файл скрипта?

ll | grep backup_db_postgresql.sh

Посмотрим его содержание

cat backup_db_postgresql.sh

Да все верно, изменения сохранились. Однако, мы видим, что данный скрипт не является исполняемым, поэтому сделаем его таковым и предоставим к нему полные права

У нас здесь права 644, значит нужно сделать 744, чтобы только владелец мог его запускать

sudo chmod 744 backup_bd_postgresql.sh

ll | grep backup_db_postgresql.sh

-rwxr--r--  1 root root         699 мая 26 13:42 backup_db_postgresql.sh *

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

sudo ./backup_db_postgresql.sh

Тут у нас запрашивается пароль пользователя, под которым мы подключаемся к базе данных, чтобы сделать бэкап, т.е. пароль от пользователя postgres

Так как мы указали в скрипте параметр -v (visual) то мы визуально видим процесс создания резервной копии.

Процесс завершен, давайте посмотрим содержание каталога 1CBase

cd /1CBase/

ll

Видим, что появился файл

test_demo_27_09-40-33.dump

 

Теперь, необходимо чтобы задание резервного копирования выполнялось автоматически, для этого создадим задание в планировщике CRON

sudo nano /etc/crontab

Добавим строчку

 

*/5 * * * * root /bin/backup_db_postgresql.sh

 

Выполнение задания сделаем каждые 5 минут, чтобы побыстрее проверить его работоспособность, потом изменим на нужный нам период времени.

Ctrl + O, Ctrl + X - сохраним изменения и выйдем из текстового редактора

Дожидаемся, пока задание будет выполнено.

Задание уже должно было быть выполнено, однако, файл резервной копии имеет размер 0 байт, а это значит, что резервная копия была создана не корректно!

Узнать бы, в чем причина, но мы не можем увидеть логи, выполнения задания, поэтому мы реализуем такую возможность, чтобы понять, в чем причина, ведь в процессе выполнения задания должна появиться какая-то дополнительная информация.

sudo nano /etc/crontab

Добавим к заданию следующий параметр

*/5 * * * * root /bin/backup_db_postgresql.sh >> /1CBase/backup_db_postgresql.log 2>&1

Данный параметр говорит о том, что в процессе выполнения задания, вся дополнительная информация будет записываться в указанный нами файл

Видим, что файл backup_db_postgresql.log появился и он не пустой, посмотрим его содержимое

Кстати, если вы хотите не просто познакомиться с Linux, а действительно освоить эту мощную и гибкую операционную систему то приглашаем вас на наше обучение, которое позволит получить базовые знания и углубиться в установку, настройку и администрирование Linux. Подробности по ссылке в описании!

cat backup_db_postgresql.log

Пароль:

pg_dump: ошибка: подключиться к серверу "localhost" (127.0.0.1), порту 5432 не удалось: fe_sendauth: no password supplied

Данное сообщение говорит о том, что при выполнении скрипта запрашивается пароль, для подключения к базе и так как пароль получен не был, то и подключиться к базе не получилось.

Данную проблему можно решить следующим способом, в профиле пользователя, под которым запускается скрипт, создается определенный файл, в котором содержатся данные для подключения к базе данных.

Так как мы запускаем скрипт от root-а, то в его домашнем каталоге должен располагаться файл с параметрами подключения.

sudo touch /root/.pgpass

sudo nano /root/.pgpass

localhost:5432:test_demo:postgres:password          

Ctrl + O, Ctrl + X - сохраним изменения и выйдем из текстового редактора

Все равно файл резервной копии создается пустым, еще раз посмотрим что у нас в логе выполнения задания

cat backup_db_postgresql.log

ПРЕДУПРЕЖДЕНИЕ: к файлу паролей "/root/.pgpass" имеют доступ все или группа; права должны быть u=rw (0600) или более ограниченные

Так, давайте посмотрим, какие права у нас назначились для файла паролей.

sudo ls -lah /root

-rw-r--r--  1 root      root        41 мая 27 10:11 .pgpass

У него права 644, давайте их изменим

sudo chmod 600 /root/.pgpass

sudo ls -lah /root

ll

Вот, теперь мы видим, что файл стал увеличиваться в размере, а значит сейчас действительно идет процесс создания резервной копии.

cat backup_db_postgresql.log

Мы видим, что теперь у нас тут много информации, которая отображается в процессе создания резервной копии, поэтому давайте подправим скрипт, чтобы не было столь подробной информации.

sudo nano /bin/backup_db_postgresql.sh

и удалим ключ -v из строки создания резервной копии

Ctrl + O, Ctrl + X - сохраним изменения и выйдем из текстового редактора

Теперь настроим нужный нам период создания резервной копии, допустим каждый день в 3 часа ночи

sudo nano /etc/crontab

0 3 * * * root /bin/backup_db_postgresql.sh >> /1CBase/backup_db_postgresql.log 2>&1

А в следующем видео мы доработаем скрипт, чтобы выполнялось автоматические удаление старых резервных копий.