Firebird - инкрементальные бекапы


Данный скрипт написан мной по мотивам вот этого:

http://firebirdsql.su/doku.php?id=skript_dlja_rezervirovanija_bazy_dannyx_na_shell

Представленный выше скрипт плох тем, что
- Опирается на время и требует запуска в 6,7,8 часов ежедневно
- Валит все бэкапы в одну кучу
- Ведёт не удобный лог

Поэтому ниже - более крутое и удобное резервирование Firebird.

Достаточно воткнуть один раз в крон по часам и всё:
- Выгоняет пользователей из базы перед бэкапом
- Делает инкрементальные бэкапы с помощью nbackup
- Архивирует по месяцам, неделям, дням и часам
- Складывает всё аккуратно по папочкам
- Месячные бекапы хранит "вечно", остальные удаляет через неделю
- Нормально пишет в лог (в терминал), что делает

#!/bin/bash

#######################################################################
# fbbak.sh Igor Salnikov aka Artix (C) 2020 sun-doctor@7masterov.ru
#######################################################################
 
# Firebird binary directory
fbdir=/usr/bin

# Firebird database directory
dbdir=/home/fbbak/db

# Firebird backup directory
bkdir=/home/fbbak/arc
 
# Firebird user and password
server="192.168.1.100"
username="SYSDBA"
password="masterkey"
 
# Now dates
dt=`date "+%Y-%m-%d"`
day=`date +%d`
hour=`date +%H`
dow=`date +%u`
dn=`date +%j`
wn=`date +%U`
mon=`date "+%m"`

# Archive names
arc_full="$dt-A-MONTH-$mon"
arc_week="$dt-B-WEEK-$wn"
arc_day="$dt-C-DAY-$dn"
arc_hour="$dt-D-HOUR-$hour"

# Delete template
del_point=`date -d "8 days ago " +%Y-%m-%d`

# Flags
mk_monthly="0"
mk_weekly="0"
mk_daily="0"
mk_hourly="0"

 
# Check the hourly backup
if [ $hour -ge 0 ] && [ $hour -le 3 ]
then
    mk_hourly="1"
else
    exit
fi

if [ "$mk_hourly" == "0" ]
then
  exit
fi

date "+RUN %Y-%m-%d %H:%M $0"

# List the dir and backup each file
find "$dbdir" -name '*.FDB' > `pwd`/.dirs
while read i
do
    dbfile=$i
    # get the short name
    dbname=$(echo $i | sed -r "s#^.+/##" | sed -r "s#.fdb##i")
    srvname=$(echo $i | sed -r "s#^.+/##" | sed -r "s#.fdb##i" | sed -r 's#\_##g' )
    srvname=${srvname,,}

    mkdir -p $bkdir/$dbname

    if [ -e "$bkdir/$dbname" ]
    then

        bk_arc_full=$bkdir/$dbname/${arc_full}.nbk
        bk_arc_week=$bkdir/$dbname/${arc_week}.nbk
        bk_arc_day=$bkdir/$dbname/${arc_day}.nbk
        bk_arc_hour=$bkdir/$dbname/${arc_hour}.nbk
        search_prev_month=`find $bkdir/$dbname/ -name "*MONTH-$mon.nbk.gz"`
        search_prev_week=`find $bkdir/$dbname/ -name "*WEEK-$wn.nbk.gz"`
        search_prev_day=`find $bkdir/$dbname/ -name "*DAY-$dn.nbk.gz"`

        increment="3"
        bk_arc=$bk_arc_hour

        if [ "$search_prev_day" == "" ]
        then
           increment="2"
           bk_arc=$bk_arc_day
        fi
        if [ "$search_prev_week" == "" ]
        then
           increment="1"
           bk_arc=$bk_arc_week
        fi
        if [ "$search_prev_month" == "" ]
        then
            increment="0"
            bk_arc=$bk_arc_full
        fi

        if [ "$increment" != "" ] && [ ! -e "$bk_arc.gz" ]
        then
            echo "BAK" $i "=>" $bk_arc
            #cp $i $bk_arc
            echo CMD $fbdir/nbackup -U $username -P $password -B ${increment} ${i} ${bk_arc}

            $fbdir/gfix -sh single -fo 0 -user $username -password $password $server:$srvname

            # Make backup
            $fbdir/nbackup -U $username -P $password -B ${increment} ${i} ${bk_arc}
            if [ $? -eq 0 ]
            then
                gzip $bk_arc
                if [ $? -ne 0 ]
                then
                  rm $bk_arc
                fi
 
                # Rotate old 
                find $bkdir/$dbname/ -name '*.nbk.gz' > `pwd`/.files
                while read j
                do
                    xname=$(echo $j | sed -r "s#^.+/##" | sed -r "s#.nbk.gz##")
                    xp=${xname:0:10}
                    if [ "$xp" \< "$del_point" ]
                    then
                        if [[ "$xname" != *"MONTH"* ]]
                        then
                          echo "DEL" $j
                          rm "$j"
                        fi
                    fi
                done < `pwd`/.files
                rm `pwd`/.files
            fi

            $fbdir/gfix -online normal -user $username -password $password $server:$srvname

        fi
    fi

done < `pwd`/.dirs
 
rm `pwd`/.dirs

date "+END %Y-%m-%d %H:%M $0"