Xtrabackup—InnoDB實現mysql熱備份


前面Zabbix使用的數據庫是mysql,數據庫備份不用多說,必須滴,由於使用的是innodb引擎,既然做,那就使用第三方強大的Xtrabackup工具來熱備吧,Xtrabackup的說明,參見https://my.oschina.net/u/1171265/blog/200437

  • 數據庫備份:

簡單粗暴,下面給出mysql備份腳本:

#!/bin/bash
#mysql熱備腳本,Version:1.0
#Author:jzd
#備份策略:每周一進行完整備份,以后每一天在前一天的基礎上進行增量備份
#
#備份目錄
back_dir="/back"

#備份數據庫信息
host="127.0.0.1"
dbuser="dbuser"
dbpasswd="dbpasswd"

#日志文件
back_log="${back_dir}/mysql_back.log"

#week day
week_day=`date +%w`
#yesterday
yesterday=`date +%F -d "1 days ago"`

#日志記錄函數
function log(){

  echo "`date` $1" | tee -a ${back_log}

}

#判斷當前日期,是周一進行全備份,其他時間進行增量備份
if [ ${week_day} -eq 1 ]; then
#完整備份
  log "周${week_day}開始完全備份..."
  innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} ${back_dir} &>> ${back_log}
  if [ $? -eq 0 ]; then
    log "完全備份完畢." 
    else
       log "完全備份出錯,請檢查."
       exit 1
  fi
  else
    let dir_num=`find ${back_dir} -type d -name "${yesterday}*" | wc -l`
    if [ ${dir_num} -ne 1 ]; then
      log "昨天增量目錄未找到或昨天備份目錄大於等於2個,請確認后再次備份."
      exit 1
    fi
    incremental_dir=`find ${back_dir} -type d -name "${yesterday}*"`
    log "周${week_day}開始增量備份..." 
    #增量備份
    innobackupex --host=${host} --user=${dbuser} --password=${dbpasswd} --incremental ${back_dir} --incremental-basedir=${incremental_dir} &>> ${back_log}
    if [ $? -eq 0 ]; then
      log "增量備份成功."
      else
        log "備份失敗,請檢查日志..."
        exit 1
    fi
fi

exit $?

 

需修改的地方,也可以寫成配置文件source進去,完全可以用在生產環境。

#備份目錄

back_dir="/back"

 

#備份數據庫信息

host="127.0.0.1"

dbuser="dbuser"

dbpasswd="dbpasswd"

 

#日志文件

back_log="${back_dir}/mysql_back.log"

 

  • 數據恢復:

話說備份容易,恢復不易啊,下面也給出恢復腳本,配合上面備份腳本使用,但是恢復完畢后,需手動恢復當日的二進制文件,恢復方法見開篇Xtrabackup介紹文章;

恢復腳本的星期和日期對應的轉換,搞得頭都大了,纏了兩天,判斷太多,導致太亂,於是多使用函數,發現自己對函數的使用加強了(哈哈,相對於以前,感覺自己有面向對象的思想了,但這是shell)

#!/bin/bash
#mysql數據恢復腳本
#Author:jzd
#Version:V1.0

#back dir
back_dir='/back'
#full back day
full_back_day=1
#today
today=`date +%F`
#week day
week_day=`date +%w`
#log file
recovery_log="${back_dir}/mysql_recovery.log"

#log
function log(){
  echo "`date` $1" | tee -a ${recovery_log}
}

#find back dir
function finddir(){
  if [ `find $back_dir -type d -name "$1*" | wc -l` -ne 1 ]; then
    log "發現備份目錄$1為0個或多於一個,請檢查..."
	exit 1
    else
      log "發現備份目錄`find $back_dir -type d -name "$1*"`"
      find_dir="`find $back_dir -type d -name "$1*"`"
  fi
}

#all recovery
function allredo(){
 log "開始完整備份恢復准備..."
 innobackupex --apply-log --redo-only $1 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "完整恢復准備出錯,請檢查..."
    exit 1
 fi
 log "完整備份恢復准備完成"
}

#incremental recovery
function incredo(){
 log "開始增量數據恢復准備..."
 innobackupex --apply-log --redo-only $1 --incremental-dir=$2 &>> ${recovery_log}
 if [ $? -ne 0 ]; then
    log "增量數據恢復准備出錯,請檢查..."
    exit 1
  fi
  log "增量數據$2恢復准備完成"
}
#real recovery
function recovery(){
  log "備份數據准備完成,開始恢復數據..."
  innobackupex --copy-back $1 &>> ${recovery_log}
  if [ $? -ne 0 ]; then
    log "完整恢復准備出錯,請檢查..."
    exit 1
  fi
  log "恢復數據完成,請檢查."
  log "請手動恢復二進制文件數據."
}

#判斷今日是否是周一

if [ $week_day -eq ${full_back_day} ]; then
  finddir ${today}
  all_dir="${find_dir}"
  if [ ! -z "${all_dir}" ]; then
    allredo $all_dir
    recovery $all_dir
    else
      log "未發現今日備份,恢復上周數據."
	  for i in "7 6 5 4 3 2 1"
	    do
		  back_date=`date +%F -d "${i} days ago"`
		  if [ $i -eq 7 ]; then
		    finddir ${back_date}
		    all_dir="${find_dir}"
			allredo ${all_dir}
		    else
			  finddir ${back_date}
			  dir_back=${find_dir}
		      incredo ${all_dir} ${dir_back} 
		  fi
	  done
	  recovery ${all_dir}
  fi
  else
    back_date=`date +%F -d "$((${week_day}-${full_back_day})) days ago"`
    finddir ${back_date}
	all_dir="${find_dir}"
	allredo ${all_dir}
	let flag=$((${week_day}-1-${full_back_day}))
	while [ ${flag} -ge 0 ]
	  do
	    incr_date=`date +%F -d "${flag} days ago"`
		finddir ${incr_date}
		incr_dir="${find_dir}"
	    incredo ${all_dir} ${incr_dir}
		let flag=`expr $flag - 1`
	done
	recovery ${all_dir}
fi

exit 0

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM