Linux 使用xtrabackup备份MySQL数据

news/2025/2/8 10:11:00/文章来源:https://www.cnblogs.com/niewd/p/18703719

目录
一: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/下

1 # 需要管理员权限才行,因为要访问/var/lib/mysql目录
2 
3 sudo xtrabackup --backup --parallel=6 \
4 --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
5 --datadir="/var/lib/mysql" --target-dir="/backup/xtrabackup_full"

最后出现 [Xtrabackup] completed OK! 表示备份完成


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


2. 实现增量备份
--target-dir:指定增量备份文件的存放位置

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

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

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

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

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

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

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

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

1 sudo xtrabackup --backup --parallel=6 \
2 --incremental-basedir="第n-1次备份文件的数据路径" \
3 --host="127.0.0.1" --user="root" --password="redhat" --port=3306 \
4 --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.servicemv /var/lib/mysql /var/lib/mysql-bakcupmkdir /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
1
2. 全备份压缩后的数据恢复流程
1、先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.servicemv /var/lib/mysql /var/lib/mysql-bakcupmkdir /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
1
3. 增量备份数据恢复流程
1、先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.servicemv /var/lib/mysql /var/lib/mysql-bakcupmkdir /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
1
4. 差异备份数据恢复流程
1、 先停止MySQL后,清空MySQL数据目录,为了安全可以先将旧数据目录备份,然后创建新的数据目录

sytemctl stop mysql.servicemv /var/lib/mysql /var/lib/mysql-bakcupmkdir /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
1
5. 全备份排除指定表时数据恢复方法
xtrabackup排除指定的表不备份,实际上就是排除这些表的idb文件不备份,所以这就导致了数据恢复后,这张表的属性信息还在数据库里面。

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

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

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

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

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

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

转自:https://blog.csdn.net/weixin_42375949/article/details/142916495

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

真的不错!微信公众号文章批量下载工具3.0版,支持评论、图片、word文件导出!

一、前言 之前发布的旧版本的说明,可以看下之前发布的这3篇文章: 真的免费!微信公众号文章批量下载工具,轻松导出html、word、pdf文档! 微信公众号文章批量下载工具1.2版本更新,轻松导出html、word、pdf文档! 重磅更新!微信公众号文章批量下载工具2.0版,轻松导出html、…

【题解】杂题选讲

杂题选讲 AT_abc350_g [ABC350G] Mediator 先考虑没有加边操作,如何回答询问? 设 \(fa_x\) 表示 \(x\) 的父亲,那么对 \((x,y)\) 的询问有解只有三种情况。 \(fa_x=fa_y\ne 0, fa_{fa_x}=y, fa_{fa_y}=x\)。 只需要维护 \(fa\) 数组即可回答所有询问,如何维护?使用启发式合…

十二. Redis 集群操作配置(超详细配图,配截图详细说明)

十二. Redis 集群操作配置(超详细配图,配截图详细说明) @目录十二. Redis 集群操作配置(超详细配图,配截图详细说明)1. 为什么需要集群-高可用性2. 集群概述(及其搭建)3. Redis 集群的使用4. Redis 集群故障恢复5. Redis 集群的 Jedis 开发(使用Java程序连接 Redis 同时开启集…

Docker:Docker搭建Jenkins并共用宿主机Docker部署服务(六)跨服务器远程部署前端服务

前言 继续完成跨服务器远程部署前端服务,Jenkins的搭建与插件安装可以观看上一篇文章:https://www.cnblogs.com/nhdlb/p/18561435 配置SSH远程服务器连接 这里需要安装 SSH 连接的插件,可以观看上一篇文章进行安装。开始配置SSH连接保存!! 新建视图 方便将整个项目的前端和…

一文详解文件摆渡系统是什么?企业需要什么样的文件摆渡产品?

文件摆渡系统是一种旨在实现企业内不同网络、安全域、网段之间的文件传输、同步、共享、管理与处理的工具或平台。文件摆渡系统的主要作用是确保文件能够在不同的存储环境、操作系统、应用程序或部门之间有效传递,同时保障文件的安全性、完整性和合规性。一、文件摆渡系统的核…

IvorySQL 升级指南:从 3.x 到 4.0 的平滑过渡

日前,IvorySQL 4.0 重磅发布,全面支持 PostgreSQL 17,并且增强了对 Oracle 的兼容性。关于 IvorySQL 4.0 的介绍,各位小伙伴可以通过这篇文章回顾:IvorySQL 4.0 发布:全面支持 PostgreSQL 17. 在 IvorySQL 4.0 发布后,有小伙伴私下询问升级方法,那么本篇文章就来详细描…

kvm 基础

kvm 概述 KVM(Kernel-based Virtual Machine)是一个开源虚拟化技术,它将 Linux 内核转变为一个裸金属 hypervisor。 基本概念 1. 集成于 Linux:KVM 是 Linux 内核的一部分,支持在现有的 Linux 系统上创建和管理虚拟机。 2. 虚拟化类型:KVM 支持完全虚拟化,允许运行不同操…

Ftrans数据跨境传输方案,推动数据跨境安全有序自由流动!

在全球数字经济快速发展的今天,数据跨境传输流动已成为企业国际化不可回避的重要议题。根据权威机构数据,全球跨境数据流量每年增长超过30%,企业数据出境已从简单的信息传输,演变为复杂的合规性管理。 目前,我国数据跨境传输安全管理体系已经初步构建形成。《网络安全法》…

如何打造高效、统一的供应商协同平台?

供应商协同,简单说就是把供需双方的各种“需求”找到对应的“供应”来匹配。这种“需求”和“供应”更多的不是实物,而是资讯、方法和活动。各企业需要一个供应商协同平台实现协同管理,供应链节点各企业形成共同的彼此认同的价值取向和文化理念,建立全面的战略合作伙伴关系…

RestClient 通过拦截器实现请求加密

今天我发现了一个关于请求加密的有效写法,特此分享给大家。如果你的加密需求是将请求参数也包含在内,通常情况下,我们需要先将请求体转换成 JSON 格式或其他对象类型,再使用字符串的形式进行加密操作。以下是伪代码示例,展示了这一过程的实现方法: String payloadString …

读算法简史:从美索不达米亚到人工智能时代10纠错和加密

通信系统需纠错,汉明码优化校验和;互联网设计缺安全,公钥加密RSA成基石,保障数据传输安全,现广泛用于万维网SSL。1. 纠错 1.1. 像互联网这样的通信系统,被设计成将信息的精确副本从发送方传输到接收方 1.2. 通常,接收到的信号会受到电子噪声的污染1.2.1. 噪声是任何会破…