Бэкапы своими руками для чайников

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

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

Задача


Необходимо по расписанию создавать резервные копии файлов и базы данных. Эти два процесса должны быть независимы друг от друга, потому что бэкап БД делается чаще, чем бэкап файлов (или наоборот).
Дано

  • VPS на базе Centos 5 x86_64.
  • Панель управления ISP Manager. Стандартные средства ISP Manager не устраивают.
  • Свободного места на сервере очень мало.

Цель

Получить архивы файлов и БД на сервере в определенной папке. Архивы должны быть доступны по http-протоколу.


Решение


Так как это первый опыт написания скриптов — код может показаться кому-то слегка корявым.

Бэкап MySQL
Делает дампы всех БД, доступных для указанного пользователя.
#!/bin/sh

# ---- Константы --------------------------------------
# Папка, куда складываем бекапы
BACKUP_DIR="/var/www/wscms/data/www/site.ru/backup/"
# Имя файла бекапа
BACKUP_FILE="sql.tar"
# Пользователь, владелец файла с бекапами
USER="wscms"
# Папка для временных дампов MySQL
MDIR="mysql/"
# Сервер БД MySQL
MHOST="localhost"
# MYSQL root пользователь
MUSER="root"
# MYSQL root пароль
MPASS="***************"
# Поставьте "-zcf" если хотите сжимать данные или "-cf" в противном случае
PARAMS="-cf"

#--- Служебные переменные --------------------------
# Путь к mysql.
MYSQL="$(which mysql)"
# Путь к mysqldump
MYSQLDUMP="$(which mysqldump)"
# Путь к tar
TAR="$(which tar)"
# Путь к chown
CHOWN="$(which chown)"
# Путь к RM
RM="$(which rm)"
# Путь к MKDIR
MKDIR="$(which mkdir)"

# ---- Получаем список баз данных
DBS="$($MYSQL -u $MUSER -h $MHOST -p$MPASS -Bse 'show databases')"

# ---- Чистим папку с дампами на случай, если она уже существовала
$RM -rf $BACKUP_DIR$MDIR
# ---- Создаем папку для дампов
$MKDIR -p $BACKUP_DIR$MDIR

# ---- Делаем дампы найденых баз. Старые дампы замещаются
for db in $DBS
do
    FILE=$BACKUP_DIR$MDIR$db.sql
    $MYSQLDUMP -u $MUSER -h $MHOST -p$MPASS $db > $FILE
done

# ---- Архивируем файлы
$TAR $PARAMS $BACKUP_DIR$BACKUP_FILE $BACKUP_DIR$MDIR

# ---- Удаляем уже не нужную нам папку с MySQL дампами
$RM -rf $BACKUP_DIR$MDIR

$CHOWN $USER $BACKUP_DIR
$CHOWN $USER $BACKUP_DIR$BACKUP_FILE
exit 0


Бэкап файлов
#!/bin/sh

# ---- Константы --------------------------------------
# Папка, куда складываем бекапы
BACKUP_DIR="/var/www/wscms/data/www/site.ru/backup/"
# Расширение файла бекапа
EXT=".tar"
# Директория, в которой лежат аккаунты
MAIN_DIR="/var/www/"
# Директория, в которой лежат сайты аккаунтов
DATA_DIR="/data/www/"
# Пользователь, владелец файла с бекапами
USER="wscms"
# Поставьте "-zcf" если хотите сжимать данные или "-cf" в противном случае
# используйте u для добавления только новых файлов
PARAMS="-cf"

#--- Служебные переменные --------------------------
# Путь к tar
TAR="$(which tar)"
# Путь к chown
CHOWN="$(which chown)"
RM="$(which rm)"
MKDIR="$(which mkdir)"

# ---- Создаем папку для дампов
$MKDIR -p $BACKUP_DIR
$CHOWN -R $USER $BACKUP_DIR

