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

2024-01-12 12:44

本文主要是介绍第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

这篇关于第88讲:XtraBackup实现增量数据备份以及故障恢复的应用实践的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/597912

相关文章

使用Python实现IP地址和端口状态检测与监控

《使用Python实现IP地址和端口状态检测与监控》在网络运维和服务器管理中,IP地址和端口的可用性监控是保障业务连续性的基础需求,本文将带你用Python从零打造一个高可用IP监控系统,感兴趣的小伙... 目录概述:为什么需要IP监控系统使用步骤说明1. 环境准备2. 系统部署3. 核心功能配置系统效果展

Python实现微信自动锁定工具

《Python实现微信自动锁定工具》在数字化办公时代,微信已成为职场沟通的重要工具,但临时离开时忘记锁屏可能导致敏感信息泄露,下面我们就来看看如何使用Python打造一个微信自动锁定工具吧... 目录引言:当微信隐私遇到自动化守护效果展示核心功能全景图技术亮点深度解析1. 无操作检测引擎2. 微信路径智能获

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

在 Spring Boot 中实现异常处理最佳实践

《在SpringBoot中实现异常处理最佳实践》本文介绍如何在SpringBoot中实现异常处理,涵盖核心概念、实现方法、与先前查询的集成、性能分析、常见问题和最佳实践,感兴趣的朋友一起看看吧... 目录一、Spring Boot 异常处理的背景与核心概念1.1 为什么需要异常处理?1.2 Spring B

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

如何在 Spring Boot 中实现 FreeMarker 模板

《如何在SpringBoot中实现FreeMarker模板》FreeMarker是一种功能强大、轻量级的模板引擎,用于在Java应用中生成动态文本输出(如HTML、XML、邮件内容等),本文... 目录什么是 FreeMarker 模板?在 Spring Boot 中实现 FreeMarker 模板1. 环

Qt实现网络数据解析的方法总结

《Qt实现网络数据解析的方法总结》在Qt中解析网络数据通常涉及接收原始字节流,并将其转换为有意义的应用层数据,这篇文章为大家介绍了详细步骤和示例,感兴趣的小伙伴可以了解下... 目录1. 网络数据接收2. 缓冲区管理(处理粘包/拆包)3. 常见数据格式解析3.1 jsON解析3.2 XML解析3.3 自定义

SpringMVC 通过ajax 前后端数据交互的实现方法

《SpringMVC通过ajax前后端数据交互的实现方法》:本文主要介绍SpringMVC通过ajax前后端数据交互的实现方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价... 在前端的开发过程中,经常在html页面通过AJAX进行前后端数据的交互,SpringMVC的controll

Spring Security自定义身份认证的实现方法

《SpringSecurity自定义身份认证的实现方法》:本文主要介绍SpringSecurity自定义身份认证的实现方法,下面对SpringSecurity的这三种自定义身份认证进行详细讲解,... 目录1.内存身份认证(1)创建配置类(2)验证内存身份认证2.JDBC身份认证(1)数据准备 (2)配置依

利用python实现对excel文件进行加密

《利用python实现对excel文件进行加密》由于文件内容的私密性,需要对Excel文件进行加密,保护文件以免给第三方看到,本文将以Python语言为例,和大家讲讲如何对Excel文件进行加密,感兴... 目录前言方法一:使用pywin32库(仅限Windows)方法二:使用msoffcrypto-too