30 июл. 2013 г.

Резервное копирование баз Firebird

Собственное решение по следам старой дискуссии

Один из первых, написанных мной, скриптов. Работает уже, наверное, пару лет. Проверен на Ubuntu 11.10 и  OpenSUSE 11.x.




#!/bin/sh
# бэкап баз

destdir=/work/backup
mountdir=/mnt/fb_bases_backup
backup_date=`date +%Y%m%d`
for_days=7
GBAK=/opt/firebird/bin/gbak

echo ""

echo "================================================================================"
echo "Резервирование рабочих баз данных..." 
date

echo ""

for database in "db_alias_1" "db_alias_2"
do
  echo "Создание резервной копии базы $database..."

  destfilename=$destdir/$database.$backup_date.fbk
  logfilename=$destdir/$database.backup$backup_date.log

  if [ -e $destfilename ]
  then
    echo "  удаление резервной копии, сделанной ранее..."
    rm -f $destfilename
  fi

  if [ -e $logfilename ]
  then
    echo "  удаление протокола создания резервной копии, сделанной ранее..."
    rm -f $logfilename
  fi

  $GBAK -b -v -y $logfilename -t -user SYSDBA -password SYSDBApassword $database $destfilename

  if [ -e $destfilename ]
  then
    if [ -e $destfilename.gz ]
    then
      echo "  удаление архива резервной копии, сделанной ранее..."
      rm -f $destfilename.gz
    fi

    echo "  cжатие резервной копии..."
    gzip $destfilename

    if [ -e $destfilename.gz ]
    then
      echo "Резервная копия успешно создана!"

      if [[ -d "$mountdir" && "$(ls -A $mountdir)" ]]
      then
        backupfilename=$mountdir/$database.$backup_date.fbk.gz

        if [ -e $backupfilename ]
        then
          echo "Удаление из сетевого хранилища архива резервной копии, сделанной ранее..."
          rm -f $backupfilename
        fi

        mv $destfilename.gz $backupfilename

        if [ -e $backupfilename ]
        then
          echo "Резервная копия перенесена в сетевое хранилище!"
        fi
      fi
    fi
    else
      echo "Ошибка при создании резервной копии!"
  fi

  echo ""
done

echo "Удаление устаревших резервных копий в локальном хранилище (созданные $for_days дней назад)..."
find $destdir -name '*.fbk.gz' -type f -mtime +$for_days -exec rm -f {} \;

if [[ -d "$mountdir" && "$(ls -A $mountdir)" ]]
then
  echo "Удаление устаревших резервных копий в сетевом хранилище (созданные $for_days дней назад)..."
  find $mountdir -name '*.fbk.gz' -type f -mtime +$for_days -exec rm -f {} \;
fi

echo "================================================================================"


Переменные:

  • destdir - локальный каталог, куда первоначально будут сохраняться резервные копии; 
  • mountdir - смонтированный раздел, куда будут сохраняться резервные копии (фактически, на удаленный сервер);
  • backup_date - дата создания резервной копии в формате "ГГГГММДД";
  • for_days - количество дней, в течении которых будет храниться резервная копия;
  • GBAK - путь к gbak.

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

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

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

Далее указываем cron'у запускать скрипт, например, раз в сутки в полночь:
#/etc/crontab
1 0 * * * root /home/username/fb_db_backup.sh

Комментариев нет:

Отправить комментарий