前言

前面测试了 BR 备份 TiDB 到 AWS S3 和阿里云 OSS 存储,但是因为是走公网,所以备份速度感人,太慢了!最终还是放弃了,打算在本地搭建一套 minIO 存储来存储 TiDB 备份文件。

本文记录一下 minIO 存储搭建过程以及 BR 备份脚本。

搭建 minIO 存储

环境信息

操作系统环境信息如下:

主机名 系统版本 cpu 内存 磁盘 IP
minio01 Centos7.9 8 8G 5T 192.168.6.120
minio02 Centos7.9 8 8G 5T 192.168.6.121

本文使用 2 台主机搭建一套 minIO 集群,每台服务器上挂载一个 /data 磁盘。

创建目录

在两台主机上创建目录:

1
2
3
4
5
6
7
8
9
10
11
12
## root 用户下执行
## 节点1
mkdir -p /opt/minio/{data,conf,scripts}
mkdir -p /data/minio/{data1,data2}
ln -s /data/minio/data1 /opt/minio/data/data1
ln -s /data/minio/data2 /opt/minio/data/data2

## 节点2
mkdir -p /opt/minio/{data,conf,scripts}
mkdir -p /data/minio/{data3,data4}
ln -s /data/minio/data3 /opt/minio/data/data3
ln -s /data/minio/data4 /opt/minio/data/data4

下载 minIO 安装包

minIO 安装包下载:

下载之后上传到两台主机的 /usr/bin 目录下并授权:

1
2
chmod +x /usr/bin/minio
chmod +x /usr/bin/mc

创建启动脚本

在两台主机上创建 minIO 启动脚本:

1
2
3
4
5
6
7
8
9
## MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 密码根据实际情况进行修改,后面对应 S3 的 AK 和 SK
cat<<-EOF>/opt/minio/scripts/run_minio.sh
#!/bin/bash
export MINIO_ROOT_USER=myminioid
export MINIO_ROOT_PASSWORD=myminioPassWord
/usr/bin/minio server --config-dir /opt/minio/conf \
http://192.168.6.120/data/minio/data1 http://192.168.6.120/data/minio/data2 \
http://192.168.6.121/data/minio/data3 http://192.168.6.121/data/minio/data4
EOF

授予可执行权限:

1
chmod +x /opt/minio/scripts/run_minio.sh

创建 minIO 服务

在两台主机上创建 minIO 服务:

1
2
3
4
5
6
7
8
9
10
11
12
cat<<-EOF>/usr/lib/systemd/system/minio.service
[Unit]
Description=Minio service
Documentation=https://docs.minio.io/
[Service]
WorkingDirectory=/opt/minio/
ExecStart=/opt/minio/scripts/run_minio.sh
Restart=on-failure
RestartSec=5
[Install]
WantedBy=multi-user.target
EOF

启动 minIO

在两台主机上启动 minIO 服务:

1
systemctl daemon-reload && systemctl start minio

检查 minio 服务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
[root@minio01 ~]# systemctl status minio
● minio.service - Minio service
Loaded: loaded (/usr/lib/systemd/system/minio.service; disabled; vendor preset: disabled)
Active: active (running) since Mon 2025-11-10 12:02:53 CST; 28min ago
Docs: https://docs.minio.io/
Main PID: 21210 (run_minio.sh)
Tasks: 35
CGroup: /system.slice/minio.service
├─21210 /bin/bash /opt/minio/scripts/run_minio.sh
└─21211 /opt/minio/bin/minio server --config-dir /opt/minio/conf http://192.168.6.120/data/minio/data1 http://192.168.6.120/data/minio/data2 http://192.168.6.121/data/minio/data3 http://192.168.6.121/d...

Nov 10 12:02:57 minio01 run_minio.sh[21210]: MinIO Object Storage Server
Nov 10 12:02:57 minio01 run_minio.sh[21210]: Copyright: 2015-2025 MinIO, Inc.
Nov 10 12:02:57 minio01 run_minio.sh[21210]: License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
Nov 10 12:02:57 minio01 run_minio.sh[21210]: Version: RELEASE.2025-09-07T16-13-09Z (go1.24.6 linux/amd64)
Nov 10 12:02:57 minio01 run_minio.sh[21210]: API: http://192.168.6.120:9000 http://192.168.122.1:9000 http://127.0.0.1:9000
Nov 10 12:02:57 minio01 run_minio.sh[21210]: WebUI: http://192.168.6.120:35915 http://192.168.122.1:35915 http://127.0.0.1:35915
Nov 10 12:02:57 minio01 run_minio.sh[21210]: Docs: https://docs.min.io
Nov 10 12:02:57 minio01 run_minio.sh[21210]: ---------------------------
Nov 10 12:02:57 minio01 run_minio.sh[21210]: WARN: Detected Linux kernel version older than 4.0 release, there are some known potential performance problems with this kernel version. MinIO recommend...st performance
Nov 10 12:02:57 minio01 run_minio.sh[21210]: INFO: IAM load(startup) finished. (duration: 1.20068ms)
Hint: Some lines were ellipsized, use -l to show in full.

