Обычно резервную копию баз снимают через через команду mysqldump. Но что делать если сервер высоконагруженный, размер базы больше 10Гб, и база должна работать 24х7х365? Myqldump лочит таблицы при снятии дампа, из-за этого работа сервиса, связанного с этой базой нарушается, и время снятия дампа не минуты, а часы. Кроме того возникает еще один вопрос, в случае выхода из строя сервера, как быстро поднять до рабочего состояния базу за считанные минуты? Решение есть — Percona XtraBackup:
1) Percona XtraBackup: — Скачиваем и устанавливаем свежую версию.
2) Пишем скрипт mysqlbackup.sh:
#—————————————————————————
#!/bin/sh
export PATH=/sbin:/usr/sbin:/bin:/usr/bin
CATALOGDATE=`date +»%Y-%m»`
FILEDATE=`date +»%Y-%m-%d»`
ROOTPATH=/backup/bd
TARGET_USER=user
TARGET_ID_FILE=/root/.ssh/backup.1.id_rsa
TARGET_ID_FILE2=/root/.ssh/backup.2.id_rsa
TARGET_HOST=your.hostname.ru
TARGET_HOST2=your2.hostname.ru
TPORT=22
TARGET_DIR=/backup/bd
MYSQL_USER=root
MYSQL_PASS=password
MAIL_USER=yourmail@mail.ru
LOG_FILE=/var/log/backup/bckpv2.log
if [ ! -d $ROOTPATH/store/$CATALOGDATE ]; then
mkdir -p $ROOTPATH/store/$CATALOGDATE
fi
if [ ! -d $ROOTPATH/tmp ]; then
mkdir -p $ROOTPATH/tmp
fi
innobackupex $ROOTPATH/tmp —user=$MYSQL_USER —password=$MYSQL_PASS 2>&1 | logger -t bckpv2
MYSQL_TMP_DIR=`ls $ROOTPATH/tmp`
##innobackupex $ROOTPATH/tmp/$MYSQL_TMP_DIR —apply-log —use-memory=1G 2>&1 | logger -t bckpv2
tar -czpf $ROOTPATH/store/$CATALOGDATE/$FILEDATE.tar.gz $ROOTPATH/tmp/* 2>&1| logger -t bckpv2
echo «tar $FILEDATE.tar.gz complited» | logger -t bckpv2
rm -r $ROOTPATH/tmp/* 2>&1 | logger -t bckpv2
echo «Starting SCP» | logger -t bckpv2
scp -P $TPORT -i $TARGET_ID_FILE $ROOTPATH/store/$CATALOGDATE/$FILEDATE.tar.gz $TARGET_USER@$TARGET_HOST:$TARGET_DIR/mysql 2>&1 | logger -t bckpv2
echo «Ending SCP» | logger -t bckpv2
echo «Starting SCP» | logger -t bckpv2
scp -P $TPORT -i $TARGET_ID_FILE2 $ROOTPATH/store/$CATALOGDATE/$FILEDATE.tar.gz $TARGET_USER@$TARGET_HOST2:$TARGET_DIR/mysql 2>&1 | logger -t bckpv2
echo «Ending SCP» | logger -t bckpv2
MAIL_SUBJ=»$HOSTNAME: INFO: $FILEDATE backup report»
#echo $MAIL_SUBJ
#echo $MAIL_USER
#echo $LOG_FILE
mailx -s «$MAIL_SUBJ» $MAIL_USER < $LOG_FILE
echo «Mail sent to $MAIL_USER» | logger -t bckpv2
logrotate /etc/scripts/logrotate.d/bckpv2
#————————————————————————————
3) Добавляем по расписанию в cron
4) Если необходимо поднять на резервном сервере, разворачиваем архив в директорию mysql (по умолчанию /var/lib/mysql), стартуем mysql — и радуемся жизни.
5) Про синхронизацию статической части расскажу в следующей статье.