背景
在数据库运维过程中,经常通过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 bakall/bakinc 全量/增量备份
- $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分钟生成了一个备份数据文件。
写在最后
好了,脚本的功能正常(只是做了理想状况下的测试,不排除还有潜在的问题),希望能对看到的小伙伴们有所启发。我在这里抛了个砖,有玉的小伙伴们尽管砸过来吧~~~