首先在这里我要感谢我的同事@mamiya_c3哥的指教。。。QQQ

最近数据库的数据猛然增多,以前的每天一个正备份的方式显然压力越来越大,对备份的数据传输考验也随之加大,所以考虑改成每周二服务器维护的时候坐全备份,剩下每天做增量备份。

工作原理就是把每次完整备份的binlog和postion取出,做增量备份的时候取当时的binlog和postion,使用mysqlbinlog把这之间的数据读出到另一个文件。

注:本文中可能有个别地方会有些纰漏,请大家自行调试,因为下面的脚本是我用在真实环境中copy过来的,只是临时改了里面个别的参数,例如文件夹位置,密码等。。。。如有问题敬请谅解

一、完整备份

vifull_mysqldump.sh

#!/bin/sh
###########
#########
#########DIR_INFO############
date=`date+%Y%m%d`
BACK_DIR="/home/profiles/liuhaifeng/fullbackup"

FILE_DIR="/home/profiles/liuhaifeng"
#############################3MYSQL_BACK#########################
if[!-d$BACK_DIR$date];then
mkdir-p$BACK_DIR$date
fi
/usr/local/mysql/bin/mysql-uroot-p'123456'-h127.0.0.1-P3306-e"FLUSHTABLESWITHREADLOCK"
/usr/local/mysql/bin/mysqldump-uroot-p'123456'-h127.0.0.1-P3306--default-character-set=gbk--opt--triggers-R--hex-blob--flush-logs--master-data=2--all-databases>$BACK_DIR$date/fullbackup.sql
/usr/local/mysql/bin/mysql-uroot-p'123456'-h127.0.0.1-P3306-e"UNLOCKTABLES"
##########################

################getpostion###############

sed-n"22p"a.sql|awk-F'=|,|;''{print$2,$4}'>$FILE_DIR/postion

#################FTPTO16.1###############
#################FTPINFO###############
HOST="192.168.16.1"
USER="user"
PASSWD="password"
FTP_DIR="database"

ftp_db()
{
ftp-n</dev/null2>&1&
open$HOST
user$USER$PASSWD
binary
prompt
cd$FTP_DIR
put$1
bye
!
echo"sqlbackupsuecss!!"
}

##############################################

#####################TRANSFERINFL#############
cd$BACK_DIR$date
if[!-ffullbackup.sql];then
echo"mysqldumpbackfilefaild!!!pleasecheck"
exit1
fi
/bin/tarzcffullbackup_$date.tar.gzfullbackup.sql
sleep5
ftp_dbfullbackup_$date.tar.gz

二、做增量备份,根据上面完整备份所获得的postion以及binlog与服务器当前的postion和binlog做增量备份,备份后把当前的postion以及binlog存到postion文件中,留坐下一次增量备份的其实点。

vizl_backup.sh

#!/bin/sh
#####forzengliangbackup########
DATE=`date+%Y%m%d`
OLDDATE=`date--date='10daysago'+%Y%m%d`
BACK_DIR="/data/mysql2/"
FILE_DIR="/home/profiles/liuhaifeng"
startbinlog=`awk'{print$1}'$FILE_DIR/postion`
startpostion=`awk'{print$2}'$FILE_DIR/postion`

cd$FILE_DIR
mysql-uroot-p123456-S/tmp/mysql.sock3306-h192.168.16.3-e"showmasterstatus\G;"|awk'{print$2}'>nowpostion
stopbinlog=`sed-n'3p'$FILE_DIR/nowpostion`
stoppostion=`sed-n'4p'$FILE_DIR/nowpostion`

if["$startbinlog"=="$stopbinlog"];then
mysqlbinlog--start-position=$startpostion--stop-position=$stoppostion$BACK_DIR$startbinlog>>ch_zlback_$DATE.sql
else
startline=`awk"/$startbinlog/{printNR}"$BACK_DIR/mysql-bin-bj1.index`
stopline=`wc-l$BACK_DIR/mysql-bin-bj1.index|awk'{print$1}'`
foriin`seq$startline$stopline`
do
binlog=`sed-n"$i"p$BACK_DIR/mysql-bin-bj1.index|sed's/.\///g'`
case"$binlog"in
"$startbinlog")
mysqlbinlog--start-position=$startpostion$BACK_DIR$binlog>>ch_zlback_$DATE.sql
;;
"$stopbinlog")
mysqlbinlog--stop-position=$stoppostion$BACK_DIR$binlog>>ch_zlback_$DATE.sql
;;
*)
mysqlbinlog$BACK_DIR$binlog>>ch_zlback_$DATE.sql
esac
done
fi


####forftp######
HOST="192.168.16.1"
USER="user"
PASSWD="password"
FTP_DIR="database"

ftp_db()
{
ftp-n</dev/null2>&1&
open$HOST
user$USER$PASSWD
binary
prompt
cd$FTP_DIR
put$1
bye
!
echo"sqlbackupsuecss!!"
}

if[-fch_zlback_$DATE.sql];then
tarczfch_zlback_$DATE.tar.gzch_zlback_$DATE.sql
sleep3
ftp_dbch_zlback_$DATE.tar.gz
echo"$stopbinlog$stoppostion">$FILE_DIR/postion
rm-rfch_zlback_$OLDDATE.sqlch_zlback_$OLDDATE.tar.gz
else
echo"$DATEbackupfail!!!!"
fi

三、做好计划任务

把增量备份脚本和完全备份脚本按照想要的时间写在计划任务中,做定时的增量备份。

当然还原的时候需要按照顺序依次还原。