前面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

最新文章

  1. find命令与cat命令区别
  2. socket:通常每个套接字地址(协议/网络地址/端口)只允许使用一次
  3. Access restriction错误解决办法
  4. C++ DateTime 结构
  5. 关于view.measure
  6. [Flex] PopUpButton系列 —— 打开和关闭弹出菜单
  7. Android开发之Source无法覆写public void onClick(View v)
  8. [ionic开源项目教程] - 第1讲 前言,技术储备,环境搭建,常用命令
  9. BIEE Setup
  10. poj 3565 uva 1411 Ants KM算法求最小权
  11. mac_开启ftp并访问
  12. 关于Java中继承多接口同名方法的问题
  13. hdu4417 Super Mario
  14. 基础并查集poj2236
  15. 【转】为什么要使用ModelDriven
  16. 实现两线程的同步二(lockSupport的park/unpark)
  17. Window10下安装sbt
  18. .Net 泛型约束
  19. Linux命令学习与使用2
  20. MySQL :: MySQL 8.0 Reference Manual :: B.6.4.3 Problems with NULL Values https://dev.mysql.com/doc/refman/8.0/en/problems-with-null.html

热门文章

  1. php数组使用json_encode函数中文被编码成null的原因和解决办法
  2. [译]async/await中使用阻塞式代码导致死锁 百万数据排序:优化的选择排序(堆排序)
  3. php执行多个存储过程
  4. FaceBook登陆API -- Login with API calls
  5. Android登录client,验证码的获取,网页数据抓取与解析,HttpWatch基本使用
  6. MySQL数据库知识点整理 (持续更新中)
  7. git clone 问题 fatal: unable to access
  8. mongodb 数据库操作--备份 还原 导出 导入(转)
  9. 收集一些有意思的ASCII程序注释(持续收集中,希望大家踊跃贡献)
  10. java Web的MVC最基础暂定分层包