XtraBackup工具详解 Part 7 使用innobackupex对数据库进行增量备份
前情提要
XtraBackup工具详解 Part 1 xtrabackup介绍
XtraBackup工具详解 Part 2 xtrabackup安装
XtraBackup工具详解 Part 3 XtraBackup工作原理
XtraBackup工具详解 Part 4 XtraBackup权限及配置
XtraBackup工具详解 Part 5 使用innobackupex对数据库进行全备
XtraBackup工具详解 Part 6 使用innobackupex对全备进行恢复
实验环境
此次实验的环境如下
- MySQL 5.7.25
- Redhat 6.10
- 操作系统账号:mysql
- 数据库备份账号:backup
1. 备份命令
1.1 首先新建备份账号
mysql> CREATE USER 'backup'@'localhost' IDENTIFIED BY '123456';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
mysql> FLUSH PRIVILEGES;
1.2 建立备份目录
shell>mkdir -p /oradata/data/mysql/xtra/full
shell>mkdir -p /oradata/data/mysql/xtra/incr
这里新建2个目录,分别放全备和增量的备份
注意 mysql用户需要有读写权限,并且该目录需要为空,否则备份失败
1.3 完全备份
首先我们需要对数据进行一次全备
shell> innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 /oradata/data/mysql/xtra/full
备份完成后可以看到在/oradata/data/mysql/xtra/full 目录下新建了以日期命名的目录
1.4 第一次增量备份
接下来我们进行第一次的增量备份,备份前我们可以首先更新一些数据库数据方便讲解
注意:对于非innodb的数据库表还是完整拷贝,并没有增量的概念
innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --incremental /oradata/data/mysql/xtra/incr --incremental-basedir=/oradata/data/mysql/xtra/full/2019-05-30_15-22-32
1.5 第二次增量备份
如果需要继续做增量备份,我们可以选择在全备的基础上做增量,也可以选择在第一次增量备份的基础上做增量备份
innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --incremental /oradata/data/mysql/xtra/incr --incremental-basedir=/oradata/data/mysql/xtra/incr/2019-05-30_15-23-39
2. 备份过程分析
接下来分析下其备份的过程,从输出的日志上来看
2.1 命令提示部分
上图首先打印出innobackupex可以用的一些参数
并提示说在结束时检查是否备份成功,需要在最后有"completed OK"字样
2.2 连接数据库
然后是连接数据库,进入数据文件目录检查参数,之后开始备份
2.3 备份系统及undo表空间
刚开始说明此次为增量备份
这部分首先列出数据库中有哪些表空间
- 系统表空间(ibdata)
- undo表空间(undo)
- 用户表空间(innodb_file_per_table开启后每张表和表空间一一对应)
首先拷贝系统表空间文件然后是unod表空间文件,最后是innodb表文件
可以看到文件名的后缀为delta,说明这里拷贝的是增量数据
可以看到由于我在备份时手动插入了数据,innobackupex一直在扫描redo 日志文件以反映数据的变化
2.4 备份innodb表数据
可以看到正在拷贝innodb表的文件
可以看到文件名的后缀为delta,说明这里拷贝的是增量数据
由于我在备份时手动插入了数据,可以看到innobackupex一直在扫描redo 日志文件以反映数据的变化
2.5 备份非innodb表数据
可以看到在拷贝数据文件时先执行下面语句进行锁表,不允许用户DML操作
- FLUSH NO_WRITE_TO_BINLOG TABLES
- FLUSH TABLES WITH READ LOCK
注意这里并没有delta后缀,说明非innodb的表还是完全备份
之后在非InnoDB表拷贝完之后写信息至xtrabackup_binlog_info文件
该文件后续说明
最后记录最终的LSN号
2.6 完成备份
之后解除锁表,拷贝ib_buffer_pool文件
记录binlog 位置信息
写信息值backup-my.cnf及xtrabackup_info
最后拷贝在备份期间变化的redo日志
3. 生成文件说明
同样我们看到增量备份除了拷贝数据文件外还生成了一些文件
下面我们一一说明
3.1 backup-my.cnf
包含了备份数据库如下信息
- innodb的一些配置信息
- 数据库的server ID
- redo log 的版本
- 数据库服务器的uuid
- master key id(安全相关)
这里和完全备份的是一样的
3.2 xtrabackup_binlog_info
其记录了备份完成时binlog的位置及GTID信息
用于复制的搭建
3.3 xtrabackup_checkpoints
该文件对于后续增量备份有用
该文件有如下信息
- 备份类型:增量备份
- 开始LSN:9425586
- 最后检查点LSN:9425625
- 最后拷贝的LSN:9425634
- 行COMPACT存储:否
可以看到to_lsn和last_lsn不同 说明在备份过程中有DML操作
to_last 用于增量备份的起点
last_scn 用于最后恢复的位置
其中from_lsn跟全备的to_lsn是一致的
这些后面介绍
3.4 xtrabackup_info
该文件包含一些备份的信息就不一一介绍了
4.无全备情况增量备份
前面说了增量备份只会拷贝大于一个LSN的内容,我们可以直接指定LSN来进行增量备份
当然前提是要知道LSN号
innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --incremental /oradata/data/mysql/xtra/incr --incremental-lsn=9425586
5. 参考资料
本专题所有内容翻译子Percona XtraBackup的官方文档
可通过如下链接下载 http://www.zhaibibei.cn/mysql/xtrabackup/tutorial1/
觉得文章不错的欢迎转发,收藏~
- 高可用架构-- MySQL主从复制的配置
- 零基础入门深度学习 | 第二章:线性单元和梯度下降
- 比特币价,黄金和无稽之谈 - 怎样不去给比特币估值
- 在PHP中,cookie和session的使用
- 剑指 offer代码解析——面试题29数组中出线次数超过一半的数字
- 剑指offer代码解析——面试题25二叉树中和为某一值的路径
- Spring MVC 4.2 CORS 跨域访问
- 剑指offer代码解析——面试题31连续子数组的最大和
- 在VS2010上使用C#调用非托管C++生成的DLL文件(图文讲解) 背景
- 剑指offer代码解析——面试题25二叉树中和为某一值的路径
- IntPtr 转 string
- 微信开发中网页授权access_token与基础支持的access_token异同
- angularJS constant和value
- 让你的HTTPS更安全
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法