第88讲:XtraBackup实现增量数据备份以及故障恢复的应用实践

文章目录

    • 1.XtraBackup增量备份恢复的概念
    • 2.XBK增量备份语法
    • 3.使用XBK实现数据库的增量备份
      • 3.1.周日全量备份数据库
      • 3.2.周一产生增量数据并进行增量备份
      • 3.3.周二产生增量数据并进行增量备份
      • 3.4.查看两次增量以及全量的备份文件
      • 3.5.核对全量和增量备份的准确性
    • 4.使用XBK通过增量备份还原数据库数据
      • 4.1.使用XBK增量备份还原数据库的过程
      • 4.2.XBK增量备份与全量备份合并时的重要参数
      • 4.3.损坏数据库数据
      • 4.4.整理全量备份数据
      • 4.5.整理周一的增量备份并合并到全量备份中
      • 4.6.整理周二的增量备份并合并到全量备份中
      • 4.7.再次整理全量备份数据
      • 4.8.通过全量备份还原被破坏的数据

1.XtraBackup增量备份恢复的概念

1)增量备份

XBK增量备份的概念图如下,周日的时候进行全量备份,周一到周六进行增量备份,增量备份时并不是从全库备份处开始进行增量备份的,而是从前一天增量结束位置处,备份一天内的增量数据,相当于是基于上次的备份开始的增量备份。

2)增量恢复

XBK的使用增量恢复数据和其他的备份工具不用,但是比较有意思,XBK的增量备份不能单独恢复,需要将每日的增量数据与全量备份合并成一份完整的备份数据,然后进行还原。

image-20220703115649934

2.XBK增量备份语法

XBK增量备份还是使用的innobackupex命令,其中有关于增量备份的参数:

--incremental:开启增量备份。

--incremental-basedir=xxx:指定上次备份的备份文件路径。

XBK增量备份案例:

innobackupex --user=root --password=123456 --no-timesteamp --incremental --incremental-basedir={上次备份的备份文件路径} {增量备份的备份文件路径}

3.使用XBK实现数据库的增量备份

首先对数据库进行一个全量备份(增量备份依赖于全量备份),然后模拟每天产生的增量数据,最后进行每天的增量数据备份。

创建全量备份和增量备份的备份路径

[root@mysql ~]# mkdir /data/dbbackup/all_db_bak
[root@mysql ~]# mkdir /data/dbbackup/inc_db_bak

3.1.周日全量备份数据库

[root@mysql ~]# innobackupex --user=root --password=123456 --no-timestamp /data/dbbackup/all_db_bak/all_bak_`date +%F`

3.2.周一产生增量数据并进行增量备份

1)模拟周一产生的增量数据

mysql> create table monday (id int,content varchar(10));

mysql> insert into monday values (1,'haha'),(2,'heihei'),(3,'xixi');

mysql> select * from monday;
+------+---------+
| id   | content |
+------+---------+
|    1 | haha    |
|    2 | heihei  |
|    3 | xixi    |
+------+---------+

2)对周一的增量数据进行增量备份

[root@mysql ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/data/dbbackup/all_db_bak/all_bak_2022-07-03 /data/dbbackup/inc_db_bak/monday_inc_bak

3.3.周二产生增量数据并进行增量备份

1)模拟周二产生的增量数据

mysql> create table tuesday (id int,content varchar(10));

mysql> insert into tuesday values (4,'k8s'),(5,'docker'),(6,'python');

mysql> select * from tuesday;
+------+---------+
| id   | content |
+------+---------+
|    4 | k8s     |
|    5 | docker  |
|    6 | python  |
+------+---------+

2)对周二的增量数据进行增量备份

[root@mysql ~]# innobackupex --user=root --password=123456 --no-timestamp --incremental --incremental-basedir=/data/dbbackup/inc_db_bak/monday_inc_bak /data/dbbackup/inc_db_bak/tuesday_inc_bak

在企业生产环境中,增量备份和全量备份都会通过编写脚本的方式来时间,对于没有备份的文件都有时间戳,执行上一次备份文件也是通过变量来实现的,我这里没有按天备份,因此就使用固定的名称。

3.4.查看两次增量以及全量的备份文件

[root@mysql ~]# ll /data/dbbackup/
总用量 0
drwxr-xr-x 3 root root 32 73 12:20 all_db_bak
drwxr-xr-x 4 root root 51 73 12:24 inc_db_bak
[root@mysql ~]# ll /data/dbbackup/all_db_bak/
总用量 0
drwxr-x--- 8 root root 259 73 12:20 all_bak_2022-07-03
[root@mysql ~]# ll /data/dbbackup/inc_db_bak/
总用量 0
drwxr-x--- 8 root root 285 73 12:22 monday_inc_bak
drwxr-x--- 8 root root 285 73 12:24 tuesday_inc_bak

