0
0
0
0
专栏/.../

TiDB热备份实战:NFS存储环境下的BR离线部署+操作详解

 迷途小书童  发表于  2025-07-29

1. 前言

BR(Backup & Restore) 是TiDB官方推荐的高效备份恢复工具,它能够在不中断数据库正常运行的情况下,对数据库进行物理备份。该工具支持全量、增量备份,为企业级数据库的灾难恢复提供了可靠保障。 结合NFS(Network File System) 共享存储,可以实现跨节点的备份文件集中管理,提高备份的可靠性和可维护性。

2. BR备份恢复说明

BR 将备份或恢复操作命令下发到各个 TiKV 节点。TiKV 收到命令后执⾏相应的备份或恢复操作。在⼀次备份或恢复中,各个 TiKV 节点都会有⼀个对应的备份路径,TiKV 备份时产⽣的备份⽂件将会保存在该路径下,恢复时也会从该路径读取相应的备份⽂件。

1.png

3. 部署说明

  • 部署位置:根据官⽅建议,将BR部署在PD节点上
  • ⽹络要求:万兆带宽
  • 备份盘:⾼性能SSD⽹盘(如:NFS)
  • 部署时需要指定PD服务地址、端⼝、备份路径
  • BR所在节点、所有TiKV节点均需要挂载共享盘

主机名

主机IP

操作系统

角色

TiBAK

192.168.131.3

Redhat 8.10

nfs-server

PD01

192.168.131.200

Redhat 8.10

nfs-client

TiKV01

192.168.131.203

Redhat 8.10

nfs-client

TiKV02

192.168.131.204

Redhat 8.10

nfs-client

TiKV03

192.168.131.205

Redhat 8.10

nfs-client

4. NFS安装部署

NFS服务器可以让PC将网络中的NFS服务器共享的目录挂载到本地端的文件系统中,而在本地端的系统中来看,那个远程主机的目录就好像是自己的一个磁盘分区一样,在使用上相当便利。

4.1. 本地 YUM仓库配置

#挂载光盘镜像
mount /dev/sr0 /mnt

#创建本地 YUM 源配置文件:
vi /etc/yum.repos.d/local.repo
[BaseOS]
name=Red Hat Enterprise Linux 8 - BaseOS
baseurl=file:///mnt/BaseOS
enabled=1
gpgcheck=0

[AppStream]
name=Red Hat Enterprise Linux 8 - AppStream
baseurl=file:///mnt/AppStream
enabled=1
gpgcheck=0

#清理 YUM 缓存:
yum clean all

#验证本地 YUM 配置是否有效:正常情况下,会显示 BaseOS 和 AppStream 仓库
yum repolist

4.2. 服务器端安装nfs和rpcbind软件

# 安装nfs-utils软件包
[root@TiBAK ~]# yum -y install nfs-utils

2.png

# 查看nfs软件包
[root@TiBAK ~]#  rpm -qa | grep nfs
libnfsidmap-2.3.3-59.el8.x86_64
nfs-utils-2.3.3-59.el8.x86_64
sssd-nfs-idmap-2.9.4-2.el8.x86_64

4.3. 配置共享目录

NFS 的配置文件为 /etc/exports ,文件内容默认为空(无任何共享)。在exports 文件中设置共享资源时,记录格式为“目录位置 客户机地址(权限选项)。

[root@TiBAK tibak]# vi /etc/exports
/tibak 192.168.131.0/24(rw,sync,no_root_squash,no_subtree_check)

[root@TiBAK tibak]# exportfs -arv
exporting 192.168.131.0/24:/tibak

4.4. 启动 NFS服务并验证结果

需要先启动rpc服务,因为nfs要向rpc注册端口。

# systemctl enable --now rpcbind
# systemctl enable --now nfs-server

查看rpc所有连接信息


[root@TiBAK tibak]# yum install net-tools
[root@TiBAK tibak]# netstat -lnupt | grep rpc

3.png

4.5. 安装nfs客户端(BR节点和3台TiKV节点安装)

# yum install -y nfs-utils rpcbind
# showmount -e 192.168.131.3
Export list for 192.168.131.3:
/tibak 192.168.131.0/24

