Docker MySQL8.x 备份工具 XtraBackup

环境是 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

  1. 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
  1. 安装 XtraBackup
sudo apt update
sudo apt install -y percona-xtrabackup-80
  1. 验证安装
xtrabackup --version

输出类似:

xtrabackup version 8.0.x based on MySQL server 8.0.x

二、准备 MySQL 备份账号

建议不要直接用 root,而是新建一个专门的备份用户。

  1. 登录 MySQL:
mysql -uroot -p
  1. 创建备份账号:
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

四、恢复流程(关键)

  1. 准备恢复目录
mkdir -p /data/mysql_restore
  1. 准备数据(回放日志)
xtrabackup --prepare --target-dir=/data/mysql_backup/full/2025-08-29_00-00-00

如果有增量备份,需要按顺序 --apply-log-only 逐个应用。

  1. 停止 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.启动容器备份

xtrabackup 8.4 docker

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. 恢复数据

xtrabackup 8.4 恢复备份

#!/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.5XtraBackup 2.4确保不使用 MySQL 5.6+ 特定功能(如 GTID)。
MySQL 5.6XtraBackup 2.4完全兼容,注意压缩表问题。
MySQL 5.7XtraBackup 2.4.21+MySQL 5.7.32 需要 XtraBackup 2.4.21 或更高版本。
MySQL 8.0XtraBackup 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.2XtraBackup 2.4(有限支持)推荐使用 mariadb-backup,注意 redo log 和 undo log 兼容性问题。
MariaDB 10.3+不支持 XtraBackup使用 mariadb-backup。
### 如何使用XtraBackup备份Docker中运行的MySQL数据库 为了成功地利用Percona XtraBackup备份位于Docker容器内的MySQL数据库,需遵循特定的方法以确保数据的一致性和完整性。考虑到`mysql`容器和`xtrabackup`容器部署于同一服务器之上[^1],这使得操作更为简便。 #### 准备工作 确认已安装适当版本的Docker(20.10.6)以及docker-compose(1.28.5),这对于构建多服务应用至关重要[^2]。此外,在执行任何备份之前,请先停止正在运行的服务实例,并清理旧有的备份文件以防冲突发生: ```bash docker exec -it <container_name> bash /etc/init.d/mysql stop rm -rf /var/lib/mysql/* ``` #### 执行全量备份 通过命令行启动完全备份过程,指定目标路径保存副本资料: ```bash xtrabackup --backup --target-dir=/path/to/backup_dir/ ``` 此指令会创建一个新的备份集存放在给定位置。对于基于Docker环境的操作而言,建议将该目录映射至宿主机上的持久化存储空间内以便长期保留[^3]。 #### 实施增量备份 除了定期进行全面复制外,还可以设置定时任务来进行更频繁的小规模更新记录——即所谓的“增量备份”。这种方式能够有效减少资源消耗的同时保持最新的状态快照可用性。编辑crontab条目定义计划作业如下所示[^5]: ```bash echo '0 */2 * * 1,2,4,5,7 root /root/incrbak.sh >> /var/log/mysql_backup.log 2>&1' >> /etc/crontab ``` 上述脚本安排每两小时一次(周一、二、四、五、日)执行增量备份程序`incrbak.sh`并将输出重定向到日志文件中去。 #### 数据恢复流程 当需要从现有备份还原整个数据库系统时,则按照以下步骤操作: - 停止当前活动的服务进程; - 清除原有数据文件夹下的所有内容; - 应用先前制作好的完整或部分恢复点; - 更改权限使新加载的数据可被访问; - 启动MySQL服务完成迁移过程。 具体实施可以参照下面这段shell代码片段[^4]: ```bash # 进入对应容器内部终端 docker exec -it <container_name> bash # 关闭mysqld服务 /etc/init.d/mysql stop # 删除/var/lib/mysql下全部项目 rm -rf /var/lib/mysql/* # 将备份拷贝回原位 xtrabackup --copy-back --target-dir=/home/full # 修改属组属性为mysql用户拥有者身份 chown -R mysql:mysql /var/lib/mysql # 开启mysqld服务 /etc/init.d/mysql bootstrap-pxc ``` 以上就是关于如何运用XtraBackup工具针对Docker环境中托管着MySQL实例的情况下来达成高效可靠的备份策略介绍。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值