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 的工作流如下:
-
连接:根据
--defaults-file登录 MySQL。 -
拷贝:开启多个线程 (
--parallel) 同时读取数据文件。 -
处理:读取的数据交给压缩线程 (
--compress-threads) 进行实时压缩。 -
持久化:将处理后的数据写入目标目录 (
--target-dir)。 -
收尾:记录当前的 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

浙公网安备 33010602011771号