Linux 使用xtrabackup备份MySQL数据

news2024/10/20 23:38:12

目录

  • 一:xtrabackup 介绍
  • 二:实现数据备份
    • 1. 实现全备份
    • 2. 实现增量备份
    • 3. 实现差异备份
    • 4. 全备份时压缩数据
    • 5. 全备份时排除指定表不备份
    • 6. 全备份时排除指定库不备份
  • 三:实现数据还原
    • 1. 全备份数据恢复流程
    • 2. 全备份压缩后的数据恢复流程
    • 3. 增量备份数据恢复流程
    • 4. 差异备份数据恢复流程
    • 5. 全备份排除指定表时数据恢复方法
    • 6. 全备份排除指定数据库时数据恢复方法

一:xtrabackup 介绍

Xtrabackup 是由 Percona 公司开源的一款 MySQL 物理热备份工具,以实现对 MySQL 或 MariaDB这类数据库的数据库进行物理备份。

官网: https://www.percona.com/mysql/software/percona-xtrabackup

xtrabackup具有以下特点

1、属于物理备份工具,备份过程中是直接拷贝的数据库的物理文件,而不是像逻辑备份工具一样,要连接到MySQL服务端后通过执行大量的读操作,从而将对应的sql语句写入备份文件,所以xtrabackup备份过程中不会增加MySQL服务端的负载;

2、属于多线程备份工具,备份速度和数据恢复速度都很快;不像逻辑备份数据一样,恢复数据的时候只能单线程按顺序读取sql语句,然后再执行;

3、版本兼容性较差,不同版本的 XtraBackup 可能只能与特定版本的 MySQL 或 MariaDB 兼容。需要确保使用与数据库版本相匹配的 XtraBackup 版本。

4、一般用于全备份场景,排除指定数据不备份,恢复时比较繁琐。

5、支持innodb、mysaim等存储引擎的备份,备份速度受到服务器性能(IO等)影响;

二:实现数据备份

1. 实现全备份

  • --datadir:指定MySQL的数据目录

  • --target-dir:指定备份数据的存放目录

  • --backup:表示执行一个全备份操作

  • --defaults-file:指定MySQL配置文件路径,不指定就默认会去/etc/my.cnf、 /etc/mysql/my.cnf、~/.my.cnf查找

  • --parallel:指定使用多少个线程参与备份,如果10个CPU,一般设置为7左右。不指定就默认是单线程

例如:MySQL数据目录是/var/lig/mysql,需要将MySQL的所有数据备份到/backup/

# 需要管理员权限才行,因为要访问/var/lib/mysql目录

sudo xtrabackup --backup --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full"

最后出现 [Xtrabackup] completed OK! 表示备份完成
在这里插入图片描述

注意:进行全备份时,备份文件的大小和MySQL数据目录大小差不多一样大,并且备份过程中对硬盘I/O的要求比较高;
在这里插入图片描述


2. 实现增量备份

  • --target-dir:指定增量备份文件的存放位置

  • --incremental-basedir:指定了前一个备份的目录。这个目录可以是全备份或另一个增量备份的目录。通过比较 --incremental-basedir 中的数据与当前数据库的状态,来确定自上次备份以来哪些数据发生了变化。

1、先创建一个完整的备份

sudo xtrabackup --backup --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full"

2、基于全备份文件创建第一次增量备份

sudo xtrabackup --backup --parallel=6  \
    --incremental-basedir="/backup/xtrabackup_full" \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306  \
    --target-dir="/backup/xtrabackup_incre1"

3、基于第一次增量备份创建第二次增量备份

sudo xtrabackup --backup  --parallel=6 \
    --incremental-basedir="/backup/xtrabackup_incre1"  \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306  \
    --target-dir="/backup/xtrabackup_incre2"

4、基于第 N-1 次增量备份创建第N次增量备份

sudo xtrabackup --backup  --parallel=6 \
    --incremental-basedir="第n-1次备份文件的数据路径"  \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306  \
    --target-dir="本次备份存放目录"

3. 实现差异备份

差异备份就是备份自上次完全备份以来所有发生变化的数据。

1、先创建一个完整的备份

sudo xtrabackup --backup  --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full"

