Запись в crontab
30 1 * * * root ( /root/backup-mysql >> /home/backup/backup.log 2>&1 )
Запускает в 01:30 и ведет лог сообщений в файл /home/backup/backup.log

В скрипте меняем основные параметры:

  • BACKUPDIR : директория где будут размещаться файлы
  • MAXNUMBER : количество хранимых файлов бекапа для каждой БД. Подробнее
  • HOST : адрес БД
  • USER : пользователь
  • PASS : пароль
  • DBLIST : перечень имен БД, если значение не задано, то будут архивироваться все найденные БД, доступные пользователю $USER
  • DBEXCLUDE : перечень имен БД, которые будут пропущены

Дампы сохраняются в файлы с именами формата $DBNAME.$NOWDATE.sql.bz2
mail.20090101.sql.bz2
#!/bin/bash
# Скрипт создания архивированного дампа БД MySQL

# !!! Директории слешами НЕ закрывать !!!
BACKUPDIR=/home/backup/mysql
# Максимально число хранимых архивов
MAXNUMBER=7
# Настройка подключения
HOST=»localhost»
USER=»user»
PASS=»mysqlpassword»
# Перечень БД
# DBLIST=»db1 db2″; DBLIST=»" все найденные
DBLIST=»"
# Список исключенных БД (при DBLIST=»")
DBEXCLUDE=»information_schema»

NOWTIME=`date ‘+%Y-%m-%d %H:%M’`
NOWDATE=`date ‘+%Y%m%d’`
DOTNAME=»\.sql\.bz2″

# Сообщение по завершению выполнения
function end_msg() {
echo «========== `date ‘+%Y-%m-%d %H:%M’` END backup-mysql ==========»
echo «»
}

echo «========== `date ‘+%Y-%m-%d %H:%M’` START backup-mysql ==========»
if [ ! -d "$BACKUPDIR" ]; then
echo «Директория не верна»
end_msg
exit 0
fi

if [ -z "$DBLIST" ]; then
################## Архивация всех БД ######################
# Получение массива имен БД
DBLIST=`mysql –user=$USER –password=$PASS –host=$HOST –batch –skip-column-names -e «show databases»`
# Исключение имен БД
for DBNAME in $DBEXCLUDE; do
DBLIST=`echo «$DBLIST» | sed «/^$DBNAME\$/d»`
done

# Выполнение дампа
for DBNAME in $DBLIST; do
echo «$DBNAME»
/usr/bin/mysqldump –routines –triggers –opt –user=$USER –password=$PASS –host=$HOST $DBNAME > $BACKUPDIR/$DBNAME.$NOWDATE.sql -C
bzip2 -f $BACKUPDIR/$DBNAME.$NOWDATE.sql
done
############################################################

else
################## Архивация из списка БД ##################
# Выполнение дампа
for DBNAME in $DBLIST; do
echo «$DBNAME»
/usr/bin/mysqldump –routines –triggers –opt –user=$USER –password=$PASS –host=$HOST $DBNAME > $BACKUPDIR/$DBNAME.$NOWDATE.sql -C
bzip2 -f $BACKUPDIR/$DBNAME.$NOWDATE.sql
done

############################################################
fi

####### Контроль количества файлов ##############
FILELIST=`ls $BACKUPDIR | sed -e ‘/[0-9]\{8\}’$DOTNAME’$/!d’`
FILENAMES=`echo «$FILELIST» | sed -e ‘s/\(^.*\)\([0-9]\{8\}’$DOTNAME’$\).*/\1/g’ | sort -u`
for CURRENT in $FILENAMES; do
# Получение списка дат для текущего архива на удаление
TEMP1=`echo «$FILELIST» | sed -e ‘/\(^’$CURRENT’\)\([0-9]\{8\}\)\(‘$DOTNAME’$\)/!d’ -e ‘s/\(^’$CURRENT’\)\([0-9]\{8\}\)\(‘$DOTNAME’$\)/\2/g’ | sort -rn`
TEMP1=`echo «$TEMP1″ | sed -e ’1,’$MAXNUMBER’d'`
#Склеивание
for TEMP2 in $TEMP1; do
DELETELIST=`echo $CURRENT$TEMP2${DOTNAME//\\\/} && echo «$DELETELIST»`
done
DELETELIST=`echo «$DELETELIST» | sed -e ‘/^$/d’`
done
if [ -n "$DELETELIST" ]; then
echo «========== Файлы будут удалены ==========»
echo «$DELETELIST»
fi
for CURRENT in $DELETELIST; do
rm $BACKUPDIR/$CURRENT
done

end_msg
exit 0
Взято отсюда

Заливаем архив бекапа в базу
bunzip2 < /path/to/outputfile.sql.gz | mysql -p DATABASE