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相关的工具非常强大,值得系统学习下的

相关推荐
xywww1683 小时前
大模型 API 选型实战:GPT、Gemini、Claude 接入时该看哪些指标?
运维·服务器·人工智能·python·gpt·langchain
梦想的颜色6 小时前
【Docker原理】Docker 容器一文打尽:生命周期、环境管控、迁移备份、日志进程排查、垃圾清理
运维·docker·容器·容器生命周期·容器日志排查·容器迁移备份·容器进程管理
donoot8 小时前
Linux系统下图书馆级电子书全自动标准化分类整理完整实施方案
大数据·linux·运维·电子书管理
ITKEY_9 小时前
macOS brew 安装的nginx 文件在哪里?
运维·nginx·macos
Elastic 中国社区官方博客9 小时前
如何比较两个 Elasticsearch 索引并找出缺失的文档
大数据·运维·数据库·elasticsearch·搜索引擎
儒雅的大叔9 小时前
MySQL数据库InnoDB数据恢复工具使用总结
数据库·mysql·adb
Tim_Van10 小时前
在 CentOS 7 中安装 Chromium 的完整步骤
linux·运维·chrome·centos
孫治AllenSun11 小时前
【Nginx】配置参数和使用案例
运维·nginx
zhangjin112011 小时前
解决adb -s 按Tab键不自动选择设备的问题
adb
啵啵鱼爱吃小猫咪12 小时前
Ubuntu 20.04 + ROS Noetic 源码安装 libfranka 0.8.0 和 franka_ros 0.8.0 完整教程
linux·运维·ubuntu