2、后续的每一次备份都基于这个全备份实现

sudo xtrabackup --backup  --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306  \
    --incremental-basedir="/backup/xtrabackup_full"  \
    --target-dir="/backup/xtrabackup_diff"

4. 全备份时压缩数据

因为全备份的备份数据太大了,可以在备份过程中将数据进行压缩,减少磁盘空间的占用。

不同版本使用的默认压缩算法和支持的压缩算法不同,具体需要根据版本号查看官方文档了解。例如从XtraBackup 8.0.34版本开始,默认的压缩算法就是 ZSTD。

链接:https://docs.percona.com/percona-xtrabackup/8.0/create-compressed-backup.html
链接:https://docs.percona.com/percona-xtrabackup/8.0/create-compressed-backup.html#version-updates

sudo xtrabackup --backup --parallel=6 \
    --compress --compress-threads=3  \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full_compress"
  • --compress:不指定使用的压缩算法,默认就按照当前xtrabackup默认指定的压缩算法进行压缩

  • --compress-threads:默认是1,表示指定多少个线程来参与压缩,一般为CPU的70%左右

备份时对数据进行压缩,默认使用zstd算法时,基本上能达到7倍左右压缩效率,但是压缩过程中会使用更多的CPU资源。
在这里插入图片描述


5. 全备份时排除指定表不备份

  • --tables-exclude:用于指定需要排除那些表不进行备份,支持正则和扩展正则;
sudo xtrabackup --backup --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full" \
    --tables-exclude='lct_net_manager\.tb_err_future_loc_20.*|lct_net_manager\.tb_heartbeat_data_20.*'

6. 全备份时排除指定库不备份

  • --databases-exclude:用于指定排除哪些数据库不备份
sudo xtrabackup --backup --parallel=6 \
    --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
    --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full" \
    --databases-exclude='history'

三:实现数据还原

  • --prepare:表示对备份的数据进行预处理操作

  • --use-memory:增加用于恢复操作的内存大小,通过这个选项可以加速恢复过程。

  • --target-dir:指定备份数据的位置

1. 全备份数据恢复流程

1、 先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.service 

mv /var/lib/mysql  /var/lib/mysql-bakcup

mkdir /var/lib/mysql && chown mysql.mysql /var/lib/mysql

2、将全备份数据进行预处理操作

物理备份是通过直接拷贝 MySQL 数据目录下的文件实现,而逻辑备份可以通过开启事务来确保数据的一致性,但物理备份在备份过程中无法避免数据的并发写入。
假设执行数据备份时,若有新的数据写入 MySQL,某些数据的元信息可能已记录到系统表中,但其数据部分可能尚未完全写入到数据文件中。这就导致了备份的文件里面记录了不完整的数据或未进行完成的事务。如果直接用这些数据去恢复MySQL,会导致数据损坏或一致性错误。
所以进行预处理( prepare 阶段)的作用就是回滚未提交的事务,丢弃不完整的数据,应用未完成的事务。这样就可以保证MySQL的数据文件和元数据信息对的上,才能确保恢复后的数据文件完整、可靠,并能够成功启动 MySQL。

sudo xtrabackup --prepare --parallel=6 --use-memory=3G \
    --target-dir="/backup/xtrabackup_full"

说明:如果是全备份,多次执行预处理操作时不会有什么影响的;

3、将备份的数据拷贝到MySQL数据目录下

sudo xtrabackup --copy-back --parallel=6 \
    --target-dir="/backup/xtrabackup_full"   --datadir=/var/lib/mysql
  • --copy-back:将备份数据复制到mysql数据目录

  • --move-back:将备份数据移动到mysql数据目录,此时备份文件就没了

4、重新启动MySQL

systemctl restart mysql.service

2. 全备份压缩后的数据恢复流程

1、先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.service 

mv /var/lib/mysql  /var/lib/mysql-bakcup

mkdir /var/lib/mysql && chown mysql.mysql /var/lib/mysql

2、将压缩后的全备份数据进行解压
需要提前在操作系统上安装相关的压缩工具,例如使用zstd的算法来压缩备份数据,也需要安装对应的工具,xtrbackup解压缩数据的时候会调用这个工具,如果不安装就没法解压成功;

