MYSQL增量备份

转载 2007年10月08日 14:27:00

原贴:http://flutey.3322.org/node/96

MYSQL增量备份
数据库

#!/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 -u ${DB_USER} -p${PASSWD} -e "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 -x -u ${DB_USER} -p${PASSWD} ${DB_NAME} > ${FILENAME} &
    BINLOG=`tail -n 1 ${DATADIR}*-bin.index | sed 's//.////g'`
    logdate=`ls -l ${DATADIR}${BINLOG} | awk '{print $6, $7, $8}'`
    logdate=`date -d "$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 -n 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 -n 1 ${DATADIR}/*-bin.index | sed 's//.////g'`
LOG_FILES=`grep -A 3 "${BEG_LOG}" ${DATADIR}/*-bin.index | sed 's//.////g'`
logdate=`ls -l ${DATADIR}${END_LOG} | awk '{print $6, $7, $8}'`
logdate=`date -d "$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 -n 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 -s -u ${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 -s -u ${DB_USER} -p${PASSWD} --database=${DB_NAME} --stop-position=${END_POS} ${DATADIR}${loop} >> ${FILENAME}
  elif [ ${BEG_LOG} = ${loop} ]
      then
      ${MYSQL_BIN}/mysqlbinlog -s -u ${DB_USER} -p${PASSWD} ${OFFSET} --start-position=${BEG_POS} --database=${DB_NAME} ${DATADIR}${loop} > ${FILENAME}
  else
      ${MYSQL_BIN}/mysqlbinlog -s -u ${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

  

mysql实现增量备份

有点要注意 如果你误删了表 想通过这个恢复 必须恢复日志里面有创建表的日志 不然的话是无法回复的  就是必须是从你开始创建表的时候就已经记录日志了  恢复到哪个位置 就按照哪个位置来计算 my...
  • ebw123
  • ebw123
  • 2013年07月24日 22:27
  • 25546

MySQL数据库备份还原(基于binlog的增量备份)

1 简介 1.1 增量备份简介 增量备份是指在一次全备份或上一次增量备份后,以后每次的备份只需备份与前一次相比增加或者被修改的文件。这就意味着,第一次增量备份的对象是进行全备后...
  • JesseYoung
  • JesseYoung
  • 2014年07月05日 22:34
  • 7200

mysql增量备份和全量备份

项目需要对mysql数据库每天进行一次增量备份,一周进行一次全量备份,研究了大半天,整理出来的脚本,其实停简单的,理解了binlog其实就是so easy. 1.前提 必须要开启bin-log才可以。...
  • wd501771382
  • wd501771382
  • 2017年03月08日 11:34
  • 1270

mysql增量备份还原详解

1 简介     基于binlog的恢复需要建立在全量备份恢复基础上。使用mysqldump的全量备份的方法在我前面的文章里有详细介绍,可以参考: http://blog.csdn.net/je...
  • u010098331
  • u010098331
  • 2016年03月19日 17:33
  • 492

mysql 利用binlog增量备份,还原实例(日志备份数据库)

一,什么是增量备份 增量备份,就是将新增加的数据进行备份。假如你一个数据库,有10G的数据,每天会增加10M的数据,数据库每天都要备份一次,这么多数据是不是都要备份呢?还是只要备份增加的数据呢,...
  • linuxheik
  • linuxheik
  • 2017年05月09日 17:33
  • 847

Centos7 实现MySQL局域网备份(包含全备份,日志增量备份)

数据库备份操作是非常重要的一步,针对上线系统来说,没有备份的数据库是不安全的。本博文通过查阅网上资料,实现了mysql数据库通过shell脚本文件的全备份,增量备份和局域网内定时备份操作。...
  • u012466304
  • u012466304
  • 2017年01月14日 20:02
  • 1120

Mysql 增量备份和全量备份

在日常运维工作中,对mysql数据库的备份是万分重要的,以防在数据库表丢失或损坏情况出现,可以及时恢复数据。 线上数据库备份场景: 每周日执行一次全量备份,然后每天下午1点执行MySQLdum...
  • gredn
  • gredn
  • 2017年01月17日 14:46
  • 2578

MySQL数据库增量备份及恢复方案

MySQL数据库增量备份及恢复方案   u  前言        操作系统崩溃、电源故障、文件系统崩溃和硬件故障等异常状况都可能导致我们正在使用的数据库出现故障而产生数据库中数据不一致的情况。为...
  • hijiankang
  • hijiankang
  • 2013年09月03日 16:45
  • 14484

MySQL增量备份与恢复实例

小量的数据库可以每天进行完整备份,因为这也用不了多少时间,但当数据库很大时,就不太可能每天进行一次完整备份了,这时候就可以使用增量备份。增量备份的原理就是使用了mysql的binlog日志。 本次操作...
  • giianhui
  • giianhui
  • 2016年11月09日 09:03
  • 2669

mysql mysqldump数据备份和增量备份(转)

mysql mysqldump数据备份和增量备份 本篇文章主要讲如何使用shell实现mysql全量,增量备份,还可以按时间备份。   本篇文章主要讲如何使用shell实现mys...
  • javastart
  • javastart
  • 2014年10月15日 14:42
  • 4296
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:MYSQL增量备份
举报原因:
原因补充:

(最多只允许输入30个字)