当前位置: 首页 > news >正文

使用 BR 备份 TiDB 到 AWS S3 存储

目录

  • 前言
  • BR 工具
    • 如何备份数据?
      • 快照备份
      • 日志备份
    • 如何选择备份存储?
  • BR 安装配置
  • BR 备份部署
    • 日志备份脚本
    • 快照备份脚本
  • 问题总结
    • 网络限制
    • S3 权限
    • 日志备份重复运行
    • 快照备份中断
  • 写在最后

前言

手里有几套 TiDB 集群数据库没有备份,一直在裸奔,几个备份厂商(爱数,NBU,Veeam)也都不支持备份 TiDB,正好这两天有空研究了一下官方文档,发现官方自带的 BR 工具看着很强大,所以测试了一下。

TiDB 备份与恢复概述:https://docs.pingcap.com/zh/tidb/stable/backup-and-restore-overview/

本文记录一下使用 BR 将 TiDB 数据库备份到 AWS S3 存储的过程,仅供参考。

BR 工具

基于 Raft 协议和合理的部署拓扑规划,TiDB 实现了集群的高可用,当集群中少数节点挂掉时,集群依然能对外提供服务。在此基础上,为了更进一步保证用户数据的安全,TiDB 还提供了集群的备份与恢复 (Backup & Restore, BR) 功能,作为数据安全的最后一道防线,使得集群能够免于严重的自然灾害,提供业务误操作“复原”的能力。

如何备份数据?

TiDB 支持两种类型的备份,应该使用哪种备份? 全量备份包含集群某个时间点的全量数据,日志备份包含业务写入在 TiDB 产生的数据变更记录。推荐这两种备份方式一起使用:

  • 开启日志备份:运行 br log start 命令来启动日志备份任务,任务会在每个 TiKV 节点上持续运行,以小批量的形式定期将 TiDB 变更数据备份到指定存储中。
  • 定期执行快照(全量)备份:运行 br backup full 命令来备份集群快照到备份存储,例如在每天零点进行集群快照备份。

快照备份

快照备份是集群全量备份的一种实现。它基于 TiDB 的多版本并发控制 (MVCC) 实现,将指定快照包含的所有数据备份到目标存储中。备份下来的数据大小约等于集群(压缩后的)单副本数据大小。备份完成之后,你可以在一个空集群或不存在数据冲突(相同 schema 或 table)的集群执行快照备份恢复,将集群恢复到快照备份时的数据状态,同时恢复功能会依据集群副本设置恢复出多副本。

快照数据备份和恢复的架构如下:

集群快照数据备份的流程如下:

日志备份

日志备份和 PITR 的架构如下:

日志备份的流程如下:

如何选择备份存储?

Amazon S3、Google Cloud Storage (GCS)、Azure Blob Storage 是推荐的存储系统选择,使用这些系统,你无需担心备份容量、备份带宽规划等。

如果 TiDB 集群部署在自建机房中,则推荐以下方式:

  • 搭建 MinIO 作为备份存储系统,使用 S3 协议将数据备份到 MinIO 中。
  • 挂载 NFS(如 NAS)盘到 br 工具和所有的 TiKV 实例,使用 POSIX file system 接口将备份数据写入对应的 NFS 目录中。

以上都是一些基本概念,主要了解一下 BR 工具以及备份的流程和逻辑,更多内容可以参考我整理的 TiDB 备份文章:TiDB 备份与恢复整理

BR 安装配置

使用备份恢复功能的部署要求如下:

  • BR、TiKV 节点和备份存储系统需要提供大于备份速度的的网络带宽。当集群特别大的时候,备份和恢复速度上限受限于备份网络的带宽。
  • 备份存储系统还需要提供足够的写入/读取性能 (IOPS),否则它有可能成为备份恢复时的性能瓶颈。
  • TiKV 节点需要为备份准备至少额外的两个 CPU core 和高性能的磁盘,否则备份将对集群上运行的业务产生影响。
  • 推荐 br 工具运行在 8 核+/16 GB+ 的节点上。

官方文档中 BR 的安装比较简单,可以直接使用 TiUP 在线安装:tiup install br,但是这种情况下安装出来的 br 版本跟 tiup 版本是一致的。

也就是说,我的环境 tiup 版本是 v8.5.3,安装的 BR 版本就是 v8.5.3,但是我的 TiDB 集群版本是 v7.5.0,此时如果用这个版本的 BR 备份,则会报错:

Error: running BR in incompatible version of cluster, if you believe it's OK, use --check-requirements=false to skip.: TiKV node ******:20160 version 7.5.0 is too old because the PITR id map is written into the cluster system table mysql.tidb_pitr_id_map, please use the tikv with version v8.4.0+: [BR:Common:ErrVersionMismatch]version mismatch

