环境是 Ubuntu 24.04 LTS + MySQL 8.0,适合直接用 Percona XtraBackup 8.x(专门兼容 MySQL 8.0)。
官网参考地址:https://docs.percona.com/percona-xtrabackup/8.0/index.html
一、安装 XtraBackup
- MySQL8.0版本
sudo apt update
sudo apt install -y wget gnupg2 lsb-release
# CentOS 7
wget https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo rpm -ivh percona-release-latest.noarch.rpm
sudo percona-release enable-only tools release
yum install -y percona-xtrabackup-80
# CentOS 8
dnf install -y https://repo.percona.com/yum/percona-release-latest.noarch.rpm
percona-release setup -y ps80
dnf install -y percona-xtrabackup-80
# Ubuntu
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
sudo percona-release enable-only tools release
sudo apt update
sudo apt install -y percona-xtrabackup-80
- 安装 XtraBackup
sudo apt update
sudo apt install -y percona-xtrabackup-80
- 验证安装
xtrabackup --version
输出类似:
xtrabackup version 8.0.x based on MySQL server 8.0.x
二、准备 MySQL 备份账号
建议不要直接用 root,而是新建一个专门的备份用户。
- 登录 MySQL:
mysql -uroot -p
- 创建备份账号:
CREATE USER 'backup'@'localhost' IDENTIFIED BY 'StrongPassw0rd!';
GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO 'backup'@'localhost';
FLUSH PRIVILEGES;
三、常用备份脚本
这里提供一个 全量备份 + 增量备份 + 自动清理旧备份 的脚本。
保存为 /usr/local/bin/mysql_xtrabackup.sh:
#!/bin/bash
# MySQL XtraBackup 自动化脚本
# 适用于:Ubuntu 24.04 + MySQL 8.0 + Docker外挂数据目录
# 配置区
BACKUP_BASE="/home/mysql/mysql_backup"
FULL_BACKUP_DIR="$BACKUP_BASE/full"
INCR_BACKUP_DIR="$BACKUP_BASE/incr"
MYSQL_DATA_DIR="/home/mysql/data3306" # 宿主机外挂 MySQL 数据目录
MYSQL_USER="root"
MYSQL_PASSWORD="admin"
MYSQL_HOST="127.0.0.1"
MYSQL_PORT=3306
# 时间戳
NOW=$(date +"%Y-%m-%d_%H-%M-%S")
# 日志文件
LOGFILE="$BACKUP_BASE/backup_$NOW.log"
# 确保目录存在
[ ! -d "$FULL_BACKUP_DIR" ] && mkdir -p "$FULL_BACKUP_DIR"
[ ! -d "$INCR_BACKUP_DIR" ] && mkdir -p "$INCR_BACKUP_DIR"
# 打印并记录日志
log() {
echo "$(date +"%F %T") - $1" | tee -a "$LOGFILE"
}
# 全量备份
full_backup() {
local dest="$FULL_BACKUP_DIR/$NOW"
mkdir -p "$dest"
log "🚀 开始全量备份 -> $dest"
xtrabackup \
--backup \
--target-dir="$dest" \
--datadir="$MYSQL_DATA_DIR" \
--host="$MYSQL_HOST" \
--port=$MYSQL_PORT \
--user="$MYSQL_USER" \
--password="$MYSQL_PASSWORD" \
--skip-log-bin 2>&1 | tee -a "$LOGFILE"
if [ $? -eq 0 ]; then
log "✅ 全量备份完成:$dest"
else
log "❌ 全量备份失败,请检查日志!"
exit 1
fi
}
# 增量备份
incr_backup() {
local last_full=$(ls -td $FULL_BACKUP_DIR/* | head -1)
local last_incr=$(ls -td $INCR_BACKUP_DIR/* 2>/dev/null | head -1)
if [ -n "$last_incr" ]; then
local base_dir="$last_incr"
else
local base_dir="$last_full"
fi
local dest="$INCR_BACKUP_DIR/$NOW"
mkdir -p "$dest"
log "🚀 开始增量备份 -> $dest"
xtrabackup \
--backup \
--target-dir="$dest" \
--incremental-basedir="$base_dir" \
--datadir="$MYSQL_DATA_DIR" \
--host="$MYSQL_HOST" \
--port=$MYSQL_PORT \
--user="$MYSQL_USER" \
--password="$MYSQL_PASSWORD" \
--skip-log-bin 2>&1 | tee -a "$LOGFILE"
if [ $? -eq 0 ]; then
log "✅ 增量备份完成:$dest"
else
log "❌ 增量备份失败,请检查日志!"
exit 1
fi
}
# 使用说明
usage() {
echo "用法: $0 {full|incr}"
exit 1
}
# 主逻辑
case "$1" in
full)
full_backup
;;
incr)
incr_backup
;;
*)
usage
;;
esac
赋权:
sudo chmod +x /usr/local/bin/mysql_xtrabackup.sh
四、恢复流程(关键)
- 准备恢复目录
mkdir -p /data/mysql_restore
- 准备数据(回放日志)
xtrabackup --prepare --target-dir=/data/mysql_backup/full/2025-08-29_00-00-00
如果有增量备份,需要按顺序 --apply-log-only 逐个应用。
- 停止 MySQL 并替换数据目录
sudo systemctl stop mysql
sudo rm -rf /var/lib/mysql/*
sudo cp -r /data/mysql_backup/full/2025-08-29_00-00-00/* /var/lib/mysql/
sudo chown -R mysql:mysql /var/lib/mysql
sudo systemctl start mysql
五、自动化任务
编辑 crontab:
sudo crontab -e
加入每天凌晨 2 点自动备份:
0 2 * * * /usr/local/bin/mysql_xtrabackup.sh >> /var/log/mysql_backup_cron.log 2>&1
MySQL8.4 备份
1. 下载并安装 Percona Repository
wget https://repo.percona.com/apt/percona-release_latest.generic_all.deb
sudo dpkg -i percona-release_latest.generic_all.deb
2.更新 APT 包列表
sudo apt update
3.启用 XtraBackup 8.4 仓库
sudo percona-release enable-only pxb-84 release
4.安装 Percona XtraBackup 8.4
sudo apt install percona-xtrabackup-84
5. 验证安装
xtrabackup --version
# xtrabackup version 8.4.0-x based on MySQL server 8.4.0 ...
6. 可选:安装压缩工具
Percona XtraBackup 支持使用 qpress, lz4, 或 zstd 等工具进行压缩备份。如果你打算使用这些功能,建议一并安装相应的包:
sudo apt install qpress lz4 zstd
7.备份命令
## 全量备份 (Backup)
xtrabackup --backup --user=root --password=admin --target-dir=/home/mysql/mysql_backup
## 准备备份 (Prepare)
xtrabackup --prepare --target-dir=/home/mysql/mysql_backup
# 恢复数据 (Restore)
# 1. 停止 MySQL 服务
sudo systemctl stop mysql
# 2. 清空 MySQL 数据目录(**警告:此操作会删除现有数据!**)
sudo rm -rf /var/lib/mysql/*
# 3. 将准备好的备份数据恢复到 MySQL 数据目录
xtrabackup --copy-back --target-dir=/home/mysql/mysql_backup --datadir=/home/mysql/data3308
# 4. 确保文件权限正确
sudo chown -R mysql:mysql /var/lib/mysql
# 5. 启动 MySQL 服务
sudo systemctl start mysql
8.启动容器备份
percona/percona-xtrabackup:8.0.34[/8.4]
#!/bin/bash
# MySQL XtraBackup 备份脚本 (Docker 容器方式) 优化版
set -euo pipefail
# 配置
BASE_PATH=/home/mysql
CONTAINER_NAME="mysql3307"
PXB_IMAGE="percona/percona-xtrabackup:8.0.34"
BACKUP_DIR="$BASE_PATH/backup"
MYSQL_HOST="192.168.31.100"
MYSQL_PORT=3307
MYSQL_USER="root"
MYSQL_PASS="admin"
DATA=$(date +%F-%H%M%S)
# 子目录
FULL_DIR="$BACKUP_DIR/full/$DATA"
ARCHIVE_DIR="$BACKUP_DIR/archive"
mkdir -p "$FULL_DIR" "$ARCHIVE_DIR"
log() {
echo "$(date '+%F %T') - $*"
}
backup_full() {
log "🚀 开始全量备份 -> $FULL_DIR"
docker run --rm \
--name pxb \
--network container:$CONTAINER_NAME \
--volumes-from $CONTAINER_NAME \
-v "$FULL_DIR":/backup \
-u root \
$PXB_IMAGE \
/bin/bash -c "
xtrabackup --backup \
--datadir=/var/lib/mysql/ \
--target-dir=/backup \
--user=$MYSQL_USER \
--password=$MYSQL_PASS \
--host=$MYSQL_HOST \
--port=$MYSQL_PORT && \
echo '📦 开始 prepare...' && \
xtrabackup --prepare --target-dir=/backup
"
log "✅ 全量备份完成: $FULL_DIR"
}
archive_backup() {
local tar_file="$ARCHIVE_DIR/${DATA}.tar.gz"
log "📦 打包备份 -> $tar_file"
if command -v pigz >/dev/null 2>&1; then
tar -cf - -C "$FULL_DIR" . | pigz > "$tar_file"
else
tar -czf "$tar_file" -C "$FULL_DIR" .
fi
log "🎉 打包完成 -> $tar_file"
# 删除原始备份目录
log "🧹 清理原始目录 -> $FULL_DIR"
rm -rf "$FULL_DIR"
}
main() {
backup_full
archive_backup
}
main "$@"
9. 恢复数据
#!/bin/bash
# 一键恢复 MySQL8.0.x 数据库
# 备份卷 backupvol:/backup_8034 : 物理备份路径/容器内临时目录
# 使用 xtrabackup 镜像 percona/percona-xtrabackup:8.0.34
CONTAINER_NAME="mysql3310"
BACKUP_VOL="/home/mysql/backup:/backup_8034"
IMAGE="percona/percona-xtrabackup:8.0.34"
echo "🚨 开始恢复 MySQL 数据库: $CONTAINER_NAME"
# 1. 停止 MySQL 容器
echo "👉 停止容器 $CONTAINER_NAME ..."
docker stop $CONTAINER_NAME
# 2. 清理原数据目录
echo "👉 清理数据目录 /var/lib/mysql ..."
docker run --rm --volumes-from $CONTAINER_NAME alpine sh -c "rm -rf /var/lib/mysql/*"
# 3. 执行 xtrabackup copy-back
echo "👉 执行 xtrabackup --copy-back ..."
docker run \
--volumes-from $CONTAINER_NAME \
-v $BACKUP_VOL \
-it --rm --user root \
$IMAGE \
/bin/bash -c "xtrabackup --copy-back --datadir=/var/lib/mysql/ --target-dir=/backup_8034"
# 4. 修复权限
echo "👉 修复目录权限 ..."
docker run --rm --volumes-from $CONTAINER_NAME alpine sh -c "chown -R mysql:mysql /var/lib/mysql"
# 5. 启动 MySQL 容器
echo "👉 启动容器 $CONTAINER_NAME ..."
docker start $CONTAINER_NAME
echo "✅ 数据恢复完成!"
MySQL & XtraBackup 版本匹配
| MySQL 版本 | 推荐 XtraBackup 版本 | 注意事项 |
|---|---|---|
| MySQL 5.5 | XtraBackup 2.4 | 确保不使用 MySQL 5.6+ 特定功能(如 GTID)。 |
| MySQL 5.6 | XtraBackup 2.4 | 完全兼容,注意压缩表问题。 |
| MySQL 5.7 | XtraBackup 2.4.21+ | MySQL 5.7.32 需要 XtraBackup 2.4.21 或更高版本。 |
| MySQL 8.0 | XtraBackup 8.0.35-34+ | 需匹配或高于 MySQL 次版本,注意 8.0.20、8.0.22、8.0.29 的 redo log 变化。 |
| MySQL 8.4+ | percona/percona-xtrabackup:8.4+ | 需匹配或高于 MySQL 次版本 |
| MariaDB 10.1/10.2 | XtraBackup 2.4(有限支持) | 推荐使用 mariadb-backup,注意 redo log 和 undo log 兼容性问题。 |
| MariaDB 10.3+ | 不支持 XtraBackup | 使用 mariadb-backup。 |
1万+

被折叠的 条评论
为什么被折叠?



