Данный скрипт написан мной по мотивам вот этого:
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"
SQL Справочник v0.05 © 2007-2025 Igor Salnikov aka SunDoctor