Photo by Caspar Camille Rubin on Unsplash
Photo by Caspar Camille Rubin on Unsplash

Всем привет! Я бы сказал что эта статья cookbok по которому можно создать простое и эффективное решение для создания бэкапов базы данных.

Казалось бы довольно очевидная задача но тем не менее когда я хотел её решить столкнулся с множеством проблем. Готовые бесплатные решения в большинстве своем направленны на управления кластерами или не поддерживаются на ARM машинах.

В ходе исследования был собран следующий рецепт с помощью которого можно делать бэкапы и получать уведомления по почте, вам даже не понадобиться свой smtp достаточно gmail аккаунта.

Скрипт создания бэкапов

# ~/pg_backup.sh
db_name=dbname
db_user=dbuser
db_host=host
backupfolder=~/postgresql/backups 
recipient_email=youremail@example.ru
# Сколько дней хранить файлы
keep_day=30
sqlfile=$backupfolder/database-$(date +%d-%m-%Y_%H-%M-%S).sql
zipfile=$backupfolder/database-$(date +%d-%m-%Y_%H-%M-%S).zip
mkdir -p $backupfolder

if pg_dump -U $db_user -h $db_host $db_name > $sqlfile ; then
   echo 'Sql dump created'
else
   echo 'pg_dump return non-zero code' | mailx -s 'No backup was created!' $recipient_email
   exit
fi

if gzip -c $sqlfile > $zipfile; then
   echo 'The backup was successfully compressed'
else
   echo 'Error compressing backup' | mailx -s 'Backup was not created!' $recipient_email
   exit
fi
rm $sqlfile 
echo $zipfile | mailx -s -a $sqlfile 'Backup was successfully created' $recipient_email
 
find $backupfolder -mtime +$keep_day -delete

Делаем файл исполняемым

chmod +x pg_backup.bash

pgpass

Что бы pg_dump не запрашивал пароль создаем .pg_pass в домашней директории пользователя в формате

hostname:port:database:username:password

И устанавливаем корректные права

chmod 600 ~/.pgpass

запуск по расписанию

добавляем pg_backup.bash в cron. Каждый день в 5 утра мне кажется оптимальным вариантом. crontab -e и добавляем туда строчку. Важно, в кроне нужно указать полный путь.

0 5 * * 0-6 /home/www/pg_backup.bash

Настраиваем отправку писем

Доводилось ли вам отправлять письма из CMD линукс? Мне нет, но эта возможность радует своей простотой, настолько просто что даже сложно

sudo apt-get update 
sudo apt-get install postfix mailutils ssmtp

Настраиваем smtp. Тут можно использовать обычную гугл почту

#/etc/ssmtp/ssmtp.conf
root=your@email.com
mailhub=smtp.gmail.com:587
AuthUser=your@gmail.com
AuthPass=yourGmailPass
UseTLS=YES
UseSTARTTLS=YES

Итоги

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

P.S.

Не ожидал что статья вызовет бурное обсуждение. Спасибо всем за коментарии и замечания. Сообвстено хотел бы прояснить для чего всё это было нужно.

Цели на самом деле прагматичные, я использую бесплатное облако на оракле, они дают вполне неплохое облако в бесплатно пользование размером 4 ядра 24 гига за 0р в месяц, но ядра армовские, некоторые готовые решения просто не имеют пакетов под арм. А мне бы хотелось быть увереным что моя не нагруженная и не очень большая база делает резервные копии и сохраняется где то отдельно от бесплатного оракла. Плюс уведомления на почту, если что то пойдёт не так.

Ни коим образом не претендую enterpriseность. Это простое решение для ненагруженной базы. Что бы избежать излишних уровней абстракций в виде кластеров или реплик с WAL. Всё сделано предельно просто и в лоб. Излишни они конечно только в контексте моих задач, так база более чем справляется со своей нагрузкой и будет это делать в обозримом будущем, а ради резервного копирования разворачивать масштабные системы, овчинка выделки не стоит)