image-20220703122649490

3.5.核对全量和增量备份的准确性

全量备份和增量备份已经完成了,下面我们来核对全量备份和增量备份的准确性。

我们核对时主要分析每个备份文件中的xtrabackup_checkpoints这个文件,观察相邻备份的last_lsn号和from_lsn号,当前增量备份的from_lsn号是上次备份的last_lsn号减9的位置号。

image-20220703142422017

4.使用XBK通过增量备份还原数据库数据

4.1.使用XBK增量备份还原数据库的过程

在3小结中,数据库在周日的时候已经完成全量备份,以及在周一和周二都完成了增量备份,下面我们要模拟故障破坏数据库,然后通过XBK完成的全量备份以及增量备份去还原数据库的数据。

XBK的增量备份是不能直接还原的,需要先将多个增量备份合并到全量备份中,然后用全量备份去还原数据库的数据。

使用XBK增量备份还原数据库的过程:

  • 1)首先整理全量备份数据,使用apply-log参数将全量备份数据进行整理,将备份时产生的“新的已提交事务的数据”通过备份redo log写入到备份文件中,将产生的“新的未提交事务的数据”通过备份的undo log回滚数据。
  • 2)将周一的增量备份数据合并到全量备份数据中。
  • 3)将周二的增量备份数据合并到全量备份数据中。
  • 4)增量备份数据与全量备份数据全部合并后,然后再次整理全量备份数据。
  • 5)最后通过全量备份数据还原被破坏掉的数据库即可。

4.2.XBK增量备份与全量备份合并时的重要参数

在XBK增量备份与全量备份合并时有几个的重要参数。

--apply-log:整理备份的数据,无论是全量备份还是增量备份,都需要先整理备份的数据,将备份过程中产生的“已提交事务的数据”通过redo log写入到备份文件中,将“未提交事务的数据”通过undo log回滚。

--redo-only:这个参数需要配合--apply-log这个参数一起使用,表示在整理备份数据时只执行redo前滚操作,不执行undo回滚操作。

意思就是说在整理数据时,只将备份过程中产生的“已提交事务的数据”通过redo log写入到备份文件中,对于“未提交事务的数据”不进行任何处理,此参数主要是为了防止在整理数据时,undo回滚会导致备份文件中记录的LSN号发生改变,从而影响备份合并

这个参数只在特定的时机下使用:整理全备数据时使用、整理增量备份时使用、最后一个增量备份整理时不使用。

都是最后一次增量备份整理了,即使LSN号发生改变也没有任何影响。

整理备份数据、仅执行Redo前滚操作、合并增量到全量,这三步操作通常是一起执行的。

--incremental-dir=xxx:指定要将那个增量备份合并到全量备份中,指定增量备份的路径。

XBK增量备份合并全量备份的例子:

将/data/dbbackup/inc_db_bak/monday_inc_bak/这个增量备份合并到全量备份/data/dbbackup/all_db_bak/all_bak_2022-07-03/中

innobackupex --apply-log --redo-only --incremental-dir=/data/dbbackup/inc_db_bak/monday_inc_bak /data/dbbackup/all_db_bak/all_bak_2022-07-03/

4.3.损坏数据库数据

直接将db_1、db_2、db_3的数据文件删除即可。此时数据库已经被损坏了,下面通过全量备份+增量备份还原数据库数据。

[root@mysql ~]# rm -rf /data/mysql/db_1/
[root@mysql ~]# rm -rf /data/mysql/db_2/
[root@mysql ~]# rm -rf /data/mysql/db_3/

4.4.整理全量备份数据

从这里开始正式进行增量备份数据还原。

[root@mysql ~]# innobackupex --apply-log --redo-only /data/dbbackup/all_db_bak/all_bak_2022-07-03/

4.5.整理周一的增量备份并合并到全量备份中

全量数据已经整理完毕了,下面将增量备份一个个的合并到全量备份中,首先将周一的增量备份合并到全量备份中。

[root@mysql ~]# innobackupex --apply-log --redo-only --incremental-dir=/data/dbbackup/inc_db_bak/monday_inc_bak /data/dbbackup/all_db_bak/all_bak_2022-07-03/

注意:全量备份整理和增量备份整理时都需要加上--redo-only参数,最后一次增量备份整理时除外。