这种情况下就需要手动安装与集群版本一致的 BR 版本,才能正常进行备份:

[root@tidb ~]# wget https://tiup-mirrors.pingcap.com/br-v7.5.0-linux-amd64.tar.gz
[root@tidb ~]# tar -xf br-v7.5.0-linux-amd64.tar.gz -C /usr/sbin/
[root@tidb ~]# br --version
Release Version: v7.5.0

至此,BR 工具部署完成,只需要在执行的这台上安装即可。

BR 备份部署

本文分享两个脚本,分别备份 TiDB 的集群快照以及日志,在网上以及 TiDB 社区找了很久没有找到相关的脚本,还是咨询原厂得到的。

本文使用的是 AWS S3 存储进行备份,阿里云 S3 也可以,或者自己本地搭建的 MinIO 也可以,大家根据实际情况自行选择即可。

日志备份脚本

日志备份是一个 task,所以只需要启动一次即可:

[root@tidb ~]# cat<<-EOF>/root/scripts/brbackuplog.sh
AccessKey="根据实际情况填写"
SecretKey="根据实际情况填写"
Bucket="根据实际情况填写"
Endpoint="根据实际情况填写"
PDIP="根据实际情况填写"
export AWS_ACCESS_KEY_ID=$AccessKey
export AWS_SECRET_ACCESS_KEY=$SecretKey
CURDATE=$(date +%Y%m%d%H%M%S)
br log start --task-name=pitr \
--pd "${PDIP}" \
--storage "s3://${Bucket}/backup-data/log-backup" \
--s3.endpoint="https://${Endpoint}" \
--s3.provider="aws" \
--log-file brbackuplog-$CURDATE.logecho s3://${Bucket}/backup-data/log-backup
EOF

启动日志备份任务:

[root@tidb ~]# chmod +x /root/scripts/brbackuplog.sh
[root@tidb ~]# sh /root/scripts/brbackuplog.sh
Detail BR log in brbackuplog-20251104104110.log 
[2025/11/04 10:41:56.346 +08:00] [INFO] [collector.go:77] ["log start"] [streamTaskInfo="{taskName=pitr,startTs=461956478452891654,endTS=999999999999999999,tableFilter=*.*}"] [pausing=false] [rangeCount=2]
[2025/11/04 10:41:57.909 +08:00] [INFO] [collector.go:77] ["log start success summary"] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0] [backup-checksum=143.034815ms] [total-take=47.704461672s]
s3://*******/backup-data/log-backup

启动后,可以检查任务状态:

[root@tidb ~]# br log status --task-name=pitr --pd="根据实际情况填写"
Detail BR log in /tmp/br.log.2025-11-04T10.42.21+0800 
● Total 1 Tasks.
> #1 <name: pitrstatus: ● NORMALstart: 2025-11-04 10:41:55.192 +0800end: 2090-11-18 22:07:45.624 +0800storage: s3://*******/backup-data/log-backupspeed(est.): 444.08 ops/s
checkpoint[global]: 2025-11-04 10:41:55.192 +0800; gap=28s

可以看到状态是 NORMAL,代表任务正常,日志备份在正常运行,查看 AWS S3 备份目录:

备份文件已经生成。

再分享几个运维日志备份任务的命令:

br log pause:暂停备份任务
br log resume:恢复备份任务
br log status:检查备份任务
br log stop:停止备份任务,并删除任务元信息
br log start:启动备份任务
br log truncate:从备份存储中清理日志备份数据

如果日志备份任务出现问题,可以使用以上命令进行管理。

快照备份脚本

快照备份就是全备了,可以写成一个计划任务,每隔一段时间进行备份一次:

[root@tidb ~]# cat<<-EOF>/root/scripts/brbackupfull.sh 
AccessKey="根据实际情况填写"
SecretKey="根据实际情况填写"
Bucket="根据实际情况填写"
Endpoint="根据实际情况填写"
PDIP="根据实际情况填写"
export AWS_ACCESS_KEY_ID=$AccessKey
export AWS_SECRET_ACCESS_KEY=$SecretKey
CURDATE=$(date +%Y%m%d%H%M%S)
br backup full --pd "${PDIP}" \
--storage "s3://${Bucket}/backup-data/snapshot-${CURDATE}" \
--s3.endpoint="https://${Endpoint}" \
--s3.provider="aws" \
--ratelimit 16 \
--log-file brbackupfull-$CURDATE.logecho s3://${Bucket}/backup-data/snapshot-${CURDATE}
EOF

运行快照备份:

