写一个xtrabackup备份脚本,要求备份时不会影响生产使用,每天凌晨两点备份一次,注意每周五全量备份,剩余时间在全量备份基础上增量备份,只保存两周的备份数据
时间: 2025-07-12 10:01:29 浏览: 3
### 编写 Xtrabackup 备份 Shell 脚本
为了满足生产环境中每天凌晨2点自动备份的需求,在周五进行全量备份,其余时间为增量备份,并且只保留最近两周的数据,可以按照如下方式编写Shell脚本来实现。
#### 1. 设置全局变量
定义一些必要的路径和参数作为全局变量以便于管理和维护:
```bash
#!/bin/bash
# MySQL 和 Percona XtraBackup 的配置项
USER="root"
PASSWORD="your_password_here"
SOCKET="/var/lib/mysql/mysql.sock"
INNOBACKUPEX=$(which innobackupex)
MYSQL=$(which mysql)
# 时间戳用于区分不同日期的备份文件夹名
DATESTAMP=$(date +%F_%H-%M-%S)
# 日志位置
LOG_DIR="/path/to/log/directory"
mkdir -p ${LOG_DIR}
# 主备份目录
BASE_BACKUP_DIR="/data/backups/mysql/${DATESTAMP}"
FULL_BACKUP_DIR="${BASE_BACKUP_DIR}/full"
INCREMENTAL_BACKUP_DIR="${BASE_BACKUP_DIR}/incremental"
# 创建所需的目录结构
mkdir -p "${FULL_BACKUP_DIR}" "${INCREMENTAL_BACKUP_DIR}"
# 清除超过两周的老备份
find /data/backups/mysql/* -type d -mtime +14 | xargs rm -rf {}
```
这段代码设置了MySQL连接信息、工具路径以及备份存储的位置等基本信息[^3]。同时通过 `find` 命令清理掉超出两周的历史备份记录。
#### 2. 判断当前是否为周五并决定执行哪种类型的备份
利用Linux系统的 `date` 工具来获取今天的星期几,并据此判断应该做何种级别的备份操作:
```bash
DAY_OF_WEEK=$(date +%u) # 获取今天是一周中的哪一天 (1=Mon, ..., 7=Sun)
if [[ $DAY_OF_WEEK -eq 5 ]]; then
echo "Performing full backup on Friday..."
# 执行完整的数据库备份
${INNOBACKUPEX} --defaults-file=${MYCNF} \
--user=${USER} --password=${PASSWORD} \
--socket=${SOCKET} \
--no-timestamp \
${FULL_BACKUP_DIR}
else
LATEST_FULL_BACKUP=$(ls -dt /data/backups/mysql/*/full | head -n 1)
if [ ! -d "$LATEST_FULL_BACKUP" ]; then
echo "No previous full backups found! Cannot perform incremental."
exit 1
fi
echo "Performing incremental backup..."
# 使用最新的完整备份作为基础来进行增量备份
${INNOBACKUPEX} --defaults-file=${MYCNF} \
--user=${USER} --password=${PASSWORD} \
--socket=${SOCKET} \
--incremental-basedir=${LATEST_FULL_BACKUP} \
--no-timestamp \
${INCREMENTAL_BACKUP_DIR}
fi
```
这里使用了 `%u` 参数让 `date` 返回一周内的具体某天编号(其中1代表周一),当等于5时表示是周五,则会触发一次新的全量备份过程;如果不是周五的话就查找最新的一次全量备份作为参照来做增量备份[^1]。
#### 3. 记录日志与错误处理机制
无论成功与否都应该把每次运行的结果都记入日志当中方便后续排查问题:
```bash
if [ $? -ne 0 ]; then
ERROR_MSG="Error occurred during the backup process!"
echo "[ERROR][${DATESTAMP}] ${ERROR_MSG}" >>"${LOG_DIR}/backup_errors.log"
exit 1
else
SUCCESS_MSG="Backup completed successfully at ${DATESTAMP}."
echo "[INFO ][${DATESTAMP}] ${SUCCESS_MSG}" >>"${LOG_DIR}/backup_successes.log"
fi
```
以上部分实现了简单的错误捕捉逻辑,如果命令返回的状态码不是零就意味着出现了异常情况,此时会在专门的日志文件里留下提示信息。
#### 4. 将脚本加入定时任务计划
为了让这个脚本能定期被执行,还需要将其添加到cron作业列表中去:
编辑crontab条目以安排每晚两点钟启动该脚本:
```bash
0 2 * * * /path/to/your_script.sh >/dev/null 2>&1
```
这行指令表示每天早上2点钟准时调用指定路径下的备份脚本程序,并将标准输出重定向丢弃以免干扰其他服务正常工作[^2]。
阅读全文
相关推荐















