脚本功能:mysql库备份脚本,全备与binlog日志备份
脚本可以根据指定的参数进行全备,其余时间备份binlog日志
---------------#!/bin/bash
# description:Trian Server backup databases
# revision on 2016-02-18
# by colin
#
####################################
# 功能说明:该脚本运用于mysql每天备份与上传
#
# 使用说明:
# ./mysql_backup.sh /mysql/hlj/qqhr/
#+ 脚本后面的参数一表示备份文件在日志存储服务器上的存储路径
#
####################################
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
RUN_LOG='/var/log/cron_scripts_run.log'
[ ! -f ${RUN_LOG} ] && touch ${RUN_LOG}
EchoGoodLog ()
{
echo -e "\033[32m`date +%F" "%T":"%N` $*\033[0m" >> ${RUN_LOG}
}
EchoBadLog ()
{
echo -e "\033[31m`date +%F" "%T":"%N` $*\033[0m" >> ${RUN_LOG}
}
EchoGoodLog "Now, Script: `basename $0` run."
CD_DIR="${1?Usage: $(basename $0) /mysql/hlj/qqhr/}"
RUNLOG_MAX_NUM=100000
RUNLOG_MAX_DELNUM=5000
SEND_MAX_TIME=6
SEND_WHILE_SLEEP_TIME=30
BACK_SAVE_MAX_DAY=90
#############################
# [0-6],0表示星期天,1-6表示星期一至星期六
#+ BACKUP_FULL_DAY=6表示在每周的第6天进行全备
#
BACKUP_FULL_DAY=6
#############################
CleanRunLog ()
{
CLEANLOGFILE=${1?"Usage: $FUNCNAME log_file_name"}
TEMP_WC=`cat ${CLEANLOGFILE} |wc -l`
[ "${TEMP_WC}" -gt "${RUNLOG_MAX_NUM}" ] && {
sed -i "1,${RUNLOG_MAX_DELNUM}d" ${CLEANLOGFILE} && EchoGoodLog "Clean up the ${CLEANLOGFILE}..."
}
EchoGoodLog "Script: `basename $0` run done."
exit 0
}
#############################
##
# 下面这两个变量设置为固定值,
#+ 就可以进行相应的模拟调试
#
#NOWTIME='2016-09-01'
#WEEK_DAY='6'
NOWTIME=$(date +%Y-%m-%d)
WEEK_DAY=$(date +%w)
#############################
FILEBAKDIR='/data/store/dbback'
MYSQL_DATA_DIR='/data/mysql'
BIN_lOG_NAME='mysql-bin'
DBUSER='数据库用户'
DBPASSWD='数据库密码'
FILETYPE='mysql_bak'
STATION=`echo $(hostname) |awk -F- '{print $3}'|tr [A-Z] [a-z]`
#############################
##
# define the ftp server
#
FTPSERVER='IP地址'
FTPUSER='用户名'
FTPPASSWD='密码'
SSHPORT='端口'
#############################
##
# 全备mysql指定数据库
# $1:需要备份的数据库名;
#+ $2:刷新bin-log的标记Y,不传递参数$2时,默认值N。
# Usage: FullBackMysqlData rht_train Y
#
FullBackMysqlData ()
{
local DATA_NAME=$1
FLUSH_LOG=${2:-N}
BACK_SQL_NAME="$NOWTIME.${DATA_NAME}.sql"
BACK_TAR_NAME="${BACK_SQL_NAME%.sql}.tar.gz"
[ -d "$FILEBAKDIR/${DATA_NAME}" ] || mkdir $FILEBAKDIR/$DATA_NAME -p
cd $FILEBAKDIR/$DATA_NAME && {
if [ "${FLUSH_LOG}" = 'Y' ];then
mysqldump -u$DBUSER -p$DBPASSWD --default-character-set=utf8 --flush-logs -R ${DATA_NAME} > ${BACK_SQL_NAME}
else
mysqldump -u$DBUSER -p$DBPASSWD --default-character-set=utf8 -R ${DATA_NAME} > ${BACK_SQL_NAME}
fi
if [ $? -eq 0 ];then
EchoGoodLog "Backup: ${DATA_NAME} was successfully."
tar -zcf ${BACK_TAR_NAME} --remove-files ${BACK_SQL_NAME}
if [ $? -eq 0 ];then
[ -e "${BACK_TAR_NAME}" ] && EchoGoodLog "Tar: ${DATA_NAME} was successfully."
else
EchoBadLog "Tar: ${DATA_NAME} was failed, Please check..."
fi
else
EchoBadLog "Backup: ${DATA_NAME} was failed, Please check..."
fi
}
}
##
# 增量备份:备份binlog日志
#
BackMysqlBinLog ()
{
local BACK_DIR=$1
BACK_BINLOG_NAME="$NOWTIME.B${WEEK_DAY}.tar.gz"
[ -d ${BACK_DIR} ] || mkdir -p ${BACK_DIR}
cd ${BACK_DIR} && mv -t ${BACK_DIR} $( find ${MYSQL_DATA_DIR} -name "mysql-bin.*" | grep -E "[0-9]{6}" ) && {
mysql -u$DBUSER -p$DBPASSWD -e "use mysql;flush logs;" # 需要用户有mysql库的权限 #
tar -czf $FILEBAKDIR/${BACK_BINLOG_NAME} --remove-files * && EchoGoodLog "Backup: ${BACK_BINLOG_NAME} was successfully."
} || EchoBadLog "Cut: ${BACK_BINLOG_NAME} was failed, Please check..."
return 0
}
##
# 清理超过90天的备份
#
CleanOldFile()
{
local CLEAN_DIR=$1
[ -d "${CLEAN_DIR}" ] && cd ${CLEAN_DIR} && {
for FILENAME in `find . -maxdepth 1 -name "*.tar.gz" -ctime +${BACK_SAVE_MAX_DAY} | awk -F/ '{print $2}'`
do
rm $FILENAME && EchoGoodLog "Clear: ${CLEAN_DIR}/$FILENAME."
done
}
}
##
# FTP自动化上传函数
#
FTP_LOG_DIR="/tmp/ftp_err"
[ -d ${FTP_LOG_DIR} ] || mkdir -p ${FTP_LOG_DIR}
FTP_ERROR_LOG="${FTP_LOG_DIR}/ftp_temp_${FILETYPE}_err$$.log"
SendLog ()
{
local SENDLOGFILE=$1
ftp -ivn ${FTPSERVER} 21 >${FTP_ERROR_LOG} <
user ${FTPUSER} ${FTPPASSWD}
passive
bin
lcd ${LCD_DIR}
cd ${CD_DIR}
put ${SENDLOGFILE}
bye
_EOF_
##
# 统计前面FTP运行输出的错误日志记录行数
#
LOG_COUNT=`grep -w "^226" ${FTP_ERROR_LOG}|wc -l`
if [ ${LOG_COUNT} -eq 1 ];then
EchoGoodLog "Send: ${SENDLOGFILE} to ftp_server was successfully."
return 0
else
EchoBadLog "Send: ${SENDLOGFILE} more than $x time."
sleep 30
return 1
fi
}
REUPLOADLIST="/var/log/reupload_list_${FILETYPE}_${STATION}.log"
TEMP_REUPLOADLIST="/var/log/temp_reupload_list_${FILETYPE}_${STATION}.log"
[ -f ${TEMP_REUPLOADLIST} ] && rm ${TEMP_REUPLOADLIST}
RunSendLog ()
{
local SENDLOGNAME=$1
local x=1
local i=1
until [ "$i" -eq 0 ];do
[ "$x" -gt "${SEND_MAX_TIME}" ] && {
EchoBadLog "Send: ${SENDLOGNAME} to ftp_server was failed, Please check..."
echo "${LCD_DIR};;${CD_DIR};;${SENDLOGFILE}" >> ${TEMP_REUPLOADLIST}
break
}
SendLog "${SENDLOGNAME}"
i=`echo $?`
x=`expr $x + 1`
done
}
##
# 全备
#
[ "${WEEK_DAY}" -eq "${BACKUP_FULL_DAY}" ] && {
xx=1
MYSQL_BACKUP_LIST='/var/log/mysqlbackuplist'
mysql -u$DBUSER -p$DBPASSWD -e "show databases;" | grep "rht_" > ${MYSQL_BACKUP_LIST}
LAST_WHILE_NUM=$(wc -l
while read noteline
do
[ "${xx}" -ge "${LAST_WHILE_NUM}" ] && FullBackMysqlData $noteline Y || FullBackMysqlData $noteline
xx=$( expr $xx + 1 )
LCD_DIR="${FILEBAKDIR}/${noteline}" # 申明变量LCD_DIR给函数RunSendLog使用 #
RunSendLog ${BACK_TAR_NAME}
CleanOldFile ${LCD_DIR}
done
}
##
# 增量备份
#
LCD_DIR="${FILEBAKDIR}" # 申明变量LCD_DIR给函数RunSendLog使用 #
BackMysqlBinLog "${LCD_DIR}/${WEEK_DAY}" && {
[ -e "${LCD_DIR}/${BACK_BINLOG_NAME}" ] && RunSendLog ${BACK_BINLOG_NAME} && CleanOldFile ${LCD_DIR}
[ -d "${LCD_DIR}/${WEEK_DAY}" ] && rm -rf "${LCD_DIR}/${WEEK_DAY}"
}
##
# 重传上次发送失败的文件
#
ReUploadFile(){
TEMP_NEED_DO_FILE=$1
REUPLOADLIST_NUM=$( wc -l
[ "${REUPLOADLIST_NUM}" -ge 1 ] && {
while read line
do
LCD_DIR=`echo ${line}|awk -F";;" '{print $1}'`
CD_DIR=`echo ${line}|awk -F";;" '{print $2}'`
REUPLOADFILENAME=`echo ${line}|awk -F";;" '{print $3}'`
[ -f "${LCD_DIR}/${REUPLOADFILENAME}" ] && runSendLog ${REUPLOADFILENAME}
done
}
[ -e ${TEMP_NEED_DO_FILE} ] && rm ${TEMP_NEED_DO_FILE}
}
[ -s ${REUPLOADLIST} ] && ReUploadFile ${REUPLOADLIST}
[ -f ${TEMP_REUPLOADLIST} ] && mv ${TEMP_REUPLOADLIST} ${REUPLOADLIST}
[ -f ${FTP_ERROR_LOG} ] && rm ${FTP_ERROR_LOG}
CleanRunLog ${RUN_LOG}
---------------