Simple DB backup
Материал из BiTel WiKi
D71 (Обсуждение | вклад) |
Ok-2004 (Обсуждение | вклад) |
||
Строка 71: | Строка 71: | ||
#/etc/init.d/mysql start | #/etc/init.d/mysql start | ||
+ | </source> | ||
+ | |||
+ | |||
+ | ---- | ||
+ | |||
+ | P.S.: | ||
+ | |||
+ | Следует отметить, что если ls -al /var/lib/mysql/bgbilling/*.ibd|wc -l будет больше 1024 - процесс бэкапа завершиться с ошибкой. Workaround этого находится в начале следущего "боевого скрипта" который бэкапит базу с числом таких файлов около 1837....: | ||
+ | <source lang="bash"> | ||
+ | #!/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=NortelCom \ | ||
+ | /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=NortelCom /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!" | ||
+ | find /var/sos/ -maxdepth 1 -name "full_*" -type d -mtime +17 -exec rm -rf "{}" \; | ||
+ | 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 | ||
</source> | </source> |
Версия 03:50, 9 мая 2014
Большое спасибо пользователю 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=NortelCom \ /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=NortelCom /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!" find /var/sos/ -maxdepth 1 -name "full_*" -type d -mtime +17 -exec rm -rf "{}" \; 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