XtraBackup工具详解 Part 10 使用innobackupex对数据库进行部分备份(指定表或数据库)
实验环境
此次实验的环境如下
- MySQL 5.7.26
- Redhat 6.10
- 操作系统账号:mysql
- 数据库备份账号:backup
xtrabackup 同样支持部分备份,即可以备份指定的表和数据库
单独备份表的话需要表在独立的表空间里面,即配置了innodb_file_per_table参数
关于还原部分备份,只有一个注意点,即不能使用传统的prepare和copy back命令,需要使用export和import的形式,这个在后面还原做介绍
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
注意 mysql用户需要有读写权限,并且该目录需要为空,否则备份失败
1.3 开始备份
我们有三种方法对数据库进行部分备份
innobackupex --include
下面命令表示单独备份test数据库下的innodb_table表
可以跟正则表达式,如^等
shell> innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --include='test.innodb_table' /oradata/data/mysql/xtra
必须是databasename.tablename这种形式
备份完成后可以看到在/oradata/data/mysql/xtra目录下新建了以日期命名的目录,而且只会备份和表相关的数据文件
该命令实际上会调用xtrabackup --tables 指定进行备份
不包含该表的数据库的目录不会建立,这里官方文档说不包含该表的数据目录也会建立,实际并没有
可以看到test目录下只有innodb_table相关的数据文件
innobackupex --tables-file
下面命令会读取一个文件,该文件里面有需要备份的表,每个表换行,以databasename.tablename这种形式
shell> echo "test.innodb_table" >> /tmp/tables.txt
shell> echo "yearning.core_accounts" >> /tmp/tables.txt
shell> innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --tables-file=/tmp/tables.txt /oradata/data/mysql/xtra
备份完成后可以看到在/oradata/data/mysql/xtra目录下新建了以日期命名的目录,而且只会备份和文件中表相关的数据文件
该命令实际上会调用--tables-file指定进行备份,不包含该表的数据库的目录不会建立
可以看到只备份了相关数据库的相关数据文件
--databases
该命令可以用来备份指定的数据库或者表,以空格隔开
shell> innobackupex -S /oradata/data/mysql/data/mysql.sock --user=backup --password=123456 --databases="test yearning.core_accounts" /oradata/data/mysql/xtra
备份完成后可以看到在/oradata/data/mysql/xtra目录下新建了以日期命名的目录,而且只会备份和文件中表相关的数据文件
不包含该表的数据库的目录不会建立
可以看到只备份了相关数据库的相关数据文件
2. 备份过程分析
接下来分析下其备份的过程,从输出的日志上来看
以第三种方法的输出来举例
2.1 命令提示部分
上图首先打印出innobackupex可以用的一些参数
并提示说在结束时检查是否备份成功,需要在最后有"completed OK"字样
2.2 连接数据库
然后是连接数据库,进入数据文件目录检查参数,之后开始备份
2.3 备份系统及undo表空间
这部分首先根据命令的条件跳过一些数据库
这部分首先列出数据库中有哪些表空间
- 系统表空间(ibdata)
- undo表空间(undo)
- 用户表空间(innodb_file_per_table开启后每张表和表空间一一对应)
首先拷贝系统表空间文件然后是unod表空间文件,最后是innodb表文件
如果备份时有数据变化,可以看到innobackupex一直在扫描redo 日志文件以反映数据的变化
2.4 备份innodb表数据
可以看到正在拷贝innodb表的文件
如果备份时有数据变化,可以看到innobackupex一直在扫描redo 日志文件以反映数据的变化
2.5 备份非innodb表数据
可以看到在拷贝数据文件时先执行下面语句进行锁表,不允许用户DML操作
- FLUSH NO_WRITE_TO_BINLOG TABLES
- FLUSH TABLES WITH READ LOCK
之后在非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:0
- 最后检查点LSN:2926167
- 最后拷贝的LSN:2926176
- 行COMPACT存储:否
可以看到to_lsn和last_lsn不同 说明在备份过程中有DML操作
to_last用于增量备份的起点
last_scn用于最后恢复的位置
这些后面介绍
3.4 xtrabackup_info
该文件包含一些备份的信息就不一一介绍了
4. 参考资料
本专题所有内容翻译子Percona XtraBackup的官方文档
可通过如下链接下载
http://www.zhaibibei.cn/mysql/xtrabackup/tutorial1
- 短网址(short URL)系统的原理及其实现
- 设计和实现一款轻量级的爬虫框架
- JavaScript实现模糊推荐的input框(类似搜索框)
- hadoop streaming编程小demo(python版)
- 一个scrapy框架的爬虫(爬取京东图书)
- mongodb生产环境(副本集模式)集群搭建配置
- ELK日志收集分析系统配置
- 【学术】如何在15分钟内建立一个深度学习模型?
- Elasticsearch(GEO)空间检索查询
- java spark-streaming接收TCP/Kafka数据
- hiveQL求差集
- hiveQL去重
- springboot高并发redis细粒度加锁(key粒度加锁)
- java使用spark/spark-sql处理schema数据
- 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 数组属性和方法
- 那个男人 他带着Vue3来了~
- 小书MybatisPlus第9篇-常用字段默认值自动填充
- 【42期】盘点那些必问的数据结构算法题之二叉堆
- 小书MybatisPlus第8篇-逻辑删除实现及API细节精讲
- 小书MybatisPlus第7篇-代码生成器的原理精讲及使用方法
- 小书MybatisPlus第6篇-主键生成策略精讲
- Spring Security OAuth2之resource_id配置与验证
- 了解红黑树的起源,理解红黑树的本质
- 在java中进行日期时间比较的4种方法
- 【crossbeam系列】4 crossbeam-channel:加强版channel
- 不想得手指关节炎?帮你提炼IDEA常用代码补全操作
- SpringBoot实现本地存储文件上传及提供HTTP访问服务
- 从 0 到 1 搭建技术中台之 iOS 可视化埋点实践
- 超给力,一键生成数据库文档-数据库表结构逆向工程
- 精讲RestTemplate第6篇-文件上传下载与大文件流式下载