# ---- Для всех пользователей панели
for DIR in $(/usr/local/ispmgr/sbin/mgrctl -m ispmgr user | cut -d' ' -f1 | sed s/name=//)
do
    # ---- Архивируем файлы
    $TAR $PARAMS $BACKUP_DIR$DIR$EXT $MAIN_DIR$DIR$DATA_DIR
    $CHOWN $USER $BACKUP_DIR$DIR$EXT
done

$CHOWN -R $USER $BACKUP_DIR
exit 0


Добавляем в CRON от root-пользователя
/bin/sh /backup/backup.sh
/bin/sh /backup/sql.sh
Ставим нужное нам расписание

После работы этих двух скриптов мы имеем бэкапы файлов каждого пользователя по отдельности и бекап MySql.

Теперь мы можем делать с ними все что угодно: либо на стороннем сервере в другом ДЦ забирать их с помощью wget, либо (как это реализовано у меня) с помощью несложного windows-приложения, загруженного в планировщик, ежедневно скачивать бэкапы на локальную машину.

В целях безопасности в папку site.ru/backup/ советую положить следующий .htaccess
Order Deny,Allow
Deny from all
Allow from Ваш.IP.Адрес, IP.Адрес.ВПС.Если.Используете.wget

Удачи Вам, и не теряйте свои данные.
Share post

Comments 14

    –2
    Давно придумали ПО для этих целей.
    Имхо, не надо придумывать велосипед.
    Symantec Вам в руки, он все это умеет.
      0
      В ISPManager есть встроенная система бэкапа, которая архивирует файлы пользователя и складывает архивы в каталог пользователя. Необходимо только базу отдельно дампить.
        0
        Почему-то у меня с ней не сложились отношения. Может панелька криво стоит, я не знаю, я не администрирую.
        см. пункт 2 «Дано»
        Панель управления ISP Manager. Стандартные средства ISP Manager не устраивают.
        0
        И на кой Вам тогда панель ISPmanager? Ведь основная задача таких панелей — как раз автоматизация ежедневных действий.

        Например, встроенный бекап делает архивы, которые можна сразу развернуть на другом сервере с ISPmanager, в случае отказа основного (импорт пользователя, если не ошибаюсь).
        Ну и сам формат архива ничем не отличается от Вашего, разве что дамп базы и все файлы пользователя в одном файле, плюс еще почта\настройки\что там настроено.

        Про велосипед Вам написали выше.
          +5
          RM="$(which rm)"
          Да вы параноик!
            +1
            Это первый shell скрипт в моей практике. Да и знаний ОС особых не имею.
            В дальнейшем торжественно клянусь исправиться.
            0
            Ужас. Не делай так. Лучше почитайте про bacula. Один раз разобраться и счастья на всю жизь.
              0
              Я расскажу Вам, как родилась данная идея:

              Когда на форумах спрашиваешь «Подскажите, каким образом можно реализовать резервирование данных», основной ответ: «обращайтесь в аську/почту/скайп, поможем. Стоимость услуг ХХ$». Либо топик остается без ответа.

              Никто не дал хотя бы намек на bacula, Symantec и прочее. Пришлось выдумывать что-то самостоятельно. Результат перед Вами. Комментарии к данному посту принесли мне намного больше информации, чем все мои топики «Подскажите...».

              В завершение. Не могли бы Вы подробнее рассказать, в чем «Ужас» подобного решения? При описанных исходных данных эти скрипты отлично решают поставленную задачу.
                0
                ну не ужас-ужас, но дампится все. вся БД, все файлы. Это долго и нагружает проц.
                Нет инкрементальных бекапов.
                В общем, для мелких сайтов-проектов пойдет, чуть выше требования и всё.
                rsnapshot оцените.
                  0
                  Впредь спрашивайте тут: habrahabr.ru/qa/

                  У меня не было ни разу, чтобы не помогли.
                  0
                  Поддерживаю, отличный инструмент.
                    0
                    bacula нормально подойдет для VPS?
                    Не слишком много кушать будет RAM висящие демоны?
                    0
                    Опыт для вас очень полезный. Можете еще посмотреть на хабре статью про powerbackup. Это скрипт написанный одним человеком для своих нужд. Уже давно пользуюсь + использую небольшую обертку чтобы копировать файлы на другие сервера, удалять старые бэкапы и указывать время создания нового full бэкапа. Умеет шифровать, так что на дропбокс можно смело копировать.
                      0
                      А можно куда-нибудь выложить пример, а то по статье на хабре ссылка на powerbackup уже не пашет.
                      Сейчас делаю бэкап на php (с инкрементальным и дифференциальным бэкапом, шифрование, закачка на Amazon S3, Dropbox и т.п.). Интересно сравнить с готовыми решениями. Пока, что тестил на винде, работает шустро, быстрее того же Comodo Backup.

                    Only users with full accounts can post comments. Log in, please.