前面Zabbix使用的數據庫是mysql,數據庫備份不用多說,必須滴,因爲使用的是innodb引擎,既然作,那就使用第三方強大的Xtrabackup工具來熱備吧,Xtrabackup的說明,參見http://www.javashuo.com/article/p-zawrjdml-k.htmlpython
簡單粗暴,下面給出mysql備份腳本: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進去,徹底能夠用在生產環境。sql
#備份目錄shell
back_dir="/back"數據庫
#備份數據庫信息bash
host="127.0.0.1"app
dbuser="dbuser"函數
dbpasswd="dbpasswd"工具
#日誌文件.net
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