sudo xtrabackup --decompress --parallel=6 \
    --target-dir="/backup/xtrabackup_full"
  • --decompress:会自动选择压缩时的算法,然后调用系统上的工具来进行解压。

3、对备份的数据进行预处理操作

sudo xtrabackup --prepare --use-memory=3G --parallel=6 \
     --target-dir="/backup/xtrabackup_full"

4、将备份的数据拷贝到MySQL数据目录下

sudo xtrabackup --copy-back --parallel=6 \
    --target-dir="/backup/xtrabackup_full"   --datadir=/var/lib/mysql

5、重新启动MySQL

systemctl restart mysql.service

3. 增量备份数据恢复流程

1、先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.service 

mv /var/lib/mysql  /var/lib/mysql-bakcup

mkdir /var/lib/mysql && chown mysql.mysql /var/lib/mysql

2、先将全备份数据进行预处理

sudo xtrabackup --prepare --parallel=6 --use-memory=3G \
    --apply-log-only \
    --target-dir="/backup/xtrabackup_full"

3、将第一个增量备份数据应用到全备份数据中

sudo xtrabackup --prepare  --parallel=6 --use-memory=3G \
    --apply-log-only \
    --target-dir="/backup/xtrabackup_full" \
    --incremental-dir="/backup/xtrabackup_incre1"

4、再将第二个增量备份数据应用到全备份数据中

sudo xtrabackup --prepare --parallel=6 --use-memory=3G \
    --apply-log-only \
    --target-dir="/backup/xtrabackup_full" \
    --incremental-dir="/backup/xtrabackup_incre2"

5、重复以上请步骤,按照顺序一次将 第三次到第 N-1 次的增量备份数据合并到全备份文件中

6、最后一个增量备份文件合并时,不能加 --apply-log-only 而是集体进行一次彻底回滚来保证一致性

