程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> MYSQL數據庫 >> MySQL綜合教程 >> MySQL 全量及增量備份,基於xtrabackup 2.3.5,xtrabackup2.3.5

MySQL 全量及增量備份,基於xtrabackup 2.3.5,xtrabackup2.3.5

編輯:MySQL綜合教程

MySQL 全量及增量備份,基於xtrabackup 2.3.5,xtrabackup2.3.5


昨天一個pgp加密盤壞了,東西全丟了。。。,我的筆記啊!我咋怎麼2呢。。

備份個腳本吧,方便以後手機查看,話說我都快忘記帳號密碼了

備注:腳步恢復時只能恢復到備份前的狀態,如果需要恢復到當前狀態,還需配合binlog,睡覺就這樣

#!/bin/sh  

####################################################
#  AUTHOR          :             JusonSummer       #
#  VERSION         :               V1.0.0          #
#  DATE            :              2016-08-13       #
#  CORPORATION     :              FiberHome        #
####################################################

#基於xtrabackup 2.3.5  
#星期四,星期日全備,其他工作日每天一次增量備份,手動執行可通過設置WEEK_NUM來確定是增量還是全量

for i in /etc/profile.d/*.sh;
do
  if [ -r "$i" ]; then
    . $i
  fi
done
if [ -f /root/.bash_profile ]; then
  . /root/.bash_profile
fi

      
INNOBACKUPEX=innobackupex                    #INNOBACKUPEX的命令  
  
#mysql目標服務器以及備份用戶及密碼  
MYSQL_USER=root
MYSQL_PASSWORD=root
MYSQL_HOST=localhost
MYSQL_PORT=3306  
MY_CNF=/etc/my.cnf 
MYSQL_CMD=" --user=$MYSQL_USER --password=$MYSQL_PASSWORD --host=$MYSQL_HOST --port=$MYSQL_PORT"  
  
TMP_LOG="/var/log/backup.$$.log"               # $$當前shell進程號
BACKUP_DIR=/mysql_backup                       # 備份的主目錄   
FULLBACKUP_DIR=$BACKUP_DIR/full                # 全庫備份的目錄   
INCRBACKUP_DIR=$BACKUP_DIR/incre               # 增量備份的目錄  
BACKUP_LOG_DIR=$BACKUP_DIR/log                 # 備份日志的目錄
LOGFILE_NAME=backup_`date +%Y%m%d%H%M%S`.log   # 備份日志文件名

#星期
WEEK_NUM=`date +%w` 
#WEEK_NUM=0

#新建全備和差異備份的目錄  
  
mkdir -p $FULLBACKUP_DIR  
mkdir -p $INCRBACKUP_DIR 
mkdir -p $BACKUP_LOG_DIR 

#colour level
SETCOLOR_SUCCESS="echo -en \\033[1;32m"
SETCOLOR_FAILURE="echo -en \\033[1;31m"
SETCOLOR_WARNING="echo -en \\033[1;33m"
SETCOLOR_NORMAL="echo -en \\033[0;39m"

#日志輸出函數
LogMsg()
{
        time=`date "+%D %T"`
        echo "[$time] : INFO    : $*"
		echo "[$time] : INFO    : $*" >>$BACKUP_LOG_DIR/$LOGFILE_NAME
        $SETCOLOR_NORMAL
}

LogWarnMsg()
{
        time=`date "+%D %T"`
        $SETCOLOR_WARNING
        echo "[$time] : WARN    : $*"
        $SETCOLOR_NORMAL
}

LogSucMsg()
{
        time=`date "+%D %T"`
        $SETCOLOR_SUCCESS
        echo "[$time] : SUCCESS : $*"
		echo "[$time] : SUCCESS : $*" >>$BACKUP_LOG_DIR/$LOGFILE_NAME
        $SETCOLOR_NORMAL
}

LogErrorMsg()
{
        time=`date "+%D %T"`
        $SETCOLOR_FAILURE
        echo "[$time] : ERROR   : $*"
        $SETCOLOR_NORMAL
}
   
# 檢查innobackupex錯誤輸出
check_innobackupex_fail()
{
    #保留一份備份的詳細日志
    cat $TMP_LOG>>$BACKUP_LOG_DIR/$LOGFILE_NAME 
	if [ -z "`tail -2 $TMP_LOG | grep 'completed OK!'`" ] ; then
    LogErrorMsg "$INNOBACKUPEX命令執行失敗" 
    rm -f $TMP_LOG
	LogErrorMsg "錯誤日志請查看 $BACKUP_LOG_DIR/$LOGFILE_NAME"
    exit 1
  fi
}

   
# 選項檢測
$INNOBACKUPEX -v  
if [ `echo $?` -ne 0 ]; then  
    LogErrorMsg "$INNOBACKUPEX命令不存在,請確認是否安裝xtrabackup或環境變量是否配置" 
    exit 1  
fi       
  
PORTNUM00=`netstat -lnt|grep ${MYSQL_PORT}|wc -l`
if [ $PORTNUM00 = 0  ];
then
    LogErrorMsg "MySQL處於關閉狀態,請打開MySQL."
    exit 1
fi	  
  
if ! `echo 'exit' | mysql -s $MYSQL_CMD --show-warnings=false` ; then  
    LogErrorMsg "數據庫的用戶名、密碼、主機名或端口中存在錯誤配置!"
    exit 1 
fi  
  

  
# 備份的頭部信息   
LogMsg "----------------------------------------------"   
LogMsg "$0: MySQL備份腳本"  
LogMsg "----------------------------------------------"  
LogMsg "開始於: `date +%F' '%T`"   
     
    
#查找最新的完全備份文件夾(不包括父級目錄)  
LATEST_FULL_BACKUP=`find $FULLBACKUP_DIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n" | sort -nr | head -1`  

  
# 查找最最新全庫備份時間,日期格式:2016-07-20
LATEST_FULL_BACKUP_CREATED_DATE=`stat -c %y $FULLBACKUP_DIR/$LATEST_FULL_BACKUP | cut -c 1-10`  
  
  
#星期一,星期二,星期三,星期五,星期六執行增量備份  
if [ $WEEK_NUM -eq 1 -o $WEEK_NUM -eq 2 -o $WEEK_NUM -eq 3 -o $WEEK_NUM -eq 5 -o $WEEK_NUM -eq 6 ] ; then 
    LogMsg  "************************************"  
    LogMsg  "正在執行增量備份...請稍等..."  
    LogMsg  "************************************"
    
	#無全備時,需先做全備
	if [ -z $LATEST_FULL_BACKUP ] ; then
        LogErrorMsg "服務器還沒有做過全備份,請根據安裝文檔先做一次全備!"
	    exit 1
    fi 
    	
    # 以最新的全備目錄名在增量備份目錄下新建目錄  
    LogMsg "增量備份放在$INCRBACKUP_DIR/$LATEST_FULL_BACKUP目錄下"    
    NEW_INCRDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP  
    mkdir -p $NEW_INCRDIR  
  
    # 查找最新的增量備份是否存在.指定一個備份的路徑作為增量備份的基礎  
    LATEST_INCR_BACKUP=`find $NEW_INCRDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n"  | sort -nr | head -1`  
        if [ ! $LATEST_INCR_BACKUP ] ; then  
            INCRBASEDIR=$FULLBACKUP_DIR/$LATEST_FULL_BACKUP  
            LogMsg "增量備份將以$INCRBASEDIR備份集作為備份基礎"   
        else  
            INCRBASEDIR=$INCRBACKUP_DIR/$LATEST_FULL_BACKUP/$LATEST_INCR_BACKUP
            LogMsg "增量備份將以$INCRBASEDIR備份集作為備份基礎"  
        fi  
   
    $INNOBACKUPEX --defaults-file=$MY_CNF $MYSQL_CMD --incremental $NEW_INCRDIR --incremental-basedir $INCRBASEDIR > $TMP_LOG 2>&1  
	check_innobackupex_fail
  
    LogMsg "數據庫成功增量備份到:$NEW_INCRDIR"  
	
#星期四,星期日執行全量備份 
elif [ $WEEK_NUM -eq 0 -o $WEEK_NUM -eq 4 ] ; then 
    LogMsg  "************************************"  
    LogMsg  "正在執行全新的完全備份...請稍等..."  
    LogMsg  "************************************"  
	
    $INNOBACKUPEX --defaults-file=$MY_CNF $MYSQL_CMD $FULLBACKUP_DIR> $TMP_LOG 2>&1   
    check_innobackupex_fail
  
    LogMsg "數據庫成功全量備份到:$FULLBACKUP_DIR"    
fi  
  
 
#刪除過期的全量備份以及增量備份,過期時間為7天 
  
LogMsg "尋找過期的備份文件...請稍等..."   

EXPIRE_FILE=`find $FULLBACKUP_DIR/ -mindepth 1 -maxdepth 1 -type d -mtime +7 -printf "%P\t" ` 

if [ -z "$EXPIRE_FILE" ];then   
    LogMsg "未找到可以刪除的過期備份文件" 
else
    for efile in `find $FULLBACKUP_DIR/ -mindepth 1 -maxdepth 1 -type d -mtime +7 -printf "%P\n"` 
    do  
        LogMsg "刪除過期全備文件:$efile"
	    rm -rf $FULLBACKUP_DIR/$efile
		LogMsg "刪除過期增量備份文件:$efile"
        rm -rf $INCRBACKUP_DIR/$efile 	
    done 
fi
	 
LogSucMsg "備份完成於: `date +%F' '%T' '`"  
exit 0  

  

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved