xtrabackup来备份恢复数据

前言

Percona XtraBackup 是一款开源的 MySQL物理热备份工具。请根据你的 MySQL 版本选择对应的 XtraBackup 版本,它可以来对整个数据库节点(所有库)来进行备份,恢复,备份时可以进行压缩。

注:这里是以 mysql8.0来进行操作

使用建议

  • 在安装过程中,如果遇到依赖问题,可以尝试运行 sudo apt --fix-broken install 来修复
  • Toolkit 常用于分析慢日志(pt-query-digest)或在线修改表结构(pt-online-schema-change)。
  • XtraBackup 常用于生产环境的物理热备份,因为它在备份时不会锁表。

一、安装基础组件

1、添加percona官方源

首先下载并安装 percona的仓库配置包

bash 复制代码
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb

不然会报错"E: Unable to locate package percona-xtrabackup-80"

2、更新软件包列表

bash 复制代码
sudo apt update

3、安装 Percona Tookit

执行以下命令进行安装

bash 复制代码
sudo apt install percona-toolkit

4、验证安装结果

查看索引工具的版本(分析MySQL 查询日志并识别未被使用的索引‌)

bash 复制代码
sudo pt-index-usage --version

二、安装XtraBackup

可以根据不同mysql版本来进行安装

  • MySQL 8.0 对应 Percona XtraBackup 8.0 (percona-xtrabackup-80)
  • MySQL 5.7 对应 Percona XtraBackup 2.4 (percona-xtrabackup-24)

以下步骤以安装 XtraBackup 8.0 为例:

1、配置仓库

bash 复制代码
sudo percona-release enable-only tools release

2、安装XtraBackup

bash 复制代码
sudo apt install percona-xtrabackup-80

如果需要安装 2.4 版本,只需将命令中的 percona-xtrabackup-80 替换为 percona-xtrabackup-24 即可。

3、验证安装

如果输出信息中包含 8.0,说明安装正确

bash 复制代码
sudo xtrabackup --version

三、恢复数据

1、先停止 mysql 服务

在恢复数据之前,必须停止数据库服务,否则会导致文件冲突或数据损坏

bash 复制代码
sudo systemctl stop mysqld

2、备份/清空原数据目录

为了防止误操作,将现有的数据目录重命名(作为备份),然后再新建和原来同名的空目录

具体的 datadir目录在/etc/my.cnf 中可以看到,以宝塔为例,数据库目录在/www/server/data

bash 复制代码
# 1、重命名旧数据目录
sudo mv /www/server/data /www/server/data_back_$(date +%F)

# 2、创建新的空目录
sudo mkdir -p /www/server/data

3、解压数据

3.1 如果是.tar.tar.gz
bash 复制代码
# 如果是tar.gz
sudo tar -zxvf backup.tar.gz -C /root/data-backup
# 如果是纯tar
sudo tar -xvf backup.tar -C /root/data-backup
3.2 如果是.xbstream 文件
bash 复制代码
# 需要安装 xbstream 工具 (通常随 xtrabackup 安装),并启用4个线程来解压
sudo xbstream -x --parallel=4 -C /root/data-backup < backup.xbstream
3.3 v cdfgbv 如果解压出来都是带有.qp(qpress)压缩文件

需要再一次解压才行

XtraBackup 的 --compress 选项通常生成 .qp 文件。你需要先解压它们:

  • 推荐使用
bash 复制代码
# 推荐使用 xtrabackup 自带的解压功能,并启用 4 个线程来解压
sudo xtrabackup --decompress --parallel=4 --target-dir=/root/data-backup/
复制代码
- --decompress,表示解压缩.qp文件自带的
- --parallel=4,启用 4 个线程并行处理,文件多的时候,可以启用这个,可以加快速度
  • qpress

在服务器上没有的,需要安装

bash 复制代码
# 解压所有 .qp 文件
sudo for i in *.qp; do qpress -d $i $(dirname $i); done

4、检查文件是否正常

检查方法

bash 复制代码
sudo cat /root/data-backup/xtrabackup_info
  • 如果 cat 命令输出为空,或者显示乱码,说明备份文件已损坏(可能是磁盘满了、传输中断或备份时被意外终止)。
  • 解决方法:这种情况下无法修复,必须重新执行备份。

5、权限问题

有时候文件属性可能会被锁定,确保文件可读

bash 复制代码
sudo chmod 644 /root/data-backup/xtrabackup_info

6、执行恢复(核心)

重要,必须要执行的:

xtrabackup --prepare 的作用表示准备数据,将备份数据恢复到一个一致的、可恢复的状态‌,相当于对备份执行一次"崩溃恢复"(crash recovery),使其能够安全地用于启动 MySQL 服务

bash 复制代码
sudo xtrabackup --prepare --target-dir=/root/data-backup

看到 "completed OK" 才算成功。

最后执行恢复:

bash 复制代码
# 恢复数据
sudo xtrabackup --defaults-file=/etc/my.cnf --copy-back --target-dir=/root/data-backup/

注:这里恢复的是全量数据

6.1、恢复增量备份

**注:**合并增量数据时,需要按顺序进行合并。存在多个日期的目录,则需要将全量备份作为基础,再按日期从小到大合并进来

