Simple DB backup

Материал из BiTel WiKi

Перейти к: навигация, поиск

Большое спасибо пользователю ok-2004 с форума битела за помощь

UPDATE: Схема проверена и годится для переноса DB на другой сервер.

Используем Percona XtraBackup
Собирать и компилить ничего не надо - качаем binary, просто кидаем содержимое в каталог типа /usr/sbin/ что бы пути не писать.

cat /etc/rc.d/rc.full.backup

#!/bin/bash
 
s_date=`date "+%Y-%m-%d_%H-%M-%S"`
 
s_date_log=$s_date'_log'
 
innobackupex \
--defaults-file=/var/lib/mysql/my.cnf.b \
--no-lock \
--no-timestamp \
--ibbackup=/usr/bin/xtrabackup_55 \
--user=root \
--password=mypassword \
/var/BACKUP/$s_date > /var/BACKUP/$s_date_log 2>&1
 
cp /var/lib/mysql/my.cnf /var/BACKUP/$s_date
tar -cvzf /var/BACKUP/$s_date.tar.gz /var/BACKUP/$s_date >/dev/null 2>&1
rm -rf /var/BACKUP/$s_date

внимание на my.cnf.b - это тот же my.cnf, только пути проставлены полные, типа:
datadir=/var/lib/mysql/db
innodb_data_home_dir = /var/lib/mysql/db
innodb_log_group_home_dir = /var/lib/mysql/log

Перед восстановлением, развернув из архива, бекап надо подготовить:

cat prepare.backup.sh

#!/bin/bash
 
log=$1'_log'
 
innobackupex \
--use-memory=1G \
--defaults-file=/var/lib/mysql/my.cnf.b \
--apply-log \
--ibbackup=xtrabackup_55 \
--user=root \
--password=mypassword \
/var/BACKUP/$1 > /var/BACKUP/$log 2>&1

Само восстановление проводить лучше уже руками:
бездумно не стоит копировать эти строки

#/etc/init.d/mysql stop 
#rm -rf /var/lib/mysql/db 
#mkdir /var/lib/mysql/db
 
#cp -av /var/BACKUP/full/bgbilling /var/lib/mysql/db 
#cp -av /var/BACKUP/full/mysql /var/lib/mysql/db 
#cp -av /var/BACKUP/full/performance_schema /var/lib/mysql/db 
#cp -av /var/BACKUP/full/ibd* /var/lib/mysql/db 
 
#chown -R mysql:mysql /var/lib/mysql/db 
#chown -R mysql:mysql /var/lib/mysql/log 
 
#chmod -R 775 /var/lib/mysql/ 
 
#/etc/init.d/mysql start



P.S.:

