Всем привет.
У меня стояла задача обеспечить бекап базы 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 минуты. Можно делать несколько раз в день.