[Из песочницы] Резервирование БД с использованием mutt

Данная статья предназначена конечно не для админов, а скорее для веб-разработчиков, у которых на сервере неспешно наполняется БД небольшого объема. И вроде бы данные туда так и поступают — неспешно и небольшие, и ничто не предвещает беды, но все равно как-то не по себе. А вдруг завтра случится микроколлапс внутри данного конкретного сервера или данной конкретной хостинг-компании. И везде мерещатся злые хакеры и боты.

В общем, чтобы спать спокойно, нужно обеспечить периодическое сохранение содержимого БД вне рабочего сервера на случай, если по каким-то причинам доступ к содержимому сервера будет утерян. Для тех, кто (как и я) не дорос еще до репликаций БД на отдельных серверах, мой ответ — отправляйте дампы по почте.

Не буду рассказывать здесь, что возможны альтернативные (возможно более правильные) способы достичь того же эффекта. Здесь описано то, как это сделал я, какие встречались грабли.

Итак, весь процесс условно делится на три части:

  1. дамп БД в локальную папку, его архивирование
  2. отправка архива по почте
  3. создание bash-скрипта и задания cron, с нужной периодичностью выполняющего этот скрипт

Наша ОС — Ubuntu.
Наша СУБД — Postgresql.

1. Сохраняем локально


Допустим:
  • имя юзера СУБД — postgresuser
  • пароль юзера СУБД — userpass
  • название резервируемой БД — mydatabase
  • путь к папке для локального сохранения — /tmp
  • имя файла для локального сохранения — pg_dump.sql (после архивации получиться pg_dump.sql.gz)

Если мы сейчас попытаемся выполнить команду дампа…
pg_dump -U postgresuser -h localhost --inserts mydatabase | gzip > /tmp/pg_dump.sql.gz

… то скорее всего терминал запросит у Вас пароль. Но это нас не устраивает, т.к. данная команда будет выполняться автоматически в bash-скрипте, и хотелось бы, чтобы пароль подставлялся сам.

Для этого в домашней папке Ubuntu-юзера (допустим — sergey) создаем скрытый файл .pgpass. На всякий случай, это будет выглядеть вот так:

/home/sergey/.pgpass

Открываем этот файл и вставляем одну строчку:
localhost:5432:mydatabase:postgresuser:userpass

… где
  • postgresuser — имя юзера СУБД
  • userpass — пароль юзера СУБД
  • mydatabase — название резервируемой БД

Теперь команда…
pg_dump -U postgresuser -h localhost --inserts mydatabase | gzip > /tmp/pg_dump.sql.gz

… должна завершиться созданием архива pg_dump.sql.gz в папке /tmp.

ERRORS: Возможно появление ошибок, связанных с разрешениями на БД, которые возникают из-за того, что пользователь postgresuser не имеет права на БД mydatabase. Нужно ему их предоставить.

2. Отправляем архив по почте


Не буду рассказывать об истории и разнообразии почтовых клиентов под Linux (тем более что сам не знаю). Короче, ставите mutt.
sudo apt-get install mutt

В домашней папке Ubuntu-юзера (а мы помним, что это — /home/sergey/, и там еще лежит файл .pgpass) создаем скрытый файл .muttrc и вставляем внутрь файла примерно следующее:
set from = moya_pochta@gmail.com
set imap_user = moya_pochta@gmail.com
set imap_pass = "pochtapass"
set smtp_url = smtp://moya_pochta@smtp.gmail.com:587/
set smtp_pass = "pochtapass"
# don't let your firewall kill your idle connection
set imap_keepalive  = 900
# do not copy sent mail
set copy = no
set move = no 
set folder = imaps://imap.gmail.com:993
set spoolfile = +INBOX #or +[Gmail]/Important
set postponed = +[Gmail]/Drafts
# cache
set header_cache    = ~/.mutt/cache/headers
set message_cachedir    = ~/.mutt/cache/bodies
set certificate_file    = ~/.mutt/certificates

