Xtrabackup实现Mysql的InnoDB引擎热备份
前面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 + % 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)
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 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 |
Xtrabackup实现Mysql的InnoDB引擎热备份的更多相关文章
- MySQL数据库InnoDB引擎下服务器断电数据恢复
说明: 线上的一台MySQL数据库服务器突然断电,造成系统故障无法启动,重新安装系统后,找到之前的MySQL数据库文件夹. 问题: 通过复制文件的方式对之前的MySQL数据库进行恢复,发现在程序调用时 ...
- 【MySQL】InnoDB引擎ibdata文件损坏/删除后使用frm和ibd文件恢复数据
参考:http://my.oschina.net/sansom/blog/179116 参考:http://www.jb51.net/article/43282.htm 注意!此方法只适用于innod ...
- Linux启用MySQL的InnoDB引擎
前几天公司的一个项目组的同事反应说公司内部的一台Linux服务器上的MySQL没有InnoDB这个引擎,我当时想应该不可能啊,MySQL默认应该 就已经安装了这个引擎的吧,于是上服务器去看了看,发现还 ...
- MySQL中innodb引擎分析(初始化)
MySQL的存储引擎是以插件形式工作的,这应该是MySQL的一大特色了吧! 依据<深入理解MySQL>的内容,5.1版本号时存储引擎的插件化都还不是彻底,确切的说是刚加入的特性.为MySQ ...
- Java面试05|MySQL及InnoDB引擎
1.InnoDB引擎索引 InnoDB支持的索引有以下几种: (1)哈希索引 (2)全文索引 (1)B+树索引 又可以分为聚集索引与辅助索引 索引的创建可以在CREATE TABLE语句中进行,也可以 ...
- Mysql在InnoDB引擎下索引失效行级锁变表锁案例
先做好准备,创建InnoDB引擎数据表,并添加了相应的索引 DROP TABLE IF EXISTS `innodb_lock`; CREATE TABLE `innodb_lock` ( `a` ) ...
- mysql的innodb 引擎 表锁与行锁
innodb 引擎 行锁与表锁 行锁与表锁是基于索引来说的(且索引要生效) 不带索引 (表锁)要全表扫描 1. 执行select @@autocommit; 查看结果 0是不自动提交事务,1是自动提交 ...
- MySQL原理 - InnoDB引擎 - 行记录存储 - Off-page 列
本文基于 MySQL 8 在前面的两篇文章,我们分析了 MySQL InnoDB 引擎的两种行记录存储格式: Compact 格式 Redundant 格式 在这里简单总结下: Compact 格式结 ...
- 【Mysql】InnoDB 引擎中的数据页结构
InnoDB 是 mysql 的默认引擎,也是我们最常用的,所以基于 InnoDB,学习页结构.而学习页结构,是为了更好的学习索引. 一.页的简介 页是 InnoDB 管理存储空间的基本单位,一个页的 ...
随机推荐
- UiAutomator2.0 - 获取同行控件
目录 问题:UI测试时,在同一个界面出现相同的属性的控件(如图),对于这种控件的获取很是无奈.如果直接通过控件id去查找的话总是会返回界面该类型的第一个控件. 解决: 1.UiObject2 中已经给 ...
- Java_面向对象
目录 一.封装 二.继承 三.多态 四.重载与重写 五.接口与抽象类 六.继承与组合 七.初始化块 面向对象的三大特征:封装.继承.多态. 一.封装 是指将对象的状态信息都隐藏在对象内部,不允许外部程 ...
- SQL优化(面试题)
因为现在面试经常需要问的需要SQL优化,问的具体操作步骤时候的常见做法,所以网上总结这些操作步骤: SQL优化的具体操作: 1.在表中建立索引,优先考虑where.group by使用到的字段. 2. ...
- STM32L1 串口相应驱动开发
初始化设置: GPIO_InitTypeDef GPIO_InitStructure; NVIC_InitTypeDef NVIC_InitStructure; USART_InitTypeDef U ...
- Vue 2.6 中部分引入 TypeScript 的方法
在 Vue 与 Cesium 联合开发的过程中,我发现很多 Cesium 代码不宜直接写在 .vue 文件中.同时由于 Cesium 库较为复杂,不借助 TypeScript 的静态类型会导致代码难维 ...
- 配置plsql远程连接oracle数据库
1.首先安装plsql工具.(plsql如何安装就不说明了) 2.在plsql安装目录下新建“network”文件夹,在network文件夹中新建“admin”文件夹,在admin中新建“tnsnam ...
- 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 ...
- 关于使用spring版本4.1.6注解@Import报错
记录一下遇到的错误 org.springframework.beans.factory.parsing.BeanDefinitionParsingException: 使用环境:spring 4.1. ...
- 元素定位-XPATH定位方法总结
1.Xpath定位方法探讨 xpath是比较常用的一种定位元素的方式,因为它很方便,缺点是,消耗系统性能.如果Xpath使用的比较好,几乎可以定位到任何页面元素,而且受页面变化影响较小. 1.1.什么 ...
- mac os x 查看网络端口情况
查看端口是否打开 使用 netstat 命令 a. `netstat -nat | grep <端口号>` , 如命令 `netstat -nat | grep 3306` b. `net ...