mysql基于xtrabakcup做增量备份

Mysql增量备份

前言:原运维做备份时用mysqldump每天做全量备份,且没有开事物,数据量大了程序直接响应超时,现用xtrabakcup做增量备份
刚开始准备用mydumper这个多线程的备份工具加二进制日志做增量,但想到环境是一个mysql实例运行多个库,单库增量不现实,后面单独列出mydumper+二进制日志的备份脚本,适合整个实例备份

依赖包:

yum install -y pbzip2 pv pigz

脚本:

#!/bin/bash
set -e

user=root
passwd=123456
ctime=`date +'%Y%m%d_%H'`
cday=`date +%u`
info_file=bak_info
log_file=bak.log
dbs="slowquery"
sys_db='performance_schema mysql'     #建议备份单库或单表时,把系统库一起备份,恢复的时候启动需要要用到这些,mysqldump用performance_schema,启动用mysql
pbz2_cmd="pbzip2 -m800 -5 -b8000 -l"  #多进程压缩工具,-m指定进程使用的总内存(M单位),-b指定压缩块大小(KB单位),目前服务器核心和内存不够用,此配置能预留2核1.3G内存(压缩时占用2c2g,根据个人情况修改此)
pgz_cmd="pigz -b512 -1 -p2"           #多线程压缩工具,-b指定压缩块大小(KB单位)
pv_cmd='pv -L 50M -B 300M'
bak_dir=/opt/bk
sync_dir=/data/bak


# 全量备份
# 注释部分为:使用rsync限速时使用,本地备份后同步给远程,数据量很大的情况下,直接同步占用很多带宽,会导致程序出现超时连接
# 使用pv时可直接将数据流限速传给压缩工具
total_backup(){
#  cd $bak_dir
  cd $sync_dir
  for db in $dbs ;do
#  local sync_dir=/data/bak/$db

    echo "[info] `date +'%F %T'`: $db database full backup is running" >> ./$log_file
    mkdir ./${db}_total_data_$ctime
#      xtrabackup -u$user -p$passwd --backup --databases "$db $sys_db" --target-dir ./${db}_total_data_$ctime --stream xbstream 2>> ./$log_file |$pbz2_cmd > ./${db}.bz2 && \
    xtrabackup -u$user -p$passwd --backup -S /tmp/mysql.sock --databases "$db $sys_db" --target-dir ./${db}_total_data_$ctime --stream xbstream 2>> ./$log_file |$pv_cmd |$pbz2_cmd > ./${db}.bz2 && \
    mv ./${db}.bz2 ./${db}_total_data_$ctime && \
    echo "latest_dir=${db}_total_data_$ctime" >  ./${db}_$info_file
    [ $? = 0 ] && . ./${db}_$info_file && tar -cf - $latest_dir |$pgz_cmd > ${latest_dir}.tgz

#      [ -e $sync_dir ] && install -d  $sync_dir
#      rsync --progress --bwlimit=75000 --remove-source-files ./${latest_dir}.tgz $sync_dir &>> ./$log_file
#      rsync -a --progress --bwlimit=75000 --remove-source-files ./${db}_* ${sync_dir/$db} &>> ./$log_file && rmdir ./$latest_dir
    echo -e "[info] `date +'%F %T'`: $db database full backup is complete \n\n" >> ./$log_file
  done
#    mv ./$log_file ${sync_dir/$db}
}

# 增量备份
# 每天生成的数据量并不是很大,所以不需要限速
inc_backup(){
  cd $sync_dir
  for db in $dbs ;do
    echo "[info] `date +'%F %T'`: $db database incremental backup is running" >> ./$log_file
    . ./${db}_$info_file
    $pbz2_cmd -dc ${latest_dir}/${db}.bz2 |xbstream -x -C ${latest_dir}/ && \
    unlink ${latest_dir}/${db}.bz2
    xtrabackup -u$user -p$passwd --backup --databases "$db $sys_db" --incremental-basedir $latest_dir --target-dir ./${db}_increment_$ctime --stream xbstream 2>> ./$log_file |$pbz2_cmd > ./${db}.bz2 && \
    mv ./${db}.bz2 ./${db}_increment_$ctime && \
    rm -rf ./$latest_dir && \
    echo "latest_dir=${db}_increment_$ctime" > ./${db}_$info_file
    [ $? = 0 ] && . ./${db}_$info_file && tar -cf - $latest_dir |$pgz_cmd > ${latest_dir}.tgz
    mv ./${latest_dir}.tgz ./$db
    echo -e "[info] `date +'%F %T'`: $db database incremental backup is complete \n\n" >> ./$log_file
  done
}

case $cday in
  7)  total_backup ;;
  *)  inc_backup ;;
esac

posted @ 2023-04-27 16:15  suyanhj  阅读(54)  评论(0)    收藏  举报