前言 前面测试了 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 mkdir -p /opt/minio/{data,conf,scripts}mkdir -p /data/minio/{data1,data2}ln -s /data/minio/data1 /opt/minio/data/data1ln -s /data/minio/data2 /opt/minio/data/data2mkdir -p /opt/minio/{data,conf,scripts}mkdir -p /data/minio/{data3,data4}ln -s /data/minio/data3 /opt/minio/data/data3ln -s /data/minio/data4 /opt/minio/data/data4
下载 minIO 安装包 minIO 安装包下载:
下载之后上传到两台主机的 /usr/bin 目录下并授权:
1 2 chmod +x /usr/bin/miniochmod +x /usr/bin/mc
创建启动脚本 在两台主机上创建 minIO 启动脚本:
1 2 3 4 5 6 7 8 9 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 目录下,并授权:
在 mc 客户端添加主机信息:
1 2 3 [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. > 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 [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 [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 <别名> mc ls <别名>/<bucket> mc ls --recursive <别名>/<bucket> mc mb <别名>/<bucket> mc mb minio01/mybucket mc rb <别名>/<bucket> mc rb --force <别名>/<bucket> mc cp <源> <目标> mc cp /path/file.txt minio01/bucket/ mc cp --recursive /path/dir/ minio01/bucket/ 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> 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 9. 实用示例 mc mirror --watch /data/backup/ minio01/backup-bucket/ mc rm --recursive --force --older-than 30d minio01/backup/ mc mirror minio01/backup-bucket/ /data/restore/ mc du <别名>/<bucket> mc cp --recursive /local/data/ minio01/mybucket/data/ 10. 获取帮助 mc --help mc <command > --help mc --version
这些是最常用的 MinIO Client 命令,基本覆盖日常运维操作需求。
写在最后 整体测试下来,MinIO 部署简单、界面友好、命令丰富,关键是内网备份速度还是挺香的!既省了云存储的银子,又摆脱了公网龟速的折磨,数据还在自己手里,安全感拉满。对于备份数据量大、追求高性能的场景,MinIO + BR 这套组合拳真的值得一试!!!