Xtrabackup8配置全量备份🪔
使用xtrabackup8配置MySQL8全量备份。
1. 编写全量备份脚本
⭐备份过程中涉及用户密码,这里不采用明文配置,使用专门的/etc/xtrabackup.cnf凭据文件。
[root@localhost ~]# vim /etc/xtrabackup.cnf
[client]
user=backup
password=NBJb_sdgfxYhhK6$jfj#
socket=/var/lib/mysql/mysql.sock[xtrabackup]
datadir=/var/lib/mysql/data
#设置权限
[root@localhost ~]# chmod 600 /etc/xtrabackup.cnf
[root@localhost ~]# chown root:root /etc/xtrabackup.cnf
脚本如下:
[root@localhost ~]# /data/mysql/scripts/xtrabackup_full_backup.sh
#!/bin/bash
#
# ==============================================================================
# MySQL 全量物理备份脚本(基于 Percona XtraBackup)
# 适用于 MySQL 8.0 + 主从环境,优先在从库执行
# 作者:Noleaf 提供,生产可用
# 日期:2025-12-25
#===============================================================================# 更安全的错误处理
set -euo pipefail #=============================变量定义==========================================#定义时间戳
Timestamp=$(date '+%F_%H-%M-%S')#备份根目录
BACKUP_BASE=/data/mysql/backup#物理全量备份根目录
BACKUP_ROOT=${BACKUP_BASE}/physical_full_backup#备份文件名称
BACKUP_NAME="full_backup_${Timestamp}"#物理全量备份目录(即实际备份的父目录, 存放各个时间点的全量文件夹)
FULL_BACKUP_DIR=${BACKUP_ROOT}/${BACKUP_NAME}#日志目录及文件
LOG_DIR=${BACKUP_ROOT}/logs
LOG_FILE=${LOG_DIR}/${BACKUP_NAME}.log#备份用户(认证凭据采用/etc/xtrabackup.cnf文件)
#MYSQL_USER=backup
#MYSQL_PASS='NBJb_sljfxYhhK6$jfj#'#控制并行复制数据的线程数(自动计算20%CPU线程数,最小4)
PARALLEL_THREADS=$(($(nproc)*20/100))
[[ $PARALLEL_THREADS -lt 4 ]] && PARALLEL_THREADS=4#控制并行压缩数据的线程数(自动计算10%CPU线程数,最小2)
COMPRESS_THREADS=$(($(nproc)*10/100))
[[ $COMPRESS_THREADS -lt 2 ]] && COMPRESS_THREADS=2#定义清理文件时间
KEEP_DAYS=15echo "==========================创建备份必要的目录======================="
mkdir -p "$BACKUP_ROOT" "$LOG_DIR" "$FULL_BACKUP_DIR" || {echo "ERROR: 无法创建备份相关目录"exit 1
}echo "========================== 物理全量备份开始于 [$Timestamp] ===================" | tee -a "$LOG_FILE"#1.备份前校验 xtrabackup 是否存在
command -v xtrabackup >/dev/null 2>&1 || {echo "ERROR: xtrabackup 未安装" | tee -a "$LOG_FILE"exit 1
}#2.备份前校验 MySQL 实例是否存活
if ! mysqladmin --defaults-extra-file=/etc/xtrabackup.cnf \ping --silent; thenecho "ERROR: MySQL 实例不可用,取消备份" | tee -a "$LOG_FILE"exit 1
fi#3.执行XtraBackup全量备份
echo "开始执行XtraBackup全量备份到 ${BACKUP_ROOT}..." | tee -a "$LOG_FILE"if xtrabackup --defaults-file=/etc/xtrabackup.cnf \--backup \--target-dir="${FULL_BACKUP_DIR}" \--parallel="${PARALLEL_THREADS}" \--compress \--compress-threads="${COMPRESS_THREADS}" \--no-server-version-check \>> "${LOG_FILE}" 2>&1; thenecho "Success: 全量备份成功!" | tee -a "$LOG_FILE"
elseecho "ERROR: 全量备份失败!请检查日志 ${LOG_FILE}" | tee -a "$LOG_FILE"exit 1
fi#因使用了set -euo pipefail,有部分冲突,建议使用上面的if语句
#xtrabackup --defaults-file=/etc/xtrabackup.cnf \
# --backup \
# --target-dir=${FULL_BACKUP_DIR} \
# --parallel=${PARALLEL_THREADS} \
# --compress \
# --compress-threads=${COMPRESS_THREADS} \
# --no-server-version-check \
# >> ${LOG_FILE} 2>&1
#
#
#if [ $? -eq 0 ]; then
# echo "Success: 全量备份成功!" | tee -a "$LOG_FILE"
#else
# echo "ERROR: 全量备份失败!请检查日志 ${LOG_FILE}" | tee -a "$LOG_FILE"
# exit 1
#fi#完成时间不能用上面Timestamp
echo "Full backup completed at $(date '+%F_%H-%M-%S')" >> ${LOG_FILE}# [重要说明]
# 当前脚本使用了 --compress 生成压缩备份。
# 此时的备份处于 "Raw" 状态,尚未进行 Prepare。
# 恢复时必须先解压,再 Prepare。命令如下:
# 1. xtrabackup --decompress --target-dir=/path/to/backup
# 2. xtrabackup --prepare --target-dir=/path/to/backup
# 3. xtrabackup --copy-back --target-dir=/path/to/backup#清理15天之前备份
echo "正在清理 $KEEP_DAYS 天之前的旧备份..." | tee -a $LOG_FILE
find "${BACKUP_ROOT}" -maxdepth 1 -type d -name "full_backup*" -mtime +${KEEP_DAYS} -exec rm -rf {} \;
find "${BACKUP_ROOT}/logs" -maxdepth 1 -type f -name "full_backup*" -mtime +${KEEP_DAYS} -exec rm -f {} \;#统计数据简报
BACKUP_SIZE=$(du -sh "${FULL_BACKUP_DIR}" | cut -f1)
echo "本次备份大小:${BACKUP_SIZE}" | tee -a "$LOG_FILE"
echo "本次备份目录:${FULL_BACKUP_DIR}" | tee -a "$LOG_FILE"echo "=================== 全量备份完成于 [$(date '+%F %H:%M:%S')] ===================" | tee -a "$LOG_FILE"
2. 执行脚本
[root@localhost ~]# bash /data/mysql/scripts/xtrabackup_full_backup.sh
==========================创建备份必要的目录=======================
========================== 物理全量备份开始于 [2025-12-29_11-14-05] ===================
mysqld is alive
开始执行XtraBackup全量备份到 /data/mysql/backup/physical_full_backup...
Success: 全量备份成功!
正在清理 15 天之前的旧备份...
本次备份大小:140M
本次备份目录:/data/mysql/backup/physical_full_backup/full_backup_2025-12-29_11-14-05
=================== 全量备份完成于 [2025-12-29 11:14:17] ===================
备份成功!