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 管理存储空间的基本单位,一个页的 ...
随机推荐
- vscode中tab键无法触发emmet快捷生成
1.file——preference——setting 2.点击user setting的extensions 3.点击emmet 4.emmet下的edit in settings.json.添加代 ...
- 经验分享:PDF怎么提取页面
PDF文件的页面有很多但有需要的并不是全部,有时候需要其中一页或几页的时候,这个时候我们就需要把单独的页面提取出来,这个时候应该怎么做呢,上次有小伙伴来询问小编,今天小编就为大家分享一下小编自己的编辑 ...
- bootstrap学习(一)栅格、布局
栅格: 栅格将整个屏幕分为12份,当使用单一的一组 .col-md-* 栅格类,就可以创建一个基本的栅格系统,在手机和平板设备上一开始是堆叠在一起的(超小屏幕到小屏幕这一范围),在桌面(中等)屏幕设备 ...
- java springboot 大文件分片上传处理
参考自:https://blog.csdn.net/u014150463/article/details/74044467 这里只写后端的代码,基本的思想就是,前端将文件分片,然后每次访问上传接口的时 ...
- js |竖线字符串全部替换 replace
一般人解决方案: 'a|b|c'.replace(/\|/g, ','); 神经病解决方案: 'a|b|c'.split('|').join(',');
- js事件流机制冒泡和捕获
JavaScript与HTML之间的交互是通过事件实现的.事件,就是文档或浏览器窗口中发生的一些特定的交互瞬间. 事件流 从页面中接收事件的顺序称为事件流. IE --> 事件冒泡流 Netsc ...
- MVC中ztree异步加载
var setting = { async: { enable: true, url: "*****/LoadChild", autoParam: ["id"] ...
- python3和grpc的微服务探索实践
对于微服务的实践,一般都是基于Java和Golang的,博主最近研究了下基于Python的微服务实践,现在通过一个简单的服务来分析Python技术栈的微服务实践 技术栈:Python3 + grpc ...
- Android进阶:七、Retrofit2.0原理解析之最简流程【下】
紧接上文Android进阶:七.Retrofit2.0原理解析之最简流程[上] 一.请求参数整理 我们定义的接口已经被实现,但是我们还是不知道我们注解的请求方式,参数类型等是如何发起网络请求的呢? 这 ...
- linux学习--2019-04-22
1.写命令,vi编辑器 1)vi 文件名 2) 按 ‘i’ 进入编辑模式 3)编写完成后,按Esc,然后输入 “:wq” 推出编辑.(“q!”不存盘,强制退出vi) 2.命令补全 “Tab” 3.获取 ...