启动日志备份任务:
```bash
[root@tidb ~]# chmod +x /root/scripts/brbackupfull.sh
[root@tidb ~]# sh /root/scripts/brbackupfull.sh
Detail BR log in brbackupfull-20251104130417.log 
[2025/11/04 13:04:17.305 +08:00] [WARN] [backup.go:312] ["setting `--ratelimit` and `--concurrency` at the same time, ignoring `--concurrency`: `--ratelimit` forces sequential (i.e. concurrency = 1) backup"] [ratelimit=16.78MB/s] [concurrency-specified=4]
Full Backup <-\......................................................................................................................................................................................> 0.76%

写入计划任务,每周执行一次:

crontab -e
00 00 * * 0 /home/oracle/scripts/brbackupfull.sh

到这,TiDB 备份就完成了。

问题总结

在 BR 备份部署过程中,还是遇到了一些问题的,这里大概记录一下。

网络限制

由于网络限制,不管是阿里云还是 AWS 的 Endpoint,都可以开放给 TiDB 执行备份的主机进行访问,否则无法备份:

Error: failed to get region of bucket ******: RequestError: send request failed
caused by: dial tcp 54.231.195.232:443: i/o timeout

S3 权限

备份集群的 TiKV 和 br 命令行工具需要的 s3://******/backup-data 权限:

  • s3:ListBucket
  • s3:GetObject
  • s3:DeleteObject
  • s3:PutObject
  • s3:AbortMultipartUpload

如果不授权,备份时候会报错:

Error: Forbidden: Forbiddenstatus code: 403, request id: ******, host id: ********

日志备份重复运行

日志备份任务开启后会一直运行,不需要再次启动一个,否则报错:

Error: It supports single stream log task currently: [BR:Stream:ErrStreamLogTaskExist]stream task already exists

快照备份中断

快照备份执行过程中中断,日志报错:

Error: error happen in store 1 at *********: Io(Custom { kind: Other, error: "failed to put object rusoto error timeout after 15mins for upload part in s3 storage" }): [BR:KV:ErrKVStorage]tikv storage occur I/O error

这个报错一般是链路上有瓶颈,可以限制备份速度,调整参数 --ratelimit

写在最后

快照备份推荐在业务低峰时执行集群快照数据备份,这样能最大程度地减少对业务的影响。BR 恢复数据时会尽可能多地占用恢复集群的资源,因此推荐恢复数据到新集群或离线集群。应避免恢复数据到正在提供服务的生产集群,否则,恢复期间会对业务产生不可避免的影响。

推荐使用支持 Amazon S3、GCS 或 Azure Blob Storage 协议的存储系统保存备份数据;应确保 BR、TiKV 节点和备份存储系统有足够的网络带宽,备份存储系统能提供足够的写入和读取性能,否则,它们有可能成为备份恢复时的性能瓶颈。

http://www.dtcms.com/a/600676.html

相关文章:

  • 【OpenCV + VS】OpenCV 绘图:绘制矩形、圆形、椭圆形、线条等
  • 易语言反编译工具 - 高效破解易语言程序的利器
  • 11年始终专注营销型网站提供网站建设小程序制作
  • AOSP Android13 Launcher3——TransformParams 类
  • 网站推广问题推广公司网站有哪些方式
  • 成都网站建设公司电话美食网站建设多少钱
  • 【把Linux“聊”明白】进程的概念与状态
  • GIT版本管理工具轻松入门 | TortoiseGit,本地 Git 仓库和 Git 概念,笔记02
  • 什么是美颜sdk?美型功能开发与用户体验优化实战
  • 在 React 项目中使用 Ky 与 TanStack Query 构建现代化数据请求层
  • 计算机网络---传输层安全 SSL与TLS
  • 【Linux篇】信号机制深度剖析:从信号捕捉到SIGCHLD信号处理
  • C语言编译软件选择及优化建议
  • Linux 之 【冯诺依曼体系结构与操作系统的简介】
  • 潍坊建设gc局网站windows优化软件
  • Java虚拟机(JVM)面试题(51道含答案)
  • [27] cuda 应用之 核函数实现图像通道变换
  • Aurora RDS MySQL The table ‘/rdsdbdata/tmp/#sql14b_df16d_1bd‘ is full
  • 手机响应式网站怎么做how to use wordpress
  • 网易云音乐回应“不适配鸿蒙”:推动相关部门加快步伐
  • C语言在线编译练习 | 提高编程技能与实战能力
  • 人工智能分支——深度学习、机器学习与神经网络初概览
  • C++ STL 关联式容器:map 与 set 深度解析与应用实践
  • 鄂尔多斯网站制作 建设推广网站建设前台功能
  • 策划书模板免费下载的网站免费获客平台
  • 如何搭建IoT机器视觉
  • 几分钟学会飞书多维表格开发
  • 11.12 脚本APP 手机如何开发简单APP
  • C++17常用新特性
  • oj题 ——— 链式二叉树oj题