4.6. 手动挂载 NFS 共享目录

NFS 协议的目标是提供一种网络文件系统,因此对 NFS 共享的访问也使用 mount 命令来进行挂载,对应的文件系统类型为 nfs 。可以手动挂载,也可以加入 fstab 配置文件来实现开机自动挂载。以 root 用户身份执行 mount 操作,将 NFS 服务器共享的 /tibak目录挂载到本地目录 /tibak。与挂载本地文件系统不同的是,设备位置处应指出服务器地址。

# mkdir -p /tibak
# mount -t nfs 192.168.131.3:/tibak /tibak

4.png

4.7. fstab自动挂载设置

修改 /etc/fstab 配置文件,加入 NFS 共享目录的挂载设置(文件系统类型为nfs)。挂载参数建议添加_netdev(设备需要网络)。这样客户机就可以在每次开机后自动挂载 NFS 共享资源了。

vi /etc/fstab
192.168.131.3:/tibak /tibak  nfs  defaults,_netdev   0 0

# systemctl daemon-reload
# mount -a

5.png

5. BR安装部署

5.1. BR⼯具下载

参考官方文档https://docs.pingcap.com/zh/tidb/stable/download-ecosystem-tools/

https://docs.pingcap.com/zh/tidb/stable/br-use-overview/#%E9%83%A8%E7%BD%B2%E5%92%8C%E4%BD%BF%E7%94%A8-br

5.2. 安装步骤

# 解压
cd /home/tidb/tidb-community-toolkit-v7.5.6-linux-amd64
tar -xf br-v7.5.6-linux-amd64.tar.gz -C /data/tidb-deploy/br/bin

# 添加环境变量
echo "export PATH=\$PATH:/data/tidb-deploy/br/bin" >> /home/tidb/.bash_profile

# ⽣效
source /home/tidb/.bash_profile

5.3. 配置NFS目录的属主

在 NFS 服务器 上创建tidb用户和组,并确保其 UID(用户ID) 和 GID(组ID) 与 TiKV 服务器 上的tidb 用户完全一致,以避免因权限不一致导致的 NFS 挂载问题(如文件读写权限错误)。

# groupadd -g 1000 tidb
# useradd -u 1000 -g 1000 -s /bin/bash -d /home/tidb -m tidb
# echo "Welcome1" | sudo passwd --stdin tidb
# chown -R tidb:tidb /tibak/

5.4. 全量备份脚本

  • 部署时需要指定PD服务地址、端⼝、备份路径
  • BR所在节点、所有TiKV节点均需要挂载共享盘

创建脚本目录

mkdir -p /data/tidb-deploy/br/scripts
cd /data/tidb-deploy/br/scripts
vi tidb_br_backup_full.sh

在脚本tidb_br_backup_full.sh中贴入以下内容

#!/bin/bash

# 设置常量
PD_IP="192.168.131.200"          # 设置PD服务地址
PD_PORT="2379"               # 设置PD服务端口
RATELIMIT="128"              # 设置备份限速
BACKUP_DIR="/tibak"    # 设置备份目录
RETENTION_DAYS=7             # 保留备份天数

# 创建备份目录
create_backup_dir() {
    local backup_dir=$1
    mkdir -p "$backup_dir"
}

# 计算N天前的日期时间戳
calculate_days_ago() {
    local retention_days=$1
    local days_ago=$(( ( $(date +%s) / 86400 - retention_days ) * 86400 ))
    echo $days_ago
}

# 执行全量备份
perform_full_backup() {
    local pd_ip=$1
    local pd_port=$2
    local backup_dir=$3
    local ratelimit=$4
    local log_file=$5

    echo "Starting full backup at $(date)" | tee -a "$log_file"
    br backup full \
        --pd "$pd_ip:$pd_port" \
        --storage "local://$backup_dir/tidb_br_backup_$TIMESTAMP" \
        --ratelimit "$ratelimit" \
        --log-file "$log_file"

    local backup_status=$?
    if [ $backup_status -eq 0 ]; then
        echo "Backup completed successfully at $(date)" | tee -a "$log_file"
        
        # 更新备份集记录
        echo "$backup_dir/tidb_br_backup_$TIMESTAMP" > "$backup_dir/.lastbackup"
    else
        echo "Backup failed. Check the log for details: $log_file" | tee -a "$log_file"
    fi
    return $backup_status
}

