Всем привет.
У меня стояла задача обеспечить бекап базы BGB4.6 средствами mysqdump. Т.е. в текстовые sql файлы.
Другие методы не подходили по ряду причин.
Полный бекап занимает пример 40 минут. И в это время системой практически нельзя пользоваться. Даже абонентские соединения начинают отваливаться. В общем не вариант. Известно, что BGB заводит новые таблицы на каждый месяц. Я решил, что будет правильно бекапить только новые таблицы и те, что изменились.
Своего рода инкрементальный бекап.
Получился скрипт, который выношу на обсуждение:
Цитата:
#!/bin/sh
DBHOST=$1
DBUSER=$2
DBPASS=$3
DBNAME=$4
BACKUPDIR=$5
CMD=`mysql -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME --silent --batch --raw -e "SHOW TABLE STATUS;"`
SAVEIFS=$IFS
IFS='
'
for i in $CMD
do
TABNAME=`echo $i | awk -F '\t' '{print ($1)}'`
PRETABDATE=`echo $i | awk -F '\t' '{print ($13)}'`
TABENGINE=`echo $i | awk -F '\t' '{print ($2)}'`
if [ $TABENGINE != "MyISAM" -a $TABENGINE != "InnoDB" ]
then
continue
fi
if [ "$PRETABDATE" = "NULL" ]
then
PRETABDATE=`echo $i | awk -F '\t' '{print ($12)}'`
fi
TABDATE=`date -d "$PRETABDATE" +%s`
if ( [ -f $BACKUPDIR/$TABNAME ] )
then
DATE1=`ls --full-time $BACKUPDIR/$TABNAME | awk '{print $6;}'`
DATE2=`ls --full-time $BACKUPDIR/$TABNAME | awk '{print $7;}' | sed "s/\\..*//"`
DATE3=$DATE1" "$DATE2
FDATE=`date -d "$DATE3" +%s`
if ( [ $TABDATE -le $FDATE ] )
then
echo $TABNAME ... Skip
continue
fi
fi
echo $TABNAME ... Backup
/usr/bin/mysqldump --opt -h $DBHOST -u $DBUSER -p$DBPASS $DBNAME $TABNAME > $BACKUPDIR/$TABNAME
done
IFS=$SAVEIFS
echo "All done."
exit 0
Скрипт сравнивает дату модификации (или создания) таблицы и дату файла-бекапа. Если его нет или дата старая - делается бекап.
Теперь бекап-обновление у меня происходит за 1.5 минуты. Можно делать несколько раз в день.