前面Zabbix使用的数据库是mysql,数据库备份不用多说,必须滴,由于使用的是innodb引擎,既然做,那就使用第三方强大的Xtrabackup工具来热备吧,Xtrabackup的说明,参见https://my.oschina.net/u/1171265/blog/200437

  • 数据库备份:

简单粗暴,下面给出mysql备份脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#!/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 +%-"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 -name "${yesterday}*" | wc -l`
    if [ ${dir_num} -ne 1 ]; then
      log "昨天增量目录未找到或昨天备份目录大于等于2个,请确认后再次备份."
      exit 1
    fi
    incremental_dir=`find ${back_dir} -type -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)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
#!/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 -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 [ ! -"${all_dir}" ]; then
    allredo $all_dir
    recovery $all_dir
    else
      log "未发现今日备份,恢复上周数据."
      for in "7 6 5 4 3 2 1"
        do
          back_date=`date +%-"${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 +%-"$((${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 +%-"${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

Xtrabackup实现Mysql的InnoDB引擎热备份的更多相关文章

  1. MySQL数据库InnoDB引擎下服务器断电数据恢复

    说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时 ...

  2. 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据

    参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...

  3. Linux启用MySQL的InnoDB引擎

    前几天公司的一个项目组的同事反应说公司内部的一台Linux服务器上的MySQL没有InnoDB这个引擎,我当时想应该不可能啊,MySQL默认应该 就已经安装了这个引擎的吧,于是上服务器去看了看,发现还 ...

  4. MySQL中innodb引擎分析(初始化)

    MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧! 依据<深入理解MySQL>的内容,5.1版本号时存储引擎的插件化都还不是彻底,确切的说是刚加入的特性.为MySQ ...

  5. Java面试05|MySQL及InnoDB引擎

    1.InnoDB引擎索引 InnoDB支持的索引有以下几种: (1)哈希索引 (2)全文索引 (1)B+树索引 又可以分为聚集索引与辅助索引 索引的创建可以在CREATE TABLE语句中进行,也可以 ...

  6. Mysql在InnoDB引擎下索引失效行级锁变表锁案例

    先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...

  7. mysql的innodb 引擎 表锁与行锁

    innodb 引擎 行锁与表锁 行锁与表锁是基于索引来说的(且索引要生效) 不带索引 (表锁)要全表扫描 1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交 ...

  8. MySQL原理 - InnoDB引擎 - 行记录存储 - Off-page 列

    本文基于 MySQL 8 在前面的两篇文章,我们分析了 MySQL InnoDB 引擎的两种行记录存储格式: Compact 格式 Redundant 格式 在这里简单总结下: Compact 格式结 ...

  9. 【Mysql】InnoDB 引擎中的数据页结构

    InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的 ...

随机推荐

  1. UiAutomator2.0 - 获取同行控件

    目录 问题:UI测试时,在同一个界面出现相同的属性的控件(如图),对于这种控件的获取很是无奈.如果直接通过控件id去查找的话总是会返回界面该类型的第一个控件. 解决: 1.UiObject2 中已经给 ...

  2. Java_面向对象

    目录 一.封装 二.继承 三.多态 四.重载与重写 五.接口与抽象类 六.继承与组合 七.初始化块 面向对象的三大特征:封装.继承.多态. 一.封装 是指将对象的状态信息都隐藏在对象内部,不允许外部程 ...

  3. SQL优化(面试题)

    因为现在面试经常需要问的需要SQL优化,问的具体操作步骤时候的常见做法,所以网上总结这些操作步骤: SQL优化的具体操作: 1.在表中建立索引,优先考虑where.group by使用到的字段. 2. ...

  4. STM32L1 串口相应驱动开发

    初始化设置: GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef U ...

  5. Vue 2.6 中部分引入 TypeScript 的方法

    在 Vue 与 Cesium 联合开发的过程中,我发现很多 Cesium 代码不宜直接写在 .vue 文件中.同时由于 Cesium 库较为复杂,不借助 TypeScript 的静态类型会导致代码难维 ...

  6. 配置plsql远程连接oracle数据库

    1.首先安装plsql工具.(plsql如何安装就不说明了) 2.在plsql安装目录下新建“network”文件夹,在network文件夹中新建“admin”文件夹,在admin中新建“tnsnam ...

  7. zabbix4.0监控Mysql数据库

    #wget http://repo.zabbix.com/zabbix/3.4/rhel/7/x86_64/zabbix-agent-3.4.11-1.el7.x86_64.rpm #rpm -ivh ...

  8. 关于使用spring版本4.1.6注解@Import报错

    记录一下遇到的错误 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: 使用环境:spring 4.1. ...

  9. 元素定位-XPATH定位方法总结

    1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...

  10. mac os x 查看网络端口情况

    查看端口是否打开 使用 netstat 命令 a. `netstat -nat | grep <端口号>` , 如命令 `netstat -nat | grep 3306` b. `net ...