Xtrabackup MySQL增量备份脚本分享

增量脚本mysql_incremental.sh,可通过crontab定时任务执行。

#!/bin/sh
####################################################################
# 
# 作者:大帅
# 各项参数详细说明请参考作者文章:https://www.sirix.app/archives/27.html
#
####################################################################

# innobackupex执行文件
INNOBACKUPEX=innobackupex
# innobackupex所在目录
INNOBACKUPEXFULL=/usr/bin/$INNOBACKUPEX
# 获取当前时间
TODAY=$(date +%Y%m%d%H%M)
# MySQL用户名、密码等配置
USEROPTIONS="--host=127.0.0.1 --user=root --password=123456"
# 压缩配置
COMPRESS="--compress --parallel=4 --compress-threads=4"
# 临时文件
TMPFILE="/var/log/mysql/incr_$TODAY.log"
# MySQL配置文件
MYCNF=/etc/my.cnf
# MySQL执行文件目录
MYSQL=//usr/bin/mysql
# MySQL mysqladmin执行文件目录
MYSQLADMIN=/usr/bin/mysqladmin
# 备份的主目录
BACKUPDIR=/mysql_backup
# 全库备份的目录∏
FULLBACKUPDIR=$BACKUPDIR/full
# 增量备份的目录
INCRBACKUPDIR=$BACKUPDIR/incr

#############################################################################
# 显示错误消息并退出
#############################################################################
error() {
  echo "$1" 1>&2
  exit 1
}

# 执行之前检查
if [ ! -x $INNOBACKUPEXFULL ]; then
  error "$INNOBACKUPEXFULL 不存在."
fi

if [ ! -d $BACKUPDIR ]; then
  error "备份的主目录: $BACKUPDIR 不存在."
fi

if [ -z "$($MYSQLADMIN $USEROPTIONS status | grep 'Uptime')" ]; then
  error "已停止: MySQL未启动."
fi

if ! $(echo 'exit' | $MYSQL -s $USEROPTIONS); then
  error "已停止: 提供的MySQL用户名或密码似乎不正确(出于安全考虑,此处未复制,请参阅脚本)."
fi

# 信息输出
echo "----------------------------"
echo
echo "$0: MySQL备份脚本"
echo "开始时间: $(date)"
echo

# 如果全量备份目录不存在则创建完整和增量备份目录
for i in $FULLBACKUPDIR $INCRBACKUPDIR; do
  if [ ! -d $i ]; then
    mkdir -pv $i
  fi
done

# 查找最新的完整备份
LATEST_FULL=$(find $FULLBACKUPDIR -mindepth 1 -maxdepth 1 -type d -printf "%P\n")
echo "LATEST_FULL=$LATEST_FULL"

# 如果最新完整备份仍然存在,运行增量备份
# 创建增量备份目录(如果增量备份目录不存在)
mkdir -p $INCRBACKUPDIR
BACKTYPE="incr"
# 查找最新的增量备份
LATEST_INCR=$(find $INCRBACKUPDIR -mindepth 1 -maxdepth 1 -type d | sort -nr | head -1)
echo "LATEST_INCR=$LATEST_INCR"
# 如果这是第一次增量,请使用完整备份作为基准。否则使用最新的增量作为基准。
if [ ! $LATEST_INCR ]; then
  INCRBASEDIR=$FULLBACKUPDIR/$LATEST_FULL
else
  INCRBASEDIR=$LATEST_INCR
fi
echo "运行新的增量备份,使用 $INCRBASEDIR 作为基准."
echo "innobackupex --defaults-file=$MYCNF $USEROPTIONS $COMPRESS --incremental $INCRBACKUPDIR --incremental-basedir $INCRBASEDIR > $TMPFILE 2>&1"
innobackupex --defaults-file=$MYCNF $USEROPTIONS $COMPRESS --incremental $INCRBACKUPDIR --incremental-basedir $INCRBASEDIR >$TMPFILE 2>&1

if [ -z "$(tail -1 $TMPFILE | grep 'completed OK!')" ]; then
  echo "$INNOBACKUPEX 失败:"
  echo
  echo "---------- ERROR OUTPUT from $INNOBACKUPEX ----------"
  exit 1
fi

# 这里获取这次备份的目录
THISBACKUP=$(awk -- "/Backup created in directory/ { split( \$0, p, \"'\" ) ; print p[2] }" $TMPFILE)
echo "THISBACKUP=$THISBACKUP"
echo
echo "数据库备份成功 to: $THISBACKUP"

echo
echo "增量备份已完成: $(date)"
exit 0