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

相关推荐
用户0328472220707 小时前
如何搭建本地yum源(上)
运维
大树883 天前
金刚石散热越强,管路越先见顶
大数据·运维·服务器·人工智能·ai
摇滚侠3 天前
Linux CentOS7 rpm 安装 MySQL 5.7
linux·运维·mysql
霸道流氓气质3 天前
领域驱动设计(DDD)在 Spring Boot 微服务中的实践指南
运维·spring boot·微服务
Inhand陈工3 天前
基于台达PLC与映翰通IG502的智慧水产养殖精准投喂与远程运维解决方案
运维·人工智能·物联网·阿里云·信息与通信
酣大智3 天前
ARP代理--工作原理
运维·网络·arp·arp代理
shushangyun_3 天前
2026年快消品B2B系统推荐:支持终端门店订货、促销政策自动化的工具?
java·运维·网络·数据库·人工智能·spring·自动化
施努卡机器视觉3 天前
SNK施努卡侧滑门锁上滑轮总成自动化装配线,从零件到组件,全流程精密制造方案
运维·自动化·制造
活宝小娜3 天前
mysql详细安装教程
数据库·mysql·adb
AC赳赳老秦3 天前
用 OpenClaw 搭建服务器故障应急响应系统,自动处理 80% 常见运维故障
android·运维·服务器·python·rxjava·deepseek·openclaw