xtrabackup定时备份

如何使用xtrabackup进行mysql数据备份可以参考上一篇文章xtrabackup实现mysql备份
在我们已经准备好xtabackup工具后,我们想实现定时备份,每天全量同步一次,每小时增量备份一次,同时只保留最近14天的备份,可参考以下脚本,如果有其他需求,可在此基础上进行修改。

 #!/bin/bash
## 备份计划任务
## 
## 每天凌晨1:30一次全量备份
## 每天间隔1小时一次增量备份
## 30 1 * * * backup.sh full
## 00 * * * * backup.sh inc
##
##  恢复数据步骤:
##  (1)、查看备份日志,找到全量备份和增量备份的关系(注意增量备份的顺序)
##
##  cat ${BACKUP_BASE_DIR}/${INC_BASE_LIST}
##  (2)、全量备份
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir
##
##  (3)、第一个增量
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir \
##  --incremental-dir=${BACKUP_BASE_DIR}/one_inc_dir
##
##  (4)、第二个增量
##  innobackupex --defaults-file=/etc/my.cnf --apply-log ${BACKUP_BASE_DIR}/full_dir \
##  --incremental-dir=${BACKUP_BASE_DIR}/two_inc_dir
##
##  (5)、恢复数据
##  innobackupex --defaults-file=/etc/my.cnf --copy-back ${BACKUP_BASE_DIR}/full_dir
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
BACKUP_BASE_DIR="/data/xtrabackup/backData"
INC_BASE_LIST="${BACKUP_BASE_DIR}/inc_list.txt"
XTRABACKUP_PATH="/usr/bin/innobackupex"
MYSQL_CNF="/etc/my.cnf"
MYSQL_HOSTNAME=localhost
MYSQL_USERNAME=root
MYSQL_PASSWORD=root
LOCK_FILE=/tmp/innobackupex.lock
THREAD=3
mkdir -p ${BACKUP_BASE_DIR}
CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M)"
[[ -d ${CURRENT_BACKUP_PATH} ]] && CURRENT_BACKUP_PATH="${BACKUP_BASE_DIR}/$(date +%F_%H-%M-%S)"
print_help(){
   echo "--------------------------------------------------------------"
   echo "Usage: $0 full | inc | help               "
   echo "--------------------------------------------------------------"
   exit 1
}
[[ $# -lt 1 || "$1" == "help" ]] && print_help
[[ -f "$LOCK_FILE" ]] && echo -e "Usage: rm -f $LOCK_FILE\nUsage: chattr -i $LOCK_FILE && rm -f $LOCK_FILE" && exit 1
      
 FullBackup(){
   touch $LOCK_FILE
   chattr +i $LOCK_FILE
   local rc=0
   ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --parallel=${THREAD} \
    --no-timestamp ${CURRENT_BACKUP_PATH} > ${CURRENT_BACKUP_PATH}_full.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_full.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
      rc=1
      [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
      echo "NULL|${CURRENT_BACKUP_PATH}|full" >> ${INC_BASE_LIST}
      [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
      chattr -i ${LOCK_FILE}
      rm -f $LOCK_FILE
      chattr +a ${INC_BASE_LIST}
      return $rc
    }
      
IncBackup(){
    touch $LOCK_FILE
    chattr +i $LOCK_FILE
    local rc=0
    PREV_BACKUP_DIR=$(sed '/^$/d' ${INC_BASE_LIST} | tail -1 | awk -F '|' '{print $2}')
    ${XTRABACKUP_PATH} \
    --defaults-file=${MYSQL_CNF} \
    --user=${MYSQL_USERNAME} \
    --password=${MYSQL_PASSWORD} \
    --host=${MYSQL_HOSTNAME} \
    --no-timestamp --incremental ${CURRENT_BACKUP_PATH} \
    --incremental-basedir=${PREV_BACKUP_DIR} > ${CURRENT_BACKUP_PATH}_inc.log 2>&1
    grep ".*\ completed\ OK\!" ${CURRENT_BACKUP_PATH}_inc.log > /dev/null 2>&1
    if [ $? -ne 0 ];then
      rc=1
      [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && rm -rf ${CURRENT_BACKUP_PATH}
    else
      echo "${PREV_BACKUP_DIR}|${CURRENT_BACKUP_PATH}|inc" >> ${INC_BASE_LIST}
      [[ -d ${CURRENT_BACKUP_PATH} && $(pwd) != "/" ]] && chattr +i ${CURRENT_BACKUP_PATH} || rc=1
    fi
      chattr -i ${LOCK_FILE}
      rm -f $LOCK_FILE
      chattr +a ${INC_BASE_LIST}
      return $rc
    }

## 全量备份
if [ "$1" == "full" ];then
    FullBackup     
fi
## 增量备份
if [ "$1" == "inc" ];then
## 判断上一次备份是否存在,无则进行全量备份
   if [[ ! -f ${INC_BASE_LIST} || $(sed '/^$/d' ${INC_BASE_LIST} | wc -l) -eq 0 ]];then
      FullBackup
    else
      IncBackup
    fi
fi

## 删除14天前的备份
if [[ -d ${BACKUP_BASE_DIR} && $(pwd) != "/" ]];then
    find ${BACKUP_BASE_DIR} -name "$(date -d '14 days ago' +'%F')_*" | xargs chattr -i
    find ${BACKUP_BASE_DIR} -name "$(date -d '14 days ago' +'%F')_*" | xargs rm -rf
fi

以上脚本是同步脚本,要实现定时任务可以采用linux的crontab。
crontab命令常见于Unix和类Unix的操作系统之中,用于设置周期性被执行的指令。该命令从标准输入设备读取指令,并将其存放于“crontab”文件中,以供之后读取和执行。该词来源于希腊语 chronos(χρνο),原意是时间。通常,crontab储存的指令被守护进程激活, crond常常在后台运行,每一分钟检查是否有预定的作业需要执行。这类作业一般称为cron jobs。
crontab命令选项:

  -u 指定一个用户
  
 -l 列出某个用户的任务计划

 -r 删除某个用户的任务(不添加用户即删除所有的任务)

 -e 编辑某个用户的任务

下面增加两个定时任务

crontab -e

输入以下定时任务

30 1 * * * /data/xtrabackup/shell/backup.sh full  
0 0/1 * * * /data/xtrabackup/shell/backup.sh inc

自此,定时任务就生效了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用shell脚本定时执行xtrabackup增量备份,具体步骤如下: 1. 安装xtrabackup工具,该工具可以备份MySQL数据库并支持增量备份。 2. 编写shell脚本,包括备份命令、备份文件存储路径、备份日志记录等内容。 3. 使用crontab命令设置定时任务,例如每天凌晨2点执行备份任务。 下面是一个简单的示例脚本,用于每天凌晨2点执行增量备份并发送备份信息邮件: ```bash #!/bin/bash # 定义备份文件存储路径 backup_dir=/data/backup/mysql # 定义备份日志文件路径 log_file=/data/backup/mysql/backup.log # 定义MySQL用户名和密码 user=root password=123456 # 定义备份文件名前缀 prefix=mysql_backup # 定义备份文件名后缀 suffix=$(date +%Y%m%d_%H%M%S) # 定义增量备份命令 incremental_command="xtrabackup --backup --target-dir=$backup_dir --incremental-basedir=$backup_dir/incremental --user=$user --password=$password >> $log_file 2>&1" # 定义完整备份命令 full_command="xtrabackup --backup --target-dir=$backup_dir --user=$user --password=$password >> $log_file 2>&1" # 判断是否存在增量备份目录,如果不存在则创建 if [ ! -d "$backup_dir/incremental" ]; then mkdir -p $backup_dir/incremental fi # 判断今天是否已经执行过增量备份,如果是则执行增量备份,否则执行完整备份 if [ -f "$backup_dir/incremental/$(date +%Y%m%d)_backup.incremental" ]; then eval $incremental_command else eval $full_command fi # 发送备份信息邮件 mail -s "MySQL Backup Report" user@example.com < $log_file ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值