Скрипт резервного копирования vps серверов

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

    Скрипт создает 2 архива: в одном файлы, в другом директория с дампами всей БД по базам.
    Нужно поменять настройки в начале.

    #!/bin/bash
    
    USER=root  #юзер базы данных
    PASSWORD=password  #пароль
    BACKUP=/media/Backup  #куда сохранять бэкапы
    LOG=/var/log  # директория для чистки старых логов
    OLD=30  # сколько дней хранить бэкапы (более старые будет удаляться)
    PREFIX=work  # если несколько серверов - используйте разные префиксы, чтобы не путаться
    DATE=`date '+%Y-%m-%d'`
    
    echo "Backup database to $BACKUP"
    mkdir $BACKUP/$DATE.sql
    cd $BACKUP/$DATE.sql
        for i in `mysql -u $USER -p$PASSWORD -e'show databases;' | grep -v information_schema | grep -v Database`;
            do mysqldump -u $USER -p$PASSWORD $i > $DATE-$i.sql;
        done
    
    cd ..
    tar -cjf $BACKUP/$DATE-sql-$PREFIX.tar.bz2 ./$DATE.sql
    rm -rf ./$DATE.sql
    
    
    echo "Backup files to $BACKUP"
    tar -cjf $BACKUP/$DATE-files-$PREFIX.tar.bz2  \
        /var/www/ \
        /etc/ \
        /var/log/ \
        /root/ \
        --exclude=$BACKUP
    
    echo "Deleting old backups and logs from $BACKUP & $LOG"
    find $LOG -type f \( -name "*.gz" -o -name "*.1*" \) -exec rm '{}' \;
    find $BACKUP -mtime +$OLD -exec rm '{}' \;
    


    P.S. Настройка Dropbox на сервере.
    Share post

    Similar posts

    Comments 39

      +3
      Я бы только значение date '+%Y-%m-%d' запрашивал один раз держал бы в переменной. А то будут странные косяки если скрипт начнет выполняться за несколько секунд до полуночи.
        0
        Согласен, сейчас переделаю.
          0
          интересно, а есть сервис, который позволяет коллективно редактировать текстовой файл? в нашем случае этот скрипт.

          вики и svn/cvs/git/hg в этом плане не рассматриваю. Интересует именно web
            0
            гуглдок
              +1
              А wiki не web?
              0
              а скрипт что бы все это дело разворачивал на новом сервере?
                0
                Это я предпочитаю ручками.
            +1
            Знаете, а я на следующей неделе опубликую 2 скрипта.
            один на Bash — бэкапит БД на удаленны фтп, бэкапит директории с сайтами.
            второй на php — удаляет с фтп устаревшие бэкапы.

            ключевой момент — бэкапы хранятся не на локальном сервере.

            поднять vps под убунтой могу за 30 минут. для себя подготовил мини инструкцию что и где нужно прописать и что установить =)
              0
              Я что то подобное писал, только не по ftp, а mount через ssh. Работало нормально, но ведь мог не ответить удаленный сервер.

              Так как у меня сайты не супер-пупер важности — я резервирую все на локальную машину, а оттуда в ручном режиме перекидываю на Dropbox.
              На досуге собираюсь покурить маны и сделать копирование в Dropbox сразу с хостинга.
                0
                у меня есть ftp отдельный, поэтому другие варианты не рассматривал.

                за месяц ежедневных бэкапов набирается на 15-20 гигов.
                  0
                  Если ftp в защищеной сети, то проблем нет, конечно. Но если это публичный интернет, то есть смысл посмотреть в сторону scp (копирование через ssh).
                  scp не только лучше защищено, но даже будет немного проще скриптовать. С scp/ssh можно делать интересные штуки, как например, компрессия-архивация на удаленном хосте если локальное процессорное время ценнее трафика. И прочее в таком стиле.
                0
                Я видимо не выдержу и опубликую решение на duplicity… разнообразие велосипедов поражает.
                  0
                  Это угроза?!
                +1
                Я бы посоветовал добавить заливку бэкапа на amazon s3

                s3cmd put $DATE-files-$PREFIX.tar.bz2 s3://backup/

                Настройка программы тоже очень простая habrahabr.ru/blogs/personal/92419/
                  0
                  Можно еще бекапить бд сразу в архив.
                  mysqldump -uuser -ppass dbase | gzip -cf9 > dbase_date.sql.gz
                    0
                    А потом опять зажимать в другой архив? Или таскать папкой с архивами?

                    Мне кажется удобнее архив сразу директории в один файл.
                      0
                      Не понимаю, вы имеете ввиду упаковывать дамп и файлы в один архив?
                        0
                        Все базы дампятся в файлы. Одна БД — один файл. Все это лежит во временной директории. Потом она сжимается (соответственно, сжимаются сразу все дампы) в один файл.

                        Отдельно сжимаются нужные файлы (веб сайты, настройки)

                        Получается в итоге скрипта 2 архива — в одном все файлы, в другом все базы данных. Удобно хранить и копировать.
                          0
                          Да, конечно такой подход тоже может быть.
                          Я наоборот для каждого проекта завожу отдельную папку, в нее кладу папку с дампами бд и папку с архивами статики.
                          Каждый проект в своей папке, потому как не известно кому будет передан проект в дальнейшем, куда переедет проект в дальнейшем, будет ли он существовать вообще.
                            0
                            Оговорился, архивы я не использую, пытался наложить ваши потребности на свой пример и запутался. У меня хардлинки в папку дропбокса, и только статика.
                    –1
                    Бекап в архив — позапрошлый век. Нужно делать инкрементальные бекапы с хардлинками на неизменившиеся файлы.
                      0
                      Я тоже склоняюсь к этому мнению, но для небольших проектов достаточно и бекапа с архивами. Точнее архивы тоже не хорошо, на мой взгляд достаточно хардлинков или копирования с заменой, скажем, в папке дропбокса.
                      Речь идет о статике конечно же, исходный код в архивах — точно прошлый век.
                      0
                      добавьте
                      echo "Backup postgresql bases"
                      if [ -x `which pg_dumpall`]; then
                      su - postgres -c "pg_dumpall" >......
                      fi
                        0
                        Используйте вместо mysqldump — innobackupex/xtrabackup
                          0
                          Что это? В репозитории Ubuntu нет такого.

                          Мой скрипт и на shared хостинге работать будет, ему права root не нужны.
                          Tar и mysqldump есть везде.
                            0
                            конечно это не для шаред, но и в заголовке указано — VPS
                            www.percona.com/docs/wiki/repositories:apt
                              0
                              А что, если vps — то надо ставить на него все подряд?

                              Расскажите, какие выгоды дает innobackupex/xtrabackup по сравнению с mysqldump?
                                0
                                скорость бекапа + ниже нагрузка на систему + быстрое восстановление.
                                вкратце: эти скрипты не делают дамп запросами в базу и не восстанавливают таким же образом.
                                для деталей — гугл в помощь.
                                  0
                                  Используй %programname%!
                                  Для деталей — гугл в помощь.

                                  Спасибо, я как нибудь по старинке. К тому же, не понятно, можно ли будет эти дампы через phmyadmin восстановить.
                          0
                          Мда… у бывших пользователей клодо мысли сходятся… Как раз собралась написать похожую штуку, только с rsync'ом на домашний комп и архивированием уже «дома» + перелив с домашнего компа на амазон через s3cmd. И тоже наладила все это безобразие «в связи с событиями у Clodo» :-)
                          На клодовской машинке бэкапы делались скриптами халявной панельки, у селектела пришлось все настроить ручками :-)
                            0
                            Селектел мне очень пока нравится. Скорость фантастическая, глюков нет, а деньгам так же. Посмотрим, как будет дальше по времени.
                            Поставил на сервер dropbox и бэкаплю сразу туда.
                            0
                            rsnapshot чем не угодил? У меня бекапит и базы и файлы…
                              0
                              Для бэкапов рекомендую вот эту штуку:

                              github.com/meskyanichi/backup
                                0
                                Если есть простой, прозрачный и удобный инструмент, который ежедневно просто делает свою работу на нескольких серверах — нафига его менять?

                                Кстати, меня смущает там 41 открытый вопрос.

                                Уверены, что нужно использовать этого монстра, вместо простого скрипта в 30 строк?
                                  0
                                  41 открытый вопрос — это лишь показатель популярности проекта. Software fails.

                                  Недостаток простых скриптов в том, что рано или поздно их приходится дописывать / делать костыли. К примеру, если захотите бэкапится на S3 вместо диска, либо захотите делать бэкапы инкрементально. Я раньше тоже пользовался самописным скриптиком вроде вашего, но понял, что использовать его для сложных проектов стало неудобно из-за того, что в некоторых местах бэкапить нужно не только файлы/БД.
                                    0
                                    К примеру, если захотите бэкапится на S3 вместо диска, либо захотите делать бэкапы инкрементально

                                    Лично мне нравится делать полные копии. Для версионности своих разработок использую Github. Для S3 есть s3cmd — простая консольная утилита.

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

                                    что в некоторых местах бэкапить нужно не только файлы/БД

                                    Прошу прощения, а что можно еще бэкапить?
                                      0
                                      Это понятно, что для всего есть своя консольная утилита. Разница в том, что в вашем скрипте эту консольную утилиту нужно правильно использовать, да ещё и тщательно это простестировать. А если в один прекрасный день сторонний сервис, на который заливаются ваши бэкапы откажет / истечёт срок действия сертификата / закончатся деньги в аккаунте? Гем backup умеет отправлять письма на почту со статусом последнего бэкапа.

                                      Кроме того, в вашем скрипте нет обработки кодов возврата. А ведь каждая команда в цепочке может выполнится неуспешно (ошибка доступа, закончилось место на диске, MySQL timeout).

                                      Я не совсем правильно выразился по поводу возможных предметов бэкапа. Бэкапятся, в любом случае, только файлы. Более или менее нагруженный проект это не только LAMP. У нас в проекте, например, есть Redis. Он периодически сохраняет свою базу в файл. Перед тем как копировать эту базу для бэкапа, нужно отправить специальную команду для того, чтобы Redis записал информацию на диск. Понятно, что это тоже можно реализовать с помощью bash-скрипта, но зачем изрбретать велосипед, если это уже сделали правильно за тебя и нужно лишь указать путь к папке Redis в конфиге? Чем сложнее проект, тем больше велосипедов придётся изобретать.
                                        0
                                        Да как скажете.
                                0
                                Ничего не понимаю в серверах, бекапах и bash, но это единственный скрипт, который работает так, как нужно — с бекапом всех баз, с указанием исключений, с указанием целевых папок и удалением старых бекапов. Добавил загрузку в Google Cloud Storage и повесил на cron. На все настройки 15 минут, с учетом того, что я в этом полный ноль.

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