访问 minIO 网页

在浏览器中输入 minIO 网页:http://192.168.6.120:9000

输入上面定义的用户和密码,登陆成功:

第一次登陆这里是没有 bucket 的,这是我创建之后的。

客户端访问

将客户端软件 mc 上传到需要备份的 TiDB 其中一个主机的 /usr/bin 目录下,并授权:

1
chmod +x /usr/bin/mc

在 mc 客户端添加主机信息:

1
2
3
## myminio 是别名(随意取),账户密码对应上面定义的,也就是备份时需要的 AK,SK
[root@tidb ~]# mc alias set myminio http://192.168.6.120:9000 myminioid myminioPassWord
Added `myminio` successfully.

这里有一个坑,网上的大多数教程都是用的 mc config host add 命令去添加,这个命令可能是被抛弃了,执行会报错:

1
mc: <ERROR> `config` is not a recognized command. Get help using `--help` flag.

在 minIO 中创建名为 tidbbackup 的 buket:

1
2
[root@tidb ~]# mc mb myminio/tidbbackup/backup-data/log-backup
Bucket created successfully `myminio/tidbbackup/backup-data/log-backup`.

当然也可以在网页端图形化创建,至此,minIO 存储配置完成,接下来就可以开始备份 TiDB 数据库了。

TiDB 备份部署

本文还是使用 BR 进行备份,minIO 使用 s3 协议,进行日志备份和快照备份。

日志备份

启动日志备份任务:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
AccessKey="根据实际情况填写"
SecretKey="根据实际情况填写"
Bucket="tidbbackup"
Endpoint="192.168.6.120:9000"
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="http://${Endpoint}" \
--log-file brbackuplog-$CURDATE.log

Detail BR log in brbackuplog-20251110114424.log
[2025/11/10 11:44:25.737 +08:00] [INFO] [collector.go:77] ["log start"] [streamTaskInfo="{taskName=pitr,startTs=462093356994658319,endTS=999999999999999999,tableFilter=*.*}"] [pausing=false] [rangeCount=2]
[2025/11/10 11:44:25.738 +08:00] [INFO] [collector.go:77] ["log start success summary"] [total-ranges=0] [ranges-succeed=0] [ranges-failed=0] [backup-checksum=193.619051ms] [total-take=370.215407ms]

检查日志备份任务状态:

1
2
3
4
5
6
7
8
9
10
11
[root@YCPTLMESTIDB01 ~]# br log status --pd="根据实际情况填写"
Detail BR log in /tmp/br.log.2025-11-10T12.47.31+0800
● Total 1 Tasks.
> #1 <
name: pitr
status: ● NORMAL
start: 2025-11-10 12:05:48.091 +0800
end: 2090-11-18 22:07:45.624 +0800
storage: s3://tidbbackup/backup-data/log-backup
speed(est.): 553.02 ops/s
checkpoint[global]: 2025-11-10 12:46:56.191 +0800; gap=37s

日志备份任务创建完成。

快照备份

快照备份需要使用 linux crontab 计划任务部署:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## 创建脚本文件
[root@tidb ~]# cat<<-EOF>/root/scripts/brbackupfull.sh
AccessKey="根据实际情况填写"
SecretKey="根据实际情况填写"
Bucket="tidbbackup"
Endpoint="192.168.6.120:9000"
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="http://${Endpoint}" \
--ratelimit 64 \
--log-file /root/scripts/brbackupfull-$CURDATE.log

echo s3://${Bucket}/backup-data/snapshot-${CURDATE}
EOF

授权:

1
[root@tidb ~]# chmod +x /root/scripts/brbackupfull.sh

部署计划任务:

1
2
3
4
## 每 2 天执行一次快照备份
[root@tidb ~]# crontab -e
## 写入以下任务
0 0 */2 * * /root/scripts/brbackupfull.sh

手动执行一次验证:

1
2
3
4
5
[root@tidb scripts]# sh brbackupfullminio.sh &
[1] 876
Detail BR log in brbackupfull-20251110120639.log
[2025/11/10 12:06:39.556 +08:00] [WARN] [backup.go:315] ["setting `--ratelimit` and `--concurrency` at the same time, ignoring `--concurrency`: `--ratelimit` forces sequential (i.e. concurrency = 1) backup"] [ratelimit=67.11MB/s] [concurrency-specified=4]
Full Backup <--------------------------------------------------------------------------/.......................................................................................................................> 2.16%

