BR脚本备份数据至远程主机

背景

在数据库运维过程中,经常通过BR工具进行全量/增量备份操作。通过编写备份脚本,结合cron可以实现自动定时备份。这个脚本在 @边城元元 编写的脚本基础上做了部分修改(参见Br备份还原shell脚本(分享)),在此基础上,增加了备份操作完成后生成压缩文件上传至远程主机。

准备工作

在目标远程主机上配置免密登录

在备份主机上用root或者其他账号登录,执行命令 ssh-keygen -t rsa 生成公私钥。需要输入的地方直接回车,存储公私钥文件的默认目录为~/.ssh/,文件名默认是id_rsa和id_rsa.pub。

root@ecs-85781105:~# ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/root/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /root/.ssh/id_rsa
Your public key has been saved in /root/.ssh/id_rsa.pub
The key fingerprint is:
SHA256:xYyNDVY/Dxr/4ZxI1gHKdygRg1eSw2dEel/uYKbwTsI root@ecs-85781105
The key's randomart image is:
+---[RSA 3072]----+
|        o+**=    |
|       ..X=Boo   |
|        o.%+B o .|
|         . B B + |
|        S o + O .|
|         . = O = |
|          E = = .|
|           +     |
|            .    |
+----[SHA256]-----+

将生成的公钥文件(~/.ssh/id_rsa.pub)的内容复制到远程主机的~/.ssh/authorized_keys文件中(如果没有则创建一个)

在备份数据库主机上创建备份脚本

在备份数据库服务器上建立brscript目录,然后创建br-backup.sh文件,脚本如下:

#! /bin/sh
#!/bin/bash#!/bin/bash
# br-backup.sh
# 
# # 1)手动增加bakall 是全备
# br-backup.sh bakall
# # 2)周日 是全备
# br-backup.sh 
# # 3)非周日 是增备
# tr-backup.sh 
#
# 使用cron定时 每天 01:00:00 执行一次
#  0 1 * * * br-backup.sh  bakinc  root@host_ip:backup_dir
#
# const 【不要修改】
DateFull=`date -d today +"%Y-%m-%d %H:%M:%S"`
DateMin=`date -d today +"%Y-%m-%d"`
DateIncr=`date -d today +"%Y-%m-%d-%H%M"`
DateLog=`date -d today +"%Y-%m"`
CurWeek=`date +%u`
BakFullFlag=0

BakRoot=/tidb-bak/brdata
BakRootData=${BakRoot}/brbak/brbak${DateMin}
BakRootDataIncr=${BakRoot}/brbakincr/brbakincr${DateIncr}
BakRootLog=${BakRoot}/brbaklog/log-${DateLog}.log
# 强制全备 标记 bakall
CustormArg1=$1
LAST_BACKUP_TS=0

# 检测参数 $1 bakall/bakinc $2远程主机备份目录