Следует отметить, что если ls -al /var/lib/mysql/bgbilling/*.ibd|wc -l будет больше 1024 - процесс бэкапа завершиться с ошибкой. Workaround этого находится в начале следущего "боевого скрипта" который бэкапит базу с числом таких файлов около 1837....:

#!/bin/bash
#/var/bgb/full - временной каталог для бэкапов
#/var/sos/ - подмонтированный через сеть, некий райд-массив...
#боремся с досадным багом перконы
ulimit -n 4096
d=`date +%d%m%g_%M%H`
echo "$d"
if [ -f /var/bgb/stop ]
then
#Предыдущий бэкап сбойнул, уходим отсюда...
echo "STOP FOUND !"
echo "$d stop found !" >> /var/bgb/xtra_log
#Запускаем на компе админа со всего размаху алерт ему в консоль:
export SSH_ASKPASS="/root/p.sh"
export DISPLAY=":0"
#ссашимся на комп админа без пароля но и без предварительного обмена ключами:
##cat p.sh
#!/bin/bash
#echo "МойСамыйСекретныйПарольНаКомпАдмина"
setsid ssh admin@ip.компа.админа "wall \"А у вас очередной бэкап не прошёл... ;) ! \""
exit 1
fi
#############################################################
#Начинаем и навсякий случай сразу напишем завещание
touch /var/bgb/stop
#Расчищаем место :
if [ -d /var/bgb/full ] ; then
rm -rf /var/bgb/full
fi
if [ -f /var/bgb/full_log ] ; then
rm -f /var/bgb/full_log
fi
if [ -f /var/bgb/prep_log ] ; then
rm -f /var/bgb/prep_log
fi
if [ -f /var/bgb/full_ok ] ; then
rm -f /var/bgb/full_ok
fi
if [ -f /var/bgb/prep_ok ] ; then
rm -f /var/bgb/prep_ok
fi
#
echo "FULL BEGIN!"
innobackupex \
--defaults-file=/etc/mysql/my.cnf \
--no-lock \
--no-timestamp \
--ibbackup=/usr/bin/xtrabackup_55 \
--user=root \
--password=xxxxx \
/var/bgb/full > /var/bgb/full_log 2>&1
if [ -z "`tail -1 /var/bgb/full_log | grep 'completed OK!'`" ]
then
#Чота с базой нето... валим отсюда, завещание оставляем 
echo "$d full fail!" >> /var/bgb/xtra_log
echo "FULL FAIL!"
exit 1
else
touch /var/bgb/full_ok
echo "FULL OK!"
fi
##############################################################################
if [ -f /var/bgb/full_ok ] && [ -d /var/bgb/full ]
then
#Вродь бэкап сработал, значит начинаем его приводить в человеческий вид
echo "PREP BEGIN!"
innobackupex \
--use-memory=1G \
--defaults-file=/etc/mysql/my.cnf \
--apply-log \
--ibbackup=xtrabackup_55 \
--user=root \
--password=xxxxx \
/var/bgb/full > /var/bgb/prep_log 2>&1
if [ -z "`tail -1 /var/bgb/prep_log | grep 'completed OK!'`" ]
then
#сбойнуло, валим отсюда, завещание адмниу оставляем...
echo "$d prep fail!" >> /var/bgb/xtra_log
echo "PREP FAIL!"
exit 1
else
touch /var/bgb/prep_ok
echo "PREP OK!"
fi
else
echo "$d full_ok not found!" >> /var/bgb/xtra_log
echo "FULL_OK NOT FOUND!"
exit 1
fi
##################################################################################
if [ -f /var/bgb/prep_ok ] && [ -d /var/bgb/full ]
then
#Бэкап вродь успешен , начинаем копировать на ремотный стораж...
echo "COPY BEGIN!...."
space=`df -h /var/sos|awk '{print $5}'|grep -v Use|cut -d % -f1 -`
case $space in
[1-8]*|9)
echo "/VAR/SOS almost full!"
;;
9[1-9])
echo "/var/sos/ full !" >> /var/bgb/xtra_log
echo "/VAR/SOS/ cleaning...!"
for i in `find /var/sos/ -maxdepth 1 -type d \( ! -iname "lost+found" ! -name "*.bak" \) -mtime +30 -print`; do rm -rf "$i"; done
#find /var/sos/ -maxdepth 1 -name "full_*" -type d -mtime +17 -exec rm -rf "{}" \;
;;
esac
rm -f /var/sos/cp_*
if [ -d /var/sos/full ]
then
mv /var/sos/full /var/sos/full_$d
fi
cp -av /var/bgb/full /var/sos > /var/sos/cp_log 2>&1
if [ $? != 0 ]
then
#Чота сегодня не копируется, блин....
echo "$d copy fail!" >> /var/bgb/xtra_log
echo "COPY FAIL!"
exit 1
else
echo "COPY OK!"
#Ну вродь все! Завещание рвём!
rm -f  /var/bgb/stop
fi
else
echo "$d prep_ok not found!" >> /var/bgb/xtra_log
echo "PREP_OK NOT FOUND!"
exit 1
fi
Личные инструменты