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

浙公网安备 33010602011771号