… где
 — moya_pochta@gmail.com — адрес, ОТКУДА будут отсылаться дампы;
 — pochtapass — пароль от этой почты.

Если у Вас почта Yandex, то в 4-й строчке вместо gmail.com вставляете yandex.ru, и все будет работать.

Пробуем отправлять наш файл:

mutt -s "Dump" -a /tmp/pg_dump.sql.gz -- drugaya_pochta@gmail.com < /dev/null

Здесь:
  • «Dump» — тема письма
  • /tmp/pg_dump.sql.gz — наш дамп
  • drugaya_pochta@gmail.com — адрес, КУДА будут отсылаться дампы

ERRORS: Вы можете получить следующею ошибку — SASL authentication. Это значит, что не удалось войти в почту-отправитель (это которая — moya_pochta@gmail.com). Причин я насчитал три:
  1. неправильный логин и/или пароль;
  2. на почтовом аккаунте не разрешен доступ непонятным приложениям (типа mutt). Если у вас gmail, то нужно включить доступ к аккаунту для непроверенных приложений, вот здесь;
  3. ХЗ. Например, у меня не получилось пробиться к одному конкретному аккаунту gmail через mutt, хотя изменил разршения доступа и перепроверил логин и пароль. Другие аккаунты отлично работают, причем и gmail и яндекс.почта.

3. Автоматизируем


Для начала пишем скрипт pg_mutt.sh и кладем вот сюда /home/sergey/ (в данном случае не важно — куда).
#!/bin/bash
EMAIL="drugaya_pochta@gmail.com"
DATABASE="mydatabase"
DATE=$(date +"%Y-%m-%d")
FILE="/tmp/pg_dump_${DATABASE}_$DATE.sql.gz"
pg_dump -U postgresuser -h localhost --inserts $DATABASE | gzip > $FILE
mutt -s "Dump $DATABASE $DATE" -a $FILE -- $EMAIL < /dev/null

Здесь Вам нужно заменить drugaya_pochta@gmail.com, mydatabase, postgresuser на свои данные.
Делаем файл pg_mutt.sh исполняемым:
chmod +x pg_mutt.sh

Создаем задачу cron, чтобы срабатывало каждое воскресенье в 3.00:
crontab -e

0 3 * * 0 /home/sergey/pg_mutt.sh

Заключение


Обязательно периодически проверяйте содержание того, что приходит в виде файла с названием pg_dump_mydatabase_*.sql.gz, потому что может так получиться, что Вы вроде теперь спите спокойно, а не следовало бы.

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

  • 26 сентября 2016 в 13:22

    +2

    Ну, признавайтесь, кто дал за это инвайт?
  • 26 сентября 2016 в 13:25

    +1

    Тому спасибо.
  • 26 сентября 2016 в 15:16

    0

    PHPBU. Конечно, написано на PHP, но функциональнее и удобнее будет.
  • 26 сентября 2016 в 15:57

    0

    не получилось пробиться к одному конкретному аккаунту gmail через mutt, хотя изменил разршения доступа и перепроверил логин и пароль

    Это скорее из-за того, что не отключена капча. Отключается по ссылке http://www.google.com/accounts/DisplayUnlockCaptcha

    Когда-то тож извращался таким образом и пришел к выводу, что отправка дампов через почту оч плохое занятие. А если бд будет весить больше некоторого размера и отправка по почте будет невозможна? Если уж используете gmail, то попробуйте воспользоваться гугл-диском для хранения бэкапов. Есть несколько консольных клиентов — gdrive, к примеру, или google-drive-ocamlfuse. Вот тут я описывал, как прикрутить гугл-диск к linux и сливать на него бэкапы.

    • 26 сентября 2016 в 16:17

      0

      Да, согласен, что это костыль. Но мне его пока достаточно. За совет спасибо. Нужно будет изучить этот вариант. А с какого размера БД, по вашем мнению, уже стоит прекращать использовать почту?

© Habrahabr.ru