#!/bin/bash
# 配置变量
BACKUP_FILE="/root/docker/mysql8/backup/full/full-20240531114830.tar.gz" # 备份文件
MYSQL_DATA_DIR="/root/docker/mysql8-test/data" # MySQL 数据目录
MYSQL_CONTAINER_NAME="mysqltest" # MySQL 容器名称
MYSQL_DOCKER_COMPOSE_DIR="/root/docker/mysql8-test" # 此处为MySQL的docker-compose up -d所在目录
# 检查是否以root身份运行
if [ "$(id -u)" != "0" ]; then
echo "此脚本必须以root用户运行" 1>&2
exit 1
fi
TEMP_DIR=$(mktemp -d)
# 解压备份文件
echo "解压备份文件"
tar -xzvf $BACKUP_FILE --strip-components=1 -C $TEMP_DIR
# 停止MySQL服务
echo "停止MySQL服务..."
set +e
docker stop $MYSQL_CONTAINER_NAME
set -e
# systemctl stop mysqld
# 检查 docker stop 命令的退出状态码
if [ $? -eq 0 ]; then
# 等待几秒钟,以确保容器停止
sleep 4
# 再次检查容器是否已停止
if ! docker ps | grep -q $MYSQL_CONTAINER_NAME; then
echo "容器 $MYSQL_CONTAINER_NAME 已成功停止"
else
echo "mysql停止失败,请手动停止mysql"
exit 1
fi
else
echo "容器 $MYSQL_CONTAINER_NAME 停止命令执行失败"
exit 1
fi
# 解压缩
echo "解压缩..."
set +e
docker rm pxback-decompress
set -e
docker run --name pxback-decompress -v $TEMP_DIR:/backup -it --user root percona/percona-xtrabackup:8.2.0 /bin/bash -c "xtrabackup --decompress --target-dir=/backup"
# 准备备份
echo "准备备份..."
set +e
docker rm pxback-prepare
set -e
docker run --name pxback-prepare -v $TEMP_DIR:/backup -it --user root percona/percona-xtrabackup:8.2.0 /bin/bash -c "xtrabackup --prepare --target-dir=/backup"
# xtrabackup --prepare --target-dir=$TEMP_DIR
# 清空MySQL数据目录
echo "清空MySQL数据目录..."
rm -rf $MYSQL_DATA_DIR/*
# 恢复备份到MySQL数据目录
echo "恢复备份到MySQL数据目录..."
cp -r $TEMP_DIR/* $MYSQL_DATA_DIR/
rm -rf $TEMP_DIR
# 设置MySQL数据目录权限
# echo "设置MySQL数据目录权限..."
# chown -R $MYSQL_USER:$MYSQL_GROUP $MYSQL_DATA_DIR
# 启动MySQL服务
echo "启动MySQL服务..."
cd $MYSQL_DOCKER_COMPOSE_DIR
docker-compose up -d
# systemctl start mysqld
C_START=$(docker ps |grep $MYSQL_CONTAINER_NAME | head -1)
if [ -z "$C_START" ]; then
echo "MySQL服务未成功启动,请手动重启mysql。" 1>&2
exit 1
fi
【笔记】使用XtraBackup进行备份恢复
于 2024-05-31 11:57:38 首次发布