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

脚本功能: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} << _EOF_
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 < ${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}

---------------

时间: 2024-11-09 00:17:29

shell脚本:mysql全备与binlog增量备份的相关文章

Linux shell脚本--mysql全备计划任务

Linux下mysql的全备计划任务_shell小脚本,适用于数据量较小的mysql. #!/bin/bash PORT='5001' USER='admin' PASSWD='admin' SOCKED="/data/socket/mysql${PORT}.sock" BACKUP_FILE='/data/mysql/backup'  #注意磁盘空间情况 BACKUP_SAVE_DAYS='2' #删除N天之前的 CMD1='show databases;' Time=`date +

mysql 利用binlog增量备份,还原实例

mysql 利用binlog增量备份,还原实例 张映 发表于 2010-09-29 分类目录: mysql 一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin

MySQL 全量及增量备份,基于xtrabackup 2.3.5

昨天一个pgp加密盘坏了,东西全丢了...,我的笔记啊!我咋怎么2呢.. 备份个脚本吧,方便以后手机查看,话说我都快忘记帐号密码了 备注:脚步恢复时只能恢复到备份前的状态,如果需要恢复到当前状态,还需配合binlog,睡觉就这样 #!/bin/sh #################################################### # AUTHOR : JusonSummer # # VERSION : V1.0.0 # # DATE : 2016-08-13 # # CO

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性

利用SHELL脚本来验证Oracle数据库RMAN备份集的有效性 作者:赵全文  网名:guestart 我们生产环境的Oracle数据库都做了RMAN备份,是采用了一周的RMAN备份保留策略:除了使用RMAN备份以外,我们还使用了爱数(Eisoo)备份软件来进行备份,可以说是做到了有备无患.可是,如果有一天,Oracle数据库由于主机层面硬件原因或是数据库层面的原因不能对外提供高可用服务的时候,假设数据丢了一大部分,我们只有用RMAN备份来进行恢复,再如果发现,RMAN备份失效了,那就往地缝里

MySQL和MSSQL差异(增量)备份的原理

MySQL和MSSQL差异(增量)备份的原理 对于真正的增量备份来说,只需要记录当前每页最后的检查点的LSN,如果大于之前全备时的LSN,则备份该页面,否则不用备份 这大大加快了备份速度和恢复时间,同时这也是xtrabackup工具增量备份原理 MSSQL 完整备份 f 差异备份 f f

shell脚本+mysql数据库组合进行数据安全监控

shell脚本 + mysql数据库 实现企业级会话边界控制器文件解析并告警 dirsx30001.sh处理文件,生成mysql备份文件的方式进行导入 #/bin/bash ##环境变量 path=/home/sbclog/sx30001 ##由于抓取的日志文件中没有年份参数,故导入系统年份参数,以达到数据库时间字段datetime ##也可以抓取tar包的名字中的字段 date_year=`date|cut -c 25-` #test ! -e $path/*.tar &&echo &q

MySQL 利用binlog增量备份+还原实例

一,什么是增量备份 增量备份,就是将新增加的数据进行备份.假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,很显然,我只要备份增加的数据.这样减少服务器的负担. 二,启用binlog vi my.cnf log-bin=/var/lib/mysql/mysql-bin.log,如果是这样的话log-bin=mysql-bin.log默认在datadir目录下面 [[email protected] mysql]

MySQL 利用xtrabackup进行增量备份详细过程汇总

Xtrabackup下载.安装以及全量备份请参考:http://blog.itpub.net/26230597/viewspace-1465772/ 1,创建mysql备份用户 mysql -uroot --password="" -e"CREATE USER 'backup'@'192.168.%' IDENTIFIED BY '123456'"; mysql -uroot --password="" -e"GRANT RELOAD,

常见的一些shell脚本书写,定时删除,压缩备份

删除与备份videoportal日志 写执行删除过期日志的shell脚本 以下参考文档:https://blog.csdn.net/yuan882696yan/article/details/77885339 执行删除 /home/test/REPORT/send/videoportal23890234823904.txt这个目录下文档(当前是保留五天日志) 定时任务执行这个目录下的shell脚本:   /home/myshell/test.sh  (需要进行赋权操作chmod +x test.