if [ $# -ne 2 ];then
  #判断用户的输入,如果参数个数不为3则打印脚本用法
  echo "Usage:$0  bakall/bakinc remote_host_dir"
  echo "eg: ./br_backup bakall root@192.168.0.10:/tidb-bak"
  exit
fi

# config 【可以修改】
# 备份数据库名称
DBName=weberp
# br工具目录,根据实际安装位置配置
BrBin=/root/tidb-toolkit-v6.0.0-linux-amd64/bin
Pd=127.0.0.1:2379
Concurrency=16
Ratelimit=256


# 逻辑判断
if [ "$1" = "bakall" ];then
    # 临时全备防止目录冲突
    BakRootData=${BakRootData}-`date -d today +"%H%M%S"`
    BakFullFlag=1
fi


if [ ${CurWeek} -eq 7 ];then
    BakFullFlag=1
fi


if [ ${BakFullFlag} -ne 1 ];then 
	#找到上一次的路径
	LAST_BACKUP_DIR=${BakRoot}/brbak/brbak$(date -d "-${CurWeek} days" +%Y-%m-%d)
	
	if [ ! -d "${LAST_BACKUP_DIR}" ];then
		echo "上次全备(上周日的全备目录 ${LAST_BACKUP_DIR} )不存在!"
		mkdir -p ${LAST_BACKUP_DIR}/
		#exit 0
	else
		
	  LAST_BACKUP_TS=`${BrBin}/br validate decode --field="end-version" -s local://${LAST_BACKUP_DIR} | tail -n1`
	  if [ ${LAST_BACKUP_TS} -lt 100 ];then 
		echo "上次全备(上周日的全备目录 ${LAST_BACKUP_DIR} )获取 LAST_BACKUP_TS 失败!"
		exit 0
	  fi
	fi 
	
	# 执行增量备份
	mkdir -p ${BakRootDataIncr}/
	chmod 777 ${BakRootDataIncr}/

	echo "增量备份到:${BakRootDataIncr}/"
	
	${BrBin}/br backup db \
        --db ${DBName} \
        -s local://${BakRootDataIncr}/ \
        --pd ${Pd} \
        --log-file ${BakRootLog} \
	      --lastbackupts ${LAST_BACKUP_TS} \
	      --concurrency ${Concurrency}
	      #--ratelimit ${Ratelimit} \
        #--concurrency ${Concurrency}
	
	#备份完成后在备份目录下生成压缩文件,压缩文件名:数据库名_备份目录名
        tar zcvf ${BakRootDataIncr}/${DBName}_brbak${DateIncr}.tar.gz ${BakRootDataIncr}/
        echo "增量备份数据生成压缩文件:${BakRootDataIncr}/${DBName}_brbak${DateIncr}.tar.gz"
        
	scp ${BakRootDataIncr}/${DBName}_brbak${DateIncr}.tar.gz $2
	echo "增量备份文件已上传至:$2目录下。   备份操作完成"

else

	# 执行全量备份
	mkdir -p ${BakRootData}/
	chmod 777 ${BakRootData}/
	
	echo "全量备份到:${BakRootData}/"
	
	${BrBin}/br backup db \
        --db ${DBName} \
        -s local://${BakRootData}/ \
        --pd ${Pd} \
        --log-file ${BakRootLog} \
	--ratelimit ${Ratelimit} \
        --concurrency ${Concurrency}
	
	#备份完成后在备份目录下生成压缩文件,压缩文件名:数据库名_备份目录名
	tar zcvf ${BakRootData}/${DBName}_brbak${DateMin}.tar.gz ${BakRootData}/
	echo "全量备份数据生成压缩文件:${BakRootData}/${DBName}_brbak${DateMin}.tar.gz"

	scp ${BakRootData}/${DBName}_brbak${DateMin}.tar.gz $2
	echo "全量备份文件已上传至:$2目录下,备份操作完成。"

fi

echo '---  end --- '

好了,准备工作完成,让我们测试一下脚本是否正常工作~

脚本测试

在终端窗口中进入脚本目录brscript,输入./br_backup.sh bakall root@192.168.0.100:/tidb-bak 后回车
参数说明:

  1. $1 bakall/bakinc 全量/增量备份
  2. $2 远程主机备份目录

终端窗口输出如下:

全量备份到:/tidb-bak/brdata/brbak/brbak2022-05-16-201259/
Detail BR log in /tidb-bak/brdata/brbaklog/log-2022-05.log
[2022/05/16 20:12:59.972 +08:00] [WARN] [backup.go:210] ["setting `--ratelimit` and `--concurrency` at the same time, ignoring `--concurrency`: `--ratelimit` forces sequential (i.e. concurrency = 1) backup"] [ratelimit=268.4MB/s] [concurrency-specified=16]
Database Backup <------------------------------------------------------------------------------------------------------------------------------------> 100.00%
Checksum <-------------------------------------------------------------------------------------------------------------------------------------------> 100.00%
[2022/05/16 20:13:01.091 +08:00] [INFO] [collector.go:67] ["Database Backup success summary"] [total-ranges=71] [ranges-succeed=71] [ranges-failed=0] [backup-checksum=21.324643ms] [backup-fast-checksum=6.280923ms] [backup-total-ranges=65] [backup-total-regions=65] [total-take=1.119923985s] [total-kv-size=6.516MB] [average-speed=5.819MB/s] [backup-data-size(after-compressed)=986.7kB] [Size=986712] [BackupTS=433246222417133570] [total-kv=22648]
tar: Removing leading `/' from member names
/tidb-bak/brdata/brbak/brbak2022-05-16-201259/
/tidb-bak/brdata/brbak/brbak2022-05-16-201259/5_2209_233_1f7fe701010dc16911fc835eac54de8d48e8bd928df1008c903fc5d78a6118e2_1652703180474_write.sst
/tidb-bak/brdata/brbak/brbak2022-05-16-201259/5_2209_233_c9036e5cdf0559d0514f1fdc0edbee729ea06361ba339ef77073d2f2b2965a62_1652703180158_write.sst
......
/tidb-bak/brdata/brbak/brbak2022-05-16-201259/5_2209_233_9198af8c6c286b502c94a3d4f0b6ac443cb6c343c39043b53a3ed54815b9a5fc_1652703180767_default.sst
/tidb-bak/brdata/brbak/brbak2022-05-16-201259/5_2209_233_edcb5e9c41d5aafa0adf501f09bfb20c2b28100e9216155ed09aa07aaf345f46_1652703180972_write.sst
tar: /tidb-bak/brdata/brbak/brbak2022-05-16-201259: file changed as we read it
全量备份数据生成压缩文件:/tidb-bak/brdata/brbak/brbak2022-05-16-201259/weberp_brbak2022-05-16.tar.gz
weberp_brbak2022-05-16.tar.gz             100%  910KB 194.9KB/s   00:04
全量备份文件已上传至:root@192.168.0.100:/tidb-bak目录下,备份操作完成。
---  end ---

登录远程主机查看备份文件是否存在

OK,备份脚本实现了我们的需求。接下来再试一下通过cron实现定时自动备份。

Cron定时任务配置

在终端窗口命令行输入 EDITOR=nano crontab -e 后回车
在编辑窗口中输入 */5 * * * * /root/brscript/br-backup.sh bakinc root@192.168.0.100:/tidb-bak &


然后按ctrl+o后再回车,最后按ctrl+x退出编辑器。为了方便查看测试结果,Cron定时任务设置的是5分钟执行一次,我们过一段时间后去远程主机上查看一下定时自动备份是否正常。
登录远程主机后,进入备份目录下,我们可以看到每5分钟生成了一个备份数据文件。

写在最后

好了,脚本的功能正常(只是做了理想状况下的测试,不排除还有潜在的问题),希望能对看到的小伙伴们有所启发。我在这里抛了个砖,有玉的小伙伴们尽管砸过来吧~~~

4 个赞

看着熟悉,呵呵

2 个赞

借鉴了你的原创,:handshake:

2 个赞

相互学习!:handshake:

2 个赞

我刚入门,要向你多学习,今后碰到问题还请多多指教!这次6.0的Book Rush,看到你发了好几篇文章了,:+1:

2 个赞

学习了,谢谢分享!

互相学习:handshake:,一起 day day up~~~

写的挺好的

2 个赞

谢谢,再接再厉~

对于T级别的数据,备份起来就又点困难了。

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。