1、准备基础全量备份(注意 --apply-log-only 参数)
bash 复制代码
xtrabackup --prepare --apply-log-only --target-dir=/root/data-backup
2、合并第一次增量备份数据
bash 复制代码
xtrabackup --prepare --apply-log-only \
--target-dir=/root/data-backup \
--incremental-dir=/root/data-backup_inc2026-05-09

--incremental-dir依次往下推。批次合并。

7、修复权限+启动 mysql

bash 复制代码
sudo chown -R mysql:mysql /www/server/data
sudo chmod -R 750 /www/server/data

# 启动mysql
sudo systemctl start mysqld

四、备份数据

1、创建mysql的专用备份账号

为了系统安全,强烈建议不要直接使用mysql的root账号进行备份。创建一个权限最小化的专用备份账号

这样做的好处:

  • 遵循最小权限原则:避免因备份脚本或操作失误导致的数据风险。
  • 便于审计:可以清晰地追踪和监控所有备份相关的操作。

创建

bash 复制代码
# 1. 创建名为 'backup_user' 的用户,并设置一个强密码
CREATE USER 'backup_user'@'localhost' IDENTIFIED BY '密码';

# 2. 授予备份所需的核心权限
GRANT BACKUP_ADMIN, PROCESS, RELOAD, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup_user'@'localhost';

# 3. 授予查询 performance_schema 的权限,用于获取状态信息
GRANT SELECT ON performance_schema.* TO 'backup_user'@'localhost';

# 4. 刷新权限使其生效
FLUSH PRIVILEGES;
  • 权限说明:
权限 (Privilege) 用途说明
RELOAD 执行 FLUSH 操作,确保数据一致性。
LOCK TABLES 锁定非 InnoDB 引擎的表(如 MyISAM),保证备份期间数据不变。
PROCESS 查看当前运行的线程,用于监控备份进程。
REPLICATION CLIENT 获取二进制日志(Binlog)的位置信息,对增量备份和主从复制至关重要。
BACKUP_ADMIN MySQL 8.0+ 必需,用于执行实例级别的备份锁定。

2、执行全量备份

对于第一次备份,就做一个全量备份。以下命令使用 backup_user 用户进行备份,并将备份文件存放在指定目录。

bash 复制代码
xtrabackup \
--user=backup_user \
--password='密码' \
--host=localhost \
--compress \
--parallel=4 \
--backup \
--target-dir=/data/backups/mysql/full_$(date +%F)

注:/data/backup/mysql目录需要先创建好,不然就会报错。它不会自动创建

  • --user:必填,备份账号
  • --password:必填,密码,
  • --host就是指定哪个mysql实例节点
  • --backup: 必填参数,不仅仅是来备份,还是来监控 innodb的redo log
  • --compress: 可选,压缩备份文件,节省磁盘空间。
  • --parallel=4: 可选,使用4个线程并行备份,提升速度。
  • --incremental-basedir:可选,用来做增量备份的锚点,它决定了你的新备份是相对于哪个时间点开始记录变化的,不加表示全量备份。(第一次备份)通常都不带这个参数,而从第二次开始的备份命令才会带上它。
  • --no-timestamp:可选,工具会直接把备份文件存放在你指定的路径下,不再创建时间戳子目录,方便脚本化管理。mysql8.0中已经去掉了,不需要再使用了。

3、执行增量备份

增量备份是基于上一次的备份目录来的,在--incremental-basedir参数中设置上一次备份目录

bash 复制代码
xtrabackup \
--user=backup_user \
--password='密码' \
--host=localhost \
--compress \
--parallel=4 \
--backup \
--target-dir=/data/backups/mysql/inc_$(date +%F) \
--incremental-basedir=/data/backups/mysql/full_2026-05-08
  • --incremental-basedir:必填,指向上一次的增量备份目录
  • --target-dir:必填,这个时候名字也要改成相应的增量目录

执行成功后是这样子的:

结语

percona相关的工具非常强大,值得系统学习下的

相关推荐
IT大白鼠1 小时前
主流Linux文件系统稳定性及性能分析
linux·运维·服务器·文件系统
南境十里·墨染春水1 小时前
linux学习进展 I/O复用函数初步
linux·运维·学习
志栋智能1 小时前
超自动化巡检:敏捷运维体系中的重要一环
运维·服务器·网络·云原生·容器·kubernetes·自动化
V搜xhliang02461 小时前
OpenClaw进阶完全教程
运维·人工智能·算法·microsoft·自动化
LinuxGeek10241 小时前
Linux内核“Dirty Frag”漏洞(CVE-2026-43284)修复方案
linux·运维·服务器
曦夜日长1 小时前
Linux系统篇,权限(一):用户创建与切换、权限及角色定义与修改、文件权限二进制表示
linux·运维·服务器
原来是猿1 小时前
应用层【协议再识/序列化与反序列化】
linux·运维·服务器·网络·网络协议·tcp/ip
天草二十六_简村人1 小时前
对接AI大模型之nginx代理配置SSE接口
运维·网络·nginx·http·阿里云·ai·云计算
小趴菜克鲁里2 小时前
Cocos Creator 进阶:打造灵活可控的进度条动画组件(循环与分段)
运维·nginx