当周一的增量备份合并到全量备份之后,全量备份中的last_lsn号就发生了变化,lsn号已经记录到了周一增量备份的last_lsn号,此时就包含了周一增量的数据。

image-20220703215847680

4.6.整理周二的增量备份并合并到全量备份中

下面将周二的增量备份整理,然后合并到全量备份中。

[root@mysql ~]# innobackupex --apply-log --incremental-dir=/data/dbbackup/inc_db_bak/tuesday_inc_bak /data/dbbackup/all_db_bak/all_bak_2022-07-03/

注意:周二的增量备份是最后一个增量备份了,此时不需要再加--redo-only参数。

当周二的增量备份与全量备份合并后,全量备份的last_lsn号再次发生变化,此时全量备份中已经包含了周一、周二的增量数据。

image-20220703220407232

4.7.再次整理全量备份数据

增量备份和全量备份已经合并了,此时需要再次整理一下全量的备份数据。

[root@mysql ~]# innobackupex --apply-log /data/dbbackup/all_db_bak/all_bak_2022-07-03/

4.8.通过全量备份还原被破坏的数据

之前使用XBK备份还原都是直接拷贝的数据文件,下面我们通过XBK自带的还原工具来还原数据。

[root@mysql ~]# innobackupex --copy-back /data/dbbackup/all_db_bak/all_bak_2022-07-03/
[root@mysql ~]# chown -R mysql. /data/mysql/
[root@mysql ~]# systemctl restart mysqld

使用此方法还原数据时,要保证数据库的数据目录是空的,否则是无法还原的,如果不想覆盖掉数据目录的所有文件,那么还是通过cp进行还原。

[root@mysql ~]# \cp -ra /data/dbbackup/all_db_bak/all_bak_2022-07-03/db_1/* /data/mysql/db_1/
[root@mysql ~]# \cp -ra /data/dbbackup/all_db_bak/all_bak_2022-07-03/db_2/* /data/mysql/db_2/
[root@mysql ~]# \cp -ra /data/dbbackup/all_db_bak/all_bak_2022-07-03/db_3/* /data/mysql/db_3/
[root@mysql ~]# chown -R mysql. /data/mysql/
[root@mysql ~]# systemctl restart mysqld

数据还原成功,全备数据和增量数据都被恢复了。

image-20220703224836200

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/313059.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

销售团队如何实现业绩增长?CRM系统的线索管理功能有什么用?

随着“以客户为中心”观念的逐渐普及,销售团队的客户比过去更复杂,交易周期更久,竞争也更激烈。假如没有明确的销售计划,团队可能陷入混乱,最后导致客户&公司之间的负面结果。在这种情况下,人工智能驱动…

YOLOv8 损失函数改进 | 引入 Shape-IoU 考虑边框形状与尺度的度量

🗝️改进YOLOv8注意力系列一:结合ACmix、Biformer、BAM注意力机制 论文讲解加入代码本文提供了改进 YOLOv8注意力系列包含不同的注意力机制以及多种加入方式,在本文中具有完整的代码和包含多种更有效加入YOLOv8中的yaml结构,读者可以获取到注意力加入的代码和使用经验,总…

npm报错error:03000086:digital envelope routines::initialization error

1.可能是因为node版本过高,与现在的项目不符合 这是降低node版本的命令,然后重新运行 npm install npm8.1.2 -g 2.改下这个package.json "dev": "SET NODE_OPTIONS--openssl-legacy-provider && vue-cli-service serve",也…

企业网络出口部署案例

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​ https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle O…

写点东西《Docker入门(上)》

写点东西《Docker入门(上)》 环境变量 Docker 镜像 Docker CMD 与 ENTRYPOINT 有什么区别 Docker 中的网络: Docker 存储: Docker 是一个工具,允许开发人员将他们的应用程序及其所有依赖项打包到一个容器中。然后&…

CRM系统针对销售管理有哪些功能?如何帮助销售效率增长?

从长远来看,有效的CRM管理系统可以帮助您的企业达到甚至超过收入目标。现代大多数企业都依靠CRM系统来管理其销售周期并增加收入。但是,当大多数人提到CRM时,他们指的是使能够改善业务关系并轻松管理不断团队的软件或工具。合格的CRM系统能够…

Bug小能手系列(python)_14: pd.concat得到的矩阵错误

pd.concat得到的不是自己想要的矩阵 0 引言1 错误原因2 解决思路3 具体代码4 总结 0 引言 今天在运行pd.concat (pd指的是pandas库),需要将两个DataFrame数据(数据分别为5*4的矩阵)进行列合并时,突然发现得到的矩阵是10*8的&…