Комментарии (29)


  1. RekGRpth
    15.12.2021 10:26
    +2

    дамп - это вроде не бэкап?


    1. Anthrax_Beta
      15.12.2021 10:42

      совсем не бэкап :)


  1. unseriously
    15.12.2021 10:31
    +2

    Статья-то может даже и полезна будет, но "дешего", серьезно? Налего, напраго?


  1. Anthrax_Beta
    15.12.2021 10:41

    pg_dump не бэкап. Есть неиллюзорная вероятность потерять данные во время снятия дампа.


    1. 13werwolf13
      15.12.2021 10:51
      +2

      я думаю многие (особенно новички и админы локалхоста) были бы благодарны за ссылку на статью где внятно и простым языком описана разница, а главное рассказано почему есть вероятность просрать данные


      1. Anthrax_Beta
        15.12.2021 10:58
        +1

        Если кратко, то pg_basebackup позволяет обеспечить восстановление базы на момент последней успешной транзакции(перед запуском pg_basebackup), а в свою очередь pg_dump только на момент завершения, т.е. если во время работы pg_dump создастся таблица и заполнится данными, то есть вероятность что она не попадет в дамп.


        1. vaniacer
          15.12.2021 11:07

          Поэтому pg_dump'ы делают регулярно(кроном) и хранят несколько дампов. И вполне себе бекап получается.


          1. Anthrax_Beta
            15.12.2021 11:26
            +1

            для маленьких и холодных БД - дамп может и сгодится. Но если данные критичные, то лучше pg_basebackup.


    1. puyol_dev2
      15.12.2021 11:17

      Есть именно бэкап бинарный. Но нужно устанавливать более полный режим журнала предзаписи (WAL). Для дампа достаточно minimal, для бинарного бэкапа нужно ставить hot_standby


      1. viktar1 Автор
        15.12.2021 11:35

        WAL мне на самом деле не понравился тем что пишет очень жирные журналы, и нужно гарантировать что кто будет их успешно очищать. Однажды за 3 дня журналы стали больше базы в 15 раз. Производительность конечно выше, но тут скорее про что то быстрое и простое в настройке.


        1. angelsaint
          16.12.2021 21:27

          В настройках можно выставить количество и объём хранимых журналов. И постгрес сам всё будет подчищать. В этом случае проблема с объёмом журналов может возникнуть только в том случае, если вы настроите реплику со слотом репликации и эта реплика перестанет работать (читай: тянуть к себе wal-ы)


          1. viktar1 Автор
            17.12.2021 21:43

            Если система хоть как то нагружена то тут конечно стоит использовать более продвинутые подходы к бэкапу.

            У меня на самом деле цели были более прагматичные, я использую бесплатное облако на оракле, они дают вполне неплохое облако в бесплатно пользование размером 4 ядра 24 гига за 0р в месяц, но ядра армовские, некоторые готовые решения просто не имеют пакетов под арм. А мне бы хотелось быть увереным что моя не нагруженная и не очень большая база делает резервные копии и сохраняется где то отдельно от бесплатного оракла.


        1. anyafit
          17.12.2021 21:36

          Ротация wal довольно легко настраивается. И, по-моему, по умолчанию ненужные wal автоматически удаляются. Ненужными они становятся после checkpoint и записи изменений на диск. Держать wal может слот репликации или параметр wal_keep_segments.

          Либо у Вас checkpoint не выполнялся, что менее вероятно.


          1. viktar1 Автор
            17.12.2021 21:48

            Помню как то настраивал реплику, для какого то сервиса, он по идеи должен был ходить и очищать wal, могу путаться в терминологии, но суть в том, что как то профакапали с этим сервисом, и он не ходил за данными, в и итоге 3 гиговая база разролась до 45г за пару дней и просто закончилось место. Собственно поэтому и избегаю его, так как нужды в производительности нет. А лишние настройки делать не вижу для текущей задачи.


    1. viktar1 Автор
      15.12.2021 11:28

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


  1. vaniacer
    15.12.2021 11:09
    +1

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


    1. viktar1 Автор
      15.12.2021 11:30

      Спасибо, это как раз следующий шаг в моей настройке резервных копий.


  1. shurutov
    15.12.2021 12:54
    +5

    Средства для бекапа ПГ рассмотрены вот здесь: https://ru-postgres.livejournal.com/66359.html

    Предложенное же решение - это рукоблудие и скриптоложество, полезное только автору для набить руку в bash-е, не более того.


  1. fedorro
    15.12.2021 14:16
    +2

    Вначале текстовый дамп создавать, а потом его жать — это же нагрузка на систему хранения. Вероятно лучше pipe-ом сразу в архив писать?


    1. vodopad
      15.12.2021 21:29

      https://postgrespro.ru/docs/postgrespro/10/app-pgdump

      Есть ключик -F format. Лучше указать формат custom.


  1. karabanov
    15.12.2021 21:00
    +2

    Не

    shmod +x pg_backup.bash

    А

    сhmod +x pg_backup.bash


  1. dmitriylyalyuev
    15.12.2021 22:54
    +1

    Хочу я посмотреть сколько ваш скрипт будет работать на базе хотя бы гигов в 100.


    1. goletsa
      16.12.2021 09:39

      Очень тяжко скорее всего. Решал одно время подобную задачу, ещё и с дефицитом свободного места на сервере. Пришлось писать сжатый дамп с Wal, иначе было даже не снять дамп.


  1. ykurenkov
    17.12.2021 21:27

    1. Как уже отметили в комментариях, дамп не есть бэкап. Тут же возникает вопросы. А где пользователи postgresql? Почему дампим только одну базу?

    2. Недавно на YouTube канале компании Postgres Professional была размещена запись вебинара по системам именно бэкапа кластеров postgresql. Рекомендую ознакомиться, но там английский.

    3. Откройте для себя pg_probackup - наверное лучший на сегодня инструмент для бэкапа postgresql.


    1. viktar1 Автор
      17.12.2021 21:32

      Спасибо, за советы и вопросы.

      Пользователи в файле .pgpass а одна база дампиться потому была задача дампить одну только базу) собственно поэтому в сторону больших комплексных решенний с кластерами я не смотрел. Что касается pg_probackup то его нету под арм к сожалению. А сервер мой на arm


      1. ykurenkov
        17.12.2021 22:14

        Не, я о пользователях, которые в pg_basebackup -g. Не знали об этом?

        Свяжитесь на github'е с разработчиками. Есть шанс, что и под arm будет сборка.


        1. ykurenkov
          17.12.2021 22:15

          У разработчиков pg_probackup родной язык - русский.


  1. kini24
    17.12.2021 21:27

    У меня посложней будет: перебор всех БД на постгре, для каждой делается бэкап (на лету архивируется), который копируется на внешний диск (монтируется по ходу) и другой сервер, который находится в другой части города


    1. viktar1 Автор
      17.12.2021 22:48

      А есть какой то рецепт для этого дела)? собсвенно следующим шагом думаю как бы это всё отправлять на домашний NAS