sudo xtrabackup --prepare --parallel=6 --use-memory=3G \
    --target-dir="/backup/xtrabackup_full" \
    --incremental-dir="最后一次增量备份文件存放路径"
  • --incremental-dir:指定的就是存放增量备份数据的目录

  • --target-dir:指定的就是全备份数据的目录

  • --apply-log-only:默认未执行完的事务在 prepare 操作时会被回滚,通过这个参数可以不回滚这些事务,等待所有增备数据都合并了,再进行一次彻底的回滚(最后一个增量合并不加--apply-log-only

7、将处理后的数据复制到MySQL数据目录下
将备份的数据拷贝到MySQL数据目录下

sudo xtrabackup --copy-back --parallel=6 --use-memory=3G \
    --target-dir="/backup/xtrabackup_full" \
    --datadir=/var/lib/mysql

8、重新启动MySQL

systemctl restart mysql.service

4. 差异备份数据恢复流程

1、 先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.service 

mv /var/lib/mysql  /var/lib/mysql-bakcup

mkdir /var/lib/mysql && chown mysql.mysql /var/lib/mysql

2、预处理全备份数据(仅应用日志)

xtrabackup --prepare --parallel=6 --use-memory=3G \
    --apply-log-only \
    --target-dir="/backup/xtrabackup_full" 

3、合并差异备份数据到全备份

xtrabackup --prepare --use-memory=3G --parallel=6 \
    --apply-log-only \
    --target-dir="/backup/xtrabackup_full" \
    --incremental-dir="/backup/xtrabackup_diff" 

4、完成全备份数据的预处理(最终应用日志)

xtrabackup --prepare -use-memory=3G --parallel=6 \
    --target-dir="/backup/xtrabackup_full" 

5、将处理后的数据复制到MySQL数据目录下

sudo xtrabackup --copy-back --parallel=6 \
    --target-dir="/backup/xtrabackup_full" \
    --datadir=/var/lib/mysql

6、重新启动MySQL

systemctl restart mysql.service

5. 全备份排除指定表时数据恢复方法

xtrabackup排除指定的表不备份,实际上就是排除这些表的idb文件不备份,所以这就导致了数据恢复后,这张表的属性信息还在数据库里面。

1、先将备份的数据进行恢复

2、通过客户端工具连接到MySQL服务端,然后执行drop table 将这个数据表删除即可;


6. 全备份排除指定数据库时数据恢复方法

一般情况下,某个数据库的所有数据文件都是存储在MySQL数据目录下以数据库名的目录中的,全备份排除指定数据库不备份,就是不将这个目录进行备份。
但是这个数据库的属性信息还是保留在MySQL中的,所以需要先创建要给空目录,然后在执行删除操作,才会将属性信息也一并跟着删除;

1、先将备份的数据进行恢复

2、在MySQL数据目录下创建一个和排除数据库同名的目录文件(注意权限)

3、通过客户端工具连接到MySQL服务端,然后执行drop database 将这个数据库删除即可;

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

神仙公司名单(长沙)

神仙公司(长沙) 小周末,继续 神仙公司系列。 长沙,湖南省的省会城市,不仅以其深厚的历史文化底蕴著称,同时也是一个充满活力的现代都市。 长沙的经济活力、教育资源、医疗资源、就业机会、居住环境、生活成…

python中堆的用法

Python 堆(Headp) Python中堆是一种基于二叉树存储的数据结构。 主要应用场景: 对一个序列数据的操作基于排序的操作场景,例如序列数据基于最大值最小值进行的操作。 堆的数据结构: Python 中堆是一颗平衡二叉树&am…

15分钟学Go 第2天:安装Go环境

第2天:安装Go环境 1. 引言 在学习Go语言之前,首先需要配置好本地开发环境。本节将详细介绍如何在Windows 11上安装和配置Go语言环境,包括安装步骤、环境变量设置、VS Code配置与测试、以及常见问题解决方案。完成这些步骤后,你将…

Excel:vba实现筛选出有批注的单元格

实现的效果:代码: Sub test() Dim cell As RangeRange("F3:I10000").ClearlastRow Cells(Rows.Count, "f").End(xlUp).Row MsgBox lastrow For Each cell In Range("a1:a21")If Not cell.Comment Is Nothing ThenMsgBox…

【AIGC】2024-arXiv-InstantStyle:文本到图像生成中保持风格的免费午餐

2024-arXiv-InstantStyle: Free Lunch towards Style-Preserving in Text-to-Image Generation InstantStyle:文本到图像生成中保持风格的免费午餐摘要1. 引言2. 相关工作2.1 文本到图像的传播模型2.2 风格化图像生成2.3 扩散模型中的注意力控制 3. 方法3.1 动机3.2…

keil中编译遇到错误“error #94-D the size of an array must be greater than zero”解决方法

这一期,我们来看一个在keil中编译时候遇到定义数组元素个数为0时候遇到的一个错误。 错误: 先看错误:编译提示错误“error: #94-D: the size of an array must be greater than zero” ,意思是这个数组内元素个数不能定义为0个&…

【AIGC】解锁高效GPTs:ChatGPT-Builder中系统提示词Prompt的设计与应用

博客主页: [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 💯前言💯系统提示词系统提示词的作用与重要性系统提示词在构建GPTs中的作用结论 💯ChatGPT-Builder系统提示词的详细解读OpenAI为Builder编写的系统提示词系统提示词对…

R语言详解predict函数

R语言中predict函数在建立模型&#xff0c;研究关系时常用。但是不同type得到的结果常常被混为一谈&#xff0c;接下来&#xff0c;探讨predict得到的不同结果。 #数据 set.seed(123) n<-1000 age<-rnorm(n,mean50,sd10) gender<-rbinom(n,1,0.5) disease<-rbinom…

OpenCV高级图形用户界面(12)用于更改指定窗口的大小函数resizeWindow()的使用

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 cv::resizeWindow() 函数用于更改指定窗口的大小。这使得你可以根据需要调整窗口的宽度和高度。 注释 指定的窗口大小是指图像区域的大小。工具栏…

Maxwell 底层原理 详解

Maxwell 是一个 MySQL 数据库的增量数据捕获&#xff08;CDC, Change Data Capture&#xff09;工具&#xff0c;它通过读取 MySQL 的 binlog&#xff08;Binary Log&#xff09;来捕获数据变化&#xff0c;并将这些变化实时地发送到如 Kafka、Kinesis、RabbitMQ 或其他输出端。…

字节跳动青训营——入营考核解答(持续更新中~~~)

考核内容&#xff1a; 在指定的题库中自主选择不少于 15 道算法题并完成解题&#xff0c;其中题目难度分配如下&#xff1a; 简单题不少于 10 道中等题不少于 4 道困难题不少于 1 道 解答代码 20. 百分位数&#xff08;中等&#xff09; 代码实现&#xff1a; import jav…

Uiautomator2与weditor配置一直报错咋办

作者在配置这两个的时候绞尽脑汁了&#xff0c;u2的init总是报错并且无法自动在手机上安装atx&#xff0c;weditor可以打开但是只要对元素操作或者任意操作就会让你去重新init&#xff0c;搞得作者焦头烂额&#xff0c;而且网上各种各样的报错信息眼花缭乱&#xff0c;作者几乎…

【深入学习Redis丨第八篇】详解Redis数据持久化机制

前言 Redis支持两种数据持久化方式&#xff1a;RDB方式和AOF方式。前者会根据配置的规则定时将内存中的数据持久化到硬盘上&#xff0c;后者则是在每次执行写命令之后将命令记录下来。两种持久化方式可以单独使用&#xff0c;但是通常会将两者结合使用。 一、持久化 1.1、什么…

基于neo4j知识图谱的菜谱推荐系统

&#x1f374; AI菜谱推荐系统让你“煮”事半功倍&#xff01; &#x1f374; 找不到做饭灵感的时候&#xff0c;是不是总觉得“今天吃啥”这道选择题简直是终极挑战&#xff1f;别急&#xff0c;我们基于Neo4j知识图谱的菜谱推荐系统&#xff0c;正是为了解决你的困扰而设计&a…

linux线程 | 同步与互斥 | 全解析信号量、环形生产消费者模型

前言: 本节内容讲述linux下的线程的信号量&#xff0c; 我们在之前进程间通信那里学习过一部分信号量&#xff0c; 但是那个是systemV版本的信号量&#xff0c;是以进程间通信的视角谈的。 但是本篇内容会以线程的视角谈一谈信号量。 ps&#xff1a;本篇内容建议学习了生产者消…

集合collection和泛型

collection可以直接打印内容&#xff0c;而不是地址&#xff0c;内部已经重写了。 List家族&#xff1a; package com.itheima.d6_collection_update_delete;import java.util.ArrayList; import java.util.Iterator; import java.util.List;/**目标&#xff1a;研究集合遍历并…

解决关于HTML+JS + Servlet 实现前后端请求Session不一致的问题

1、前后端不分离情况 在处理session过程中&#xff0c;如果前后端项目在一个容器中&#xff0c;session是可以被获取的。例如如下项目结构&#xff1a; 结构 后端的代码是基本的设置值、获取值、销毁值的内容&#xff1a; 运行结果 由此可见&#xff0c;在前后统一的项目中&a…

Sign Language Dataset: 聋哑人手语数据集(猫脸码客 第209期)

Sign Language Dataset: 聋哑人手语数据集 摘要&#xff1a;手语是聋哑人群体进行沟通交流的重要工具&#xff0c;通过手势、动作及面部表情的组合表达复杂的思想和情感。随着计算机视觉和人工智能技术的发展&#xff0c;聋哑人手语数据集在促进手语识别、翻译和交互系统开发中…

计算机指令系统,打个结~

计算机指令系统是计算机硬件与软件之间的桥梁&#xff0c;它定义了计算机能够执行的各种操作。一个完善的指令系统不仅影响着计算机的性能&#xff0c;还直接决定了计算机能够完成的任务种类和复杂度。本文将从计算机指令的基本概念出发&#xff0c;探讨指令系统的分类、常见指…

第13篇:无线与移动网络安全

目录 引言 13.1 无线网络的安全威胁 13.2 无线局域网的安全协议 13.3 移动通信中的安全机制 13.4 蓝牙和其他无线技术的安全问题 13.5 无线网络安全的最佳实践 13.6 总结 第13篇&#xff1a;无线与移动网络安全 引言 无线和移动网络的发展为我们的生活带来了极大的便利…