设为首页 收藏本站
查看: 852|回复: 0

shell脚本:mysql全备与binlog增量备份

[复制链接]

尚未签到

发表于 2018-8-27 13:13:39 | 显示全部楼层 |阅读模式
#!/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} > ${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 < ${MYSQL_BACKUP_LIST})
  
    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 < ${MYSQL_BACKUP_LIST}
  
}
  

  
##
  
# 增量备份
  
#
  
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 < ${TEMP_NEED_DO_FILE} )
  
    [ "${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 < ${TEMP_NEED_DO_FILE}
  
    }
  
    [ -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}



运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.iyunv.com/thread-557355-1-1.html 上篇帖子: shell脚本:nginx访问日志切割与打包上传 下篇帖子: shell脚本:脚本分析汇总ping日志文件
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表