Xtrabackup8配置MySQL8全量备份🪔

Xtrabackup8配置MySQL8全量备份🪔


 

使用xtrabackup8配置MySQL8全量备份。

🌙增量备份文档请移步:https://www.cnblogs.com/haoee/p/19416137


1.  配置全量备份命令

[root@localhost ~]# 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

这段命令是使用 Percona XtraBackup 对 MySQL 进行物理备份的核心指令。

以下是各参数的详细含义解析:

参数 含义与作用
--defaults-file=/etc/xtrabackup.cnf 指定MySQL配置文件路径。XtraBackup会读取此文件以获取数据目录位置(datadir)、socket文件路径等信息。更重要的是,它通常在此文件中的 [client] 或 [xtrabackup] 段读取数据库连接的用户名(user)和密码(password),避免了在命令行中明文暴露密码
--backup 执行备份操作的主指令。告诉xtrabackup程序本次要执行的是备份任务。
--target-dir=“${FULL_BACKUP_DIR}” 指定备份文件的存储目标目录。所有备份出的数据文件都将放在这个路径下。
--parallel=“${PARALLEL_THREADS}” 设置并行拷贝数据文件的线程数。此参数能显著加快大数据库的备份速度,尤其在多核CPU和高速存储(如SSD)环境下效果明显。您设置为CPU核心数的20%。
--compress 启用压缩功能。备份时使用QuickLZ算法对每个数据文件进行压缩,可以大幅减少备份文件所占用的磁盘空间(通常能压缩到原来的1/3到1/4)。
--compress-threads=“${COMPRESS_THREADS}” 设置并行压缩的线程数。与 --parallel 配合,一边拷贝一边压缩,充分利用多核CPU。您设置为CPU核心数的10%。
--no-server-version-check 跳过对MySQL服务器版本的检查。在某些定制化或特定版本的MySQL环境下(如您使用的麒麟系统),避免因版本号匹配问题而产生警告或报错,使备份过程更顺畅。
>> “${LOG_FILE}” 2>&1 重定向所有输出到日志文件>> 表示追加写入日志文件;2>&1 表示将标准错误(stderr)也合并到标准输出(stdout)中,即将屏幕上的所有信息(包括正常信息和错误信息)都记录到日志文件

 

💡 核心流程梳理:

当你运行这个命令时,XtraBackup 的工作流如下:

  1. 连接:根据 --defaults-file 登录 MySQL。

  2. 拷贝:开启多个线程 (--parallel) 同时读取数据文件。

  3. 处理:读取的数据交给压缩线程 (--compress-threads) 进行实时压缩。

  4. 持久化:将处理后的数据写入目标目录 (--target-dir)。

  5. 收尾:记录当前的 LSN(日志序列号)到 xtrabackup_checkpoints 文件中。


2.  编写全量备份脚本

⭐备份过程中涉及用户密码,这里不采用明文配置,使用专门的/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
#===============================================================================

#设置xtrabackup和MySQL路径,脚本运行时会自动把 MySQL 和 XtraBackup 的路径加入 PATH
export PATH=/usr/local/mysql-8.0.44/bin:/usr/local/percona-xtrabackup-8.0.35/bin:/usr/bin:/bin

# 更安全的错误处理
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=15

echo "==========================创建备份必要的目录======================="
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; then
    echo "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; then
    echo "Success: 全量备份成功!" | tee -a "$LOG_FILE"
else
    echo "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] ===================

备份成功!

3. 加入计划任务

增加到 crontab 定时执行,例如每天凌晨2点:

[root@localhost ~]# crontab -e
0 2 * * * /data/mysql/scripts/xtrabackup_full_backup.sh >> /var/log/xtrabackup_full_backup.log 2>&1

4.说明与后续建议

  • 压缩备份:由于启用了 --compress,所以恢复时必须先解压再 prepare,再 copy-back。脚本里已经写了提醒,生产环境要严格遵循。

  • 日志管理:日志文件会随着时间增长,虽然你加了清理逻辑,但建议定期归档或集中到日志服务器。

  • 监控与告警:可以在脚本最后加一段邮件/钉钉/企业微信通知,把备份结果推送出去,避免只靠人工查看。

  • 恢复演练:建议定期做一次恢复演练,确认 --decompress → --prepare → --copy-back 全流程无误。


数据恢复请移步:https://www.cnblogs.com/haoee/p/19419496

 

posted @ 2025-12-29 11:29  Noleaf  阅读(6)  评论(0)    收藏  举报