等待备份结束即可,备份的文件存放到 minIO 集群的 bucket 目录下:

查看磁盘空间:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[root@minio01 ~]# df -h
Filesystem Size Used Avail Use% Mounted on
devtmpfs 3.9G 0 3.9G 0% /dev
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 3.9G 9.7M 3.9G 1% /run
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/mapper/centos-root 44G 4.0G 41G 9% /
/dev/sda1 1014M 172M 843M 17% /boot
tmpfs 799M 48K 799M 1% /run/user/0
/dev/mapper/data-data_lv 5.0T 243G 4.5T 6% /data

## 快照备份已经备份了 124G
[root@minio01 backup-data]# du -sh snapshot-20251110120639/
124G snapshot-20251110120639/

总体来看,本地备份还是快的太多了。

minIO mc 常用命令

下面总结了一些 minIO mc 的一些常用命令:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
1. 别名管理(Alias Management)

# 添加/设置别名
mc alias set <别名> <URL> <访问密钥> <密钥>
mc alias set myminio http://192.168.6.120:9000 myminioid myminioPassWord

# 列出所有别名
mc alias list
mc alias ls

# 删除别名
mc alias remove <别名>
mc alias rm <别名>

2. 基本文件操作

# 列出存储桶/对象
mc ls <别名> # 列出所有bucket
mc ls <别名>/<bucket> # 列出bucket中的对象
mc ls --recursive <别名>/<bucket> # 递归列出所有对象

# 创建存储桶
mc mb <别名>/<bucket>
mc mb minio01/mybucket

# 删除存储桶
mc rb <别名>/<bucket> # 删除空bucket
mc rb --force <别名>/<bucket> # 强制删除非空bucket

# 复制文件/目录
mc cp <源> <目标>
mc cp /path/file.txt minio01/bucket/
mc cp --recursive /path/dir/ minio01/bucket/

# 镜像同步(类似rsync)
mc mirror <源> <目标>
mc mirror /local/path minio01/bucket/
mc mirror --watch /local/path minio01/bucket/ # 持续监控同步

# 删除文件/对象
mc rm <别名>/<bucket>/<object>
mc rm --recursive --force <别名>/<bucket>/path/

# 移动文件
mc mv <源> <目标>

3. 查看和下载

# 查看文件内容
mc cat <别名>/<bucket>/<object>

# 查看文件头部
mc head <别名>/<bucket>/<object>

# 查看文件尾部
mc tail <别名>/<bucket>/<object>

# 下载文件
mc cp <别名>/<bucket>/<object> /local/path/

4. 权限和策略管理

# 设置匿名访问策略
mc anonymous set <download|upload|public> <别名>/<bucket>
mc anonymous set download minio01/mybucket

# 查看访问策略
mc anonymous get <别名>/<bucket>

# 查看对象/bucket信息
mc stat <别名>/<bucket>/<object>

5. 版本控制和生命周期

# 启用版本控制
mc version enable <别名>/<bucket>

# 查看版本控制状态
mc version info <别名>/<bucket>

# 设置生命周期规则
mc ilm add --expiry-days 30 <别名>/<bucket>

# 查看生命周期规则
mc ilm ls <别名>/<bucket>

6. 查找和差异对比

# 查找文件
mc find <别名>/<bucket> --name "*.txt"

# 比较差异
mc diff <源> <目标>

7. 服务器管理

# 查看服务器信息
mc admin info <别名>

# 查看服务状态
mc admin service status <别名>

# 重启服务
mc admin service restart <别名>

8. 常用选项参数

--recursive, -r # 递归操作
--force # 强制执行
--watch # 监控变化
--older-than # 只处理早于指定时间的文件
--newer-than # 只处理晚于指定时间的文件
--json # JSON格式输出

9. 实用示例

# 备份本地目录到MinIO
mc mirror --watch /data/backup/ minio01/backup-bucket/

# 定期删除30天前的备份
mc rm --recursive --force --older-than 30d minio01/backup/

# 从MinIO恢复数据
mc mirror minio01/backup-bucket/ /data/restore/

# 查看bucket大小
mc du <别名>/<bucket>

# 批量上传
mc cp --recursive /local/data/ minio01/mybucket/data/

10. 获取帮助

mc --help # 查看所有命令
mc <command> --help # 查看特定命令帮助
mc --version # 查看版本

这些是最常用的 MinIO Client 命令,基本覆盖日常运维操作需求。

写在最后

整体测试下来,MinIO 部署简单、界面友好、命令丰富,关键是内网备份速度还是挺香的!既省了云存储的银子,又摆脱了公网龟速的折磨,数据还在自己手里,安全感拉满。对于备份数据量大、追求高性能的场景,MinIO + BR 这套组合拳真的值得一试!!!