# 清理旧备份
cleanup_old_backups() {
    local backup_dir=$1
    local days_ago=$2
    find $backup_dir -type d -name "tidb_br_backup_[0-9]*" | while read -r dir; do
        dir_timestamp=${dir##*_}
        if [[ "$dir_timestamp" -lt "$days_ago" ]]; then
            echo "Deleting directory: $dir"
            # 注意:以下命令将永久删除目录及其内容,请谨慎操作!
            # rm -rf "$dir"
        fi
    done
}

# 主逻辑
main() {
    # 计算N天前的日期时间戳
    DAYS_AGO=$(calculate_days_ago $RETENTION_DAYS)
    date_n_days_ago=$(date -d "@$DAYS_AGO" +%Y%m%d%H%M%S)

    # 获取当前日期时间作为备份标识
    TIMESTAMP=$(date +%Y%m%d%H%M%S)

    # 创建备份目录
    create_backup_dir "${BACKUP_DIR}/tidb_br_backup_$TIMESTAMP"

    # 定义备份日志文件
    BACKUP_LOG="${BACKUP_DIR}/tidb_br_backup_$TIMESTAMP/backup_${TIMESTAMP}.log"

    # 执行全量备份
    perform_full_backup "$PD_IP" "$PD_PORT" "$BACKUP_DIR" "$RATELIMIT" "$BACKUP_LOG"

    # 清理旧备份
    cleanup_old_backups "$BACKUP_DIR" "$date_n_days_ago"
}

# 执行主函数
main

执行BR备份脚本备份TiDB数据库

6.png6.png

5.5. 配置定时任务定时执行备份脚本

# 00 23 * * * sh /data/tidb-deploy/br/scripts/tidb_br_backup_full.sh

6. BR全量恢复

6.1. 恢复所需的⼯作有以下⼏个:

a. 创建需要恢复的 database 和 table

b. 根据 table 和 SST ⽂件元信息,进⾏ Split & Scatter Region

c. 将备份下来的 SST ⽂件按需读取到 TiKV 各节点

d. 根据新 table 的 ID 对 SST 进⾏ Key Rewrite

e. 将处理好的 SST ⽂件 Ingest 到 TiKV

综合以上原理,在执⾏恢复时,如果恢复实例存在相同的table,那恢复命令会执⾏失败。在紧急情况下,可准备临时主机部署临时单机实例,再挂载备份盘执⾏恢复命令进⾏数据恢复。

6.2. 恢复环境准备

  • 准备恢复数据机器(恢复数量不多情况下,单机即可)
  • 主机性能要求8C,16G以上
  • 为恢复测试准备最⼩环境

6.3. 全量数据恢复

br restore full 命令恢复全量数据

br restore full \
--pd "${PDIP}:2379" \
--storage "local:///tmp/backup" \
--CONCURRENCY=8 \
--log-file restorefull.log

br restore db 命令恢复单个库的数据

br restore db \
--pd "${PDIP}:2379" \
--db "test" \
--CONCURRENCY=8 \
--storage "local:///tmp/backup" \
--log-file restoredb.log

br restore table 命令恢复单张表的数据

br restore table \
--pd "${PDIP}:2379" \
--db "test" \
--CONCURRENCY=8 \
--table "usertable" \
--storage "local:///tmp/backup" \
--log-file restoretable.log

过滤恢复表库数据 ,执⾏ br restore full 命令,并⽤ --filter 或 -f 指定使⽤表库过滤

br restore full \
--pd "${PDIP}:2379" \
--filter 'db*.tbl*' \
--CONCURRENCY=8 \
--storage "local:///tmp/backup" \
--log-file restorefull.log

0
0
0
0

版权声明:本文为 TiDB 社区用户原创文章,遵循 CC BY-NC-SA 4.0 版权协议,转载请附上原文出处链接和本声明。

评论
暂无评论