Запись в 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