
Автоматический бэкап базы данных 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
А в следующем видео мы доработаем скрипт, чтобы выполнялось автоматические удаление старых резервных копий.