Не можешь найти то, что нужно? Сделай сам

    Так получилось, что мне было необходимо настроить резервное копирование баз данных MySQL и PostgreSQL. Хотелось вполне определенного, а именно:
    • Простота решения
    • Каждая БД в отдельном файле
    • Имя в формате «bdname.YYYY-MM-DD-HH:mm:ss.sql.gz»
    • Для каждой БД хранится определенное число архивов
    • Набор архивов БД находится в ротации
    • Решение определенных проблем с указанием пароля для pg_dump
    • и т.п.
    Готовых скриптов я в сети не нашел, но подобрал и объединил несколько решений, получив искомое.

    Общий алгоритм скриптов таков, что выбирается список баз данных, и по нему сохраняются архивы. Устаревшие удаляются. В скриптах имеется возможность и необходимость настройки: указание количества копий архива для ротации, логин/пароль для СУБД и папка для хранения результатов работы.

    MySQL:
    #!/bin/bash

    # user & password
    USER=root
    PASS=pass

    # number of backups to be saved
    KEEP=14

    # dir to backup
    DIR=/var/backups/mysql

    NOW=$(date +"%Y-%m-%d")
    DBS="$(mysql -u $USER -p$PASS -Bse 'show databases')"

    for db in $DBS
    do

      BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
      while [ $BACKUPS -ge $KEEP ]
      do
        ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
        BACKUPS=`expr $BACKUPS - 1`
      done
      
      FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz
      mysqldump -u $USER -p$PASS $db | gzip -9 > $FILE

    done

    exit 0


    * This source code was highlighted with Source Code Highlighter.

    С PostgreSQL я долго возился по причине того, что никак не мог передать пароль, но решение нашлось.

    PostgreSQL:
    #!/bin/bash

    # user & password
    USER=postgres
    PASS=pass

    # number of backups to be saved
    KEEP=14

    # dir to backup
    DIR=/var/backups/pgsql

    PGPASSWORD=$PASS
    export PGPASSWORD

    NOW=$(date +"%Y-%m-%d")
    DBS="$(psql -U $USER -lt |awk '{ print $1}' |grep -vE '^-|^List|^Name|template[0|1]')"

    for db in $DBS
    do

      BACKUPS=`find $DIR -name "$db.*.gz" | wc -l | sed 's/\ //g'`
      while [ $BACKUPS -ge $KEEP ]
      do
        ls -tr1 $DIR/$db.*.gz | head -n 1 | xargs rm -f
        BACKUPS=`expr $BACKUPS - 1`
      done
      
      FILE=$DIR/$db.$NOW-$(date +"%T").sql.gz

      pg_dump -U $USER $db | gzip -c > $FILE

    done

    PGPASSWORD=
    export PGPASSWORD

    exit 0


    * This source code was highlighted with Source Code Highlighter.

    Эти замечательные скрипты давно и успешно работают на машинке под управлением Debian. Просто добавь воды в крон.
    Поделиться публикацией

    Похожие публикации

    Комментарии 14

      +5
      github.com/astrails/safe

      Вот универсальное решение для быстрого создания бекапов
        +2
        Кстати, заголовок топика с минимальными исправлениями вполне годится на роль девиза:
        Не можешь найти то, что нужно? Сделай, @#$%, сам!
          0
          вот может кому-то ещё такое в жизни пригодится
          dmesg.org.ua/2009/12/mysql-backup/
            +1
            Плохой скрипт. Там важно добавить FLUSH TABLES WITH READ LOCK, потом сделать снапшот, а потом UNLOCK TABLES и только потом копировать. Иначе однажды получите разрушенные таблицы.
            Но и этот автор тоже поленился поискать.
              0
              век живи — век учись
              спасибо за подсказку
            0
              –1
              Не можешь найти решение свои тривиальных потребностей? — Ищи, а не засирай общий блог.
              Вот первом же комментарии вам и нашли.
                0
                Вообще это девиз *nix-ов. Главное, что всегда есть альтернатива.
                  +1
                  Я бы заменил gzip на lzma -1
                    0
                    для полноценности желательно сделать массив с исключениями (т.е. с таблицамим бекап которых роедко нужен, например information_schema)
                    еще когда делал похожий скрипт появилась мысль, удалять не все старые, на пример каждые 6/7 последних. т.е. мы делаем бекапы каждую ночь, и храним за последнию неделю все, а за предыдущие по одному на неделю. но что то както забылось это :(
                      0
                      Я дополнительно делаю полный бекап сайта с файлами и с базой раз в месяц.
                      0
                      # export PGPASSWORD

                      Это нехорошее решение!!!

                      Резервное копирование занимает некоторое время в течении которого можно перехватить пароль пользователя PostgreSQL!!!
                      Альтернетивное решение данной проблемы — разрешить доступ без пароля с определенного ip адреса средствами PostgreSQL.

                      Вот так и взламываются серверы потом :-)
                        0
                        Согласен, это хорошее решение.
                        0
                        Такие скрипты давно реализованы в рамках backupninja, там можно задать создание дампов и их инкрементный бэкап. Для последнего используется rdiff-backup.

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

                        Самое читаемое