1. 前言
BR(Backup & Restore) 是TiDB官方推荐的高效备份恢复工具,它能够在不中断数据库正常运行的情况下,对数据库进行物理备份。该工具支持全量、增量备份,为企业级数据库的灾难恢复提供了可靠保障。 结合NFS(Network File System) 共享存储,可以实现跨节点的备份文件集中管理,提高备份的可靠性和可维护性。
2. BR备份恢复说明
BR 将备份或恢复操作命令下发到各个 TiKV 节点。TiKV 收到命令后执⾏相应的备份或恢复操作。在⼀次备份或恢复中,各个 TiKV 节点都会有⼀个对应的备份路径,TiKV 备份时产⽣的备份⽂件将会保存在该路径下,恢复时也会从该路径读取相应的备份⽂件。
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
# 查看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
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.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. BR安装部署
5.1. BR⼯具下载
参考官方文档https://docs.pingcap.com/zh/tidb/stable/download-ecosystem-tools/
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数据库
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