PyCharm社区版如何创建Django项目并运行

一、配置Django环境 1、使用PyCharm打开一个普通的Python项目 2、为该项目配置Django环境 (1)点击"File"-"Settings" (2)点击"Project:项目名"-"Python Interpreter"-"号" &…

为什么杭州的独角兽公司的技术专家都是阿里巴巴出来的?

在浙江杭州有一个不成为的规定,独角兽公司招聘技术人才的时候,尤其是阿里巴巴出来的技术专家,面试官都是争先恐后的面试,总是想第一时间把这个人拿到手,当然前提是这个技术专家不是水货。 猎头推荐人才的时候&#xf…

trilium笔记私有化部署

前言:一直用有道云笔记,随着笔记越多,每次搜索跟打开都感觉没那么顺畅。再考虑到数据安全问题,想着有没私有化部署的笔记,于是开始探索私有化部署笔记。 为知笔记:比较早之前,家里的NAS部署过为…

2023.12.10查找,线性探测法

二叉树的重构 集合实现对图的dfs,bfs复写 插入排序 霍夫曼树,霍夫曼编码 查找成功,查找失败的期望值计算 9.给定散列表大小为11,散列函数为H(Key)Key%11。按照线性探测冲突解决策略连续插入散列值相同的4个元素。问:此时该散…

ChatGpt使用技巧

通用类技巧 角色扮演 比如让ChatGpt扮演500强营销专家 告诉ChatGpt你的身份。初学者、或是有一定能力、知识的学习者等 限制ChatGpt回答长度 100~200字之间 让ChatGpt一步一步思考 他会预测下一个单词,根据prompt进行生成 明确你的要求和目的 说清楚问题&#x…

ES6(一部分)未完...

文章目录 ES61.ES6 let声明变量2.ES6 const声明常量3.变量解构赋值3-1解构对象3-2解构数组3-3字符串解构 4.模板字符串5.字符串扩展5-1 include函数5-2 repeat函数(重复) 6.数值扩展6-1二进制和八进制表示法6-2isFinite 与 isNaN方法6-3islnteger方法6-4…

记录汇川:H5U与Fctory IO测试9

主程序: 子程序: IO映射 子程序: 出料程序 子程序: 自动程序 Fctory IO配置: 实际动作如下: Fctory IO测试9

编码器与解码器LLM全解析:掌握NLP核心技术的关键!

让我们深入了解:基于编码器和基于解码器的模型有什么区别? 编码器与解码器风格的Transformer 从根本上说,编码器和解码器风格的架构都使用相同的自注意力层来编码词汇标记。然而,主要区别在于编码器旨在学习可以用于各种预测建模…

【AI视野·今日NLP 自然语言处理论文速览 第七十四期】Wed, 10 Jan 2024

AI视野今日CS.NLP 自然语言处理论文速览 Wed, 10 Jan 2024 Totally 38 papers 👉上期速览✈更多精彩请移步主页 Daily Computation and Language Papers Model Editing Can Hurt General Abilities of Large Language Models Authors Jia Chen Gu, Hao Xiang Xu, J…

全网首发!Yolov8_obb旋转框检测(DOTA1.0数据集)

一、YOLOv8环境搭建 (1)Pytorch的安装 如果你的环境没有部署请参考本人文章:NLP笔记(2)——PyTorch的详细安装_安装torchnlp-CSDN博客 (2)下载最新的Yolov8-obb代码: https://git…

如何使用PR制作抖音视频?抖音短视频创作素材剪辑模板PR项目工程文件

如何使用PR软件制作抖音视频作品?Premiere Pro 抖音短视频创作素材剪辑模板PR项目工程文件。 3种分辨率:10801920、10801350、10801080。 来自PR模板网:https://prmuban.com/37058.html

5分钟了解股票交易!上海股票开户交易佣金最低是多少?怎么开户费用最低?

股票交易是指通过证券市场买卖股票的活动。以下是股票交易的基本步骤: 开立证券账户:首先需要选择一家证券公司,向其提交相关材料开立证券账户,并完成账户开立手续。 研究和选择股票:在决定购买股票之前,建…

【hyperledger-fabric】部署Java应用远程访问智能合约

简介 首先是根据b站的视频 hyperledger-fabric【3】在 java 应用中访问合约 以及hyperledger-fabric【5】Java应用和私有数据,本文章主要讲述的是视频中我遇到的问题,以及相关知识点的总结。 遇到的问题 问题1:git clone下载下来的代码发现…