• MYSQL增量备份


    Code
    #!/bin/sh
    #
    +++++++++++++mysqlback++++++++++++
    #
    a mysql incremental backup script.
    #
    by flute
    #
    ++++++++++++++++++++++++++++++++++
    BAK_DIR="."
    while getopts :u:p:d:c OPTION
    do
      case 
    ${OPTION} in
          u)
              DB_USER
    =${OPTARG}
              ;;
          p)
              PASSWD
    =${OPTARG}
              ;;
          d)
              DB_NAME
    =${OPTARG}
              ;;
          b)
              BAK_DIR
    =${OPTARG}
              ;;
          c)
              INIT
    ="true"
              ;;
          \
    ?)
          echo 
    "Usage: mysqlback.sh [OPTIONS]"
          echo 
    "-u        user for login"
          echo 
    "-p        Password to use when connecting to server"
          echo 
    "-d        which database to backup"
          echo 
    "-b        backup database files to directory,default is current directory"
          echo 
    "-c        must be usage for first backup,is complete backup"
          exit 
    1
          ;;
      esac
    done

    MYSQL_BIN
    =/usr/local/mysql/bin
    DATADIR
    =`${MYSQL_BIN}/mysql -${DB_USER} -p${PASSWD} -"show variables like 'datadir'" | sed -n '2p' | awk '{print $NF}'`
    upfile ()    
    #上传文件
    {
        _FNAME
    =$1
        _TNAME
    =`echo ${_FNAME}|sed 's/\.sql//g'`
        _TNAME
    ="${_TNAME}.tgz"
        tar 
    -czf ${_TNAME} ${_FNAME}
        
    if [ $? = 0 ]
            then
            scp 
    ${_TNAME} 192.168.1.10:/usr/local/mysql/bak
            
    if [ $? = 0 ]
                then
                echo 
    "upfile success."
            
    else
                logger 
    -f ~/mysqlbak.log -t MYSQLBAK 'upload file ${_TNAME} failed'
                ssh 
    192.168.1.10 "logger -f ~/mysqlbak.log -t MYSQLBAK 'upload file ${_TNAME} failed'"
            fi
        
    else
            echo 
    "tar file failed."
        fi
    }
    bak_file ()    
    #获取备份文件名
    {
        _DB_NAME
    =$1
        _BAK_DIR
    =$2
        _BDATE
    =`date "+%Y-%m-%d"`
        _BAKFILE
    ="${_BAK_DIR}/_${_DB_NAME}_${_BDATE}.sql"
        
    if [ ! -f ${_BAKFILE} ]
        then
            echo 
    ${_BAKFILE}
            
    return 0
        
    else
        ID
    =1
        
    while [ 1 ]
              
    do
              _BAKFILE
    ="${_BAK_DIR}/_${_DB_NAME}_${_BDATE}_${ID}.sql"
              
    if [ ! -f ${_BAKFILE} ]
                  then
                  echo 
    ${_BAKFILE}
                  
    return 0
              fi
              ID
    =`expr $ID + 1`
        done
            
        fi
    }
    #进行完全备份
    if [ "${INIT}" = "true" ]   
    then
        BDATE
    =`date "+%Y-%m-%d"`
        FILENAME
    ="${DB_NAME}_${BDATE}.sql"
        
    ${MYSQL_BIN}/mysqldump --opt --${DB_USER} -p${PASSWD} ${DB_NAME} > ${FILENAME} &
        BINLOG
    =`tail -1 ${DATADIR}*-bin.index | sed 's/\.\///g'`
        logdate
    =`ls -${DATADIR}${BINLOG} | awk '{print $6$7$8}'`
        logdate
    =`date -"$logdate" "+%Y-%m-%d %H:%M:00"`
        POSITION
    =`$MYSQL_BIN/mysqlbinlog --start-datetime="$logdate" --database=${DB_NAME} ${DATADIR}${BINLOG} | grep "# at [0-9]\{1,\}" | tail -1 | sed 's/#\ at\ //g'`
        echo "${POSITION}  ${BINLOG}" > mysqlback.ini   #记录增量备份起始点
        upfile ${FILENAME}
        exit
    fi
    #增量备份
    BEG_POS=`cat mysqlback.ini | awk '{print $1}'`
    BEG_LOG
    =`cat mysqlback.ini | awk '{print $2}'`
    END_LOG
    =`tail -1 ${DATADIR}/*-bin.index | sed 's/\.\///g'`
    LOG_FILES
    =`grep -3 "${BEG_LOG}" ${DATADIR}/*-bin.index | sed 's/\.\///g'`
    logdate
    =`ls -${DATADIR}${END_LOG} | awk '{print $6$7$8}'`
    logdate
    =`date -"$logdate" "+%Y-%m-%d %H:%M:00"`
    END_POS
    =`$MYSQL_BIN/mysqlbinlog --start-datetime="$logdate" --database=$DB_NAME ${DATADIR}$END_LOG | grep "# at [0-9]\{1,\}" | tail -1 | sed 's/#\ at\ //g'`
    echo "begain position:$BEG_POS"
    FILENAME
    =`bak_file ${DB_NAME} ${BAK_DIR}`
    if [ `echo ${FILENAME}|grep "_[0-9]\{1,\}.sql"` ]
    then
        OFFSET
    ='--offset=1'
    fi
    END_POS
    =`expr ${END_POS} + 1`
    err
    =0
    for loop in ${LOG_FILES}
    do
      
    if [ ${BEG_LOG} = ${END_LOG} ]
          then
          
    ${MYSQL_BIN}/mysqlbinlog --${DB_USER} -p${PASSWD} ${OFFSET} --start-position=${BEG_POS} --stop-position=${END_POS} --database=${DB_NAME} ${DATADIR}${loop} >> ${FILENAME}
      elif [ 
    ${END_LOG} = ${loop} ] 
          then
          
    ${MYSQL_BIN}/mysqlbinlog --${DB_USER} -p${PASSWD} --database=${DB_NAME} --stop-position=${END_POS} ${DATADIR}${loop} >> ${FILENAME}
      elif [ 
    ${BEG_LOG} = ${loop} ]
          then
          
    ${MYSQL_BIN}/mysqlbinlog --${DB_USER} -p${PASSWD} ${OFFSET} --start-position=${BEG_POS} --database=${DB_NAME} ${DATADIR}${loop} > ${FILENAME}
      
    else
          
    ${MYSQL_BIN}/mysqlbinlog --${DB_USER} -p${PASSWD} --database=${DB_NAME} ${DATADIR}${loop} >> ${FILENAME}
      fi
      
    if [ $? != 0 ]
          then
          err
    =1
      fi
    done

    if [ $err = 0 ]
    then
        END_POS
    =`expr ${END_POS} - 1`
        echo 
    "end position:${END_POS}"
        echo 
    "${END_POS}  ${END_LOG}" > mysqlback.ini
        upfile 
    ${FILENAME}
        echo 
    "mysql back success."
    else
        rm 
    ${FILENAME}
        logger 
    -f ~/mysqlbak.log -t MYSQLBAK 'Bakckup to $FILENAME failed with start position:$BEG_POS and end position:$END_POS.'
        ssh 
    192.168.1.10 "logger -f ~/mysqlbak.log -t MYSQLBAK 'Bakckup to $FILENAME failed with start position:$BEG_POS and end position:$END_POS.'"
    fi
    aliyun活动 https://www.aliyun.com/acts/limit-buy?userCode=re2o7acl
  • 相关阅读:
    Openwave V7 不支持中文的解决方法
    VBS的疑惑,它们不考虑效率吗?
    删除顽固 NTServic和webacc.exe病毒。
    我的电脑怎么多了一些乱七八糟的东西。
    阿怒再发,突然的发现,为了编码输入速度!
    庆祝开博,也算给自己加油!
    超级简单的工厂模式温度转换
    阿怒乱弹之VS05重构的提取方法操作不方便啊!
    随笔嘛!就是随便下笔~呵呵!
    Oracle数据库一样平常维护手册2
  • 原文地址:https://www.cnblogs.com/wangbin/p/1509925.html
Copyright © 2020-2023  润新知