下载 minIO 安装包
minIO 安装包下载:
下载之后上传到两台主机的 /usr/bin 目录下并授权:
1 chmod +x /usr/bin/minio
2 chmod +x /usr/bin/mc
创建启动脚本
在两台主机上创建 minIO 启动脚本:
1 ## MINIO_ROOT_USER 和 MINIO_ROOT_PASSWORD 密码根据实际情况进行修改,后面对应 S3 的 AK 和 SK
2 cat<<-EOF>/opt/minio/scripts/run_minio.sh
3 #!/bin/bash
4 export MINIO_ROOT_USER=myminioid
5 export MINIO_ROOT_PASSWORD=myminioPassWord
6 /usr/bin/minio server --config-dir /opt/minio/conf \
7 http://192.168.6.120/data/minio/data1 http://192.168.6.120/data/minio/data2 \
8 http://192.168.6.121/data/minio/data3 http://192.168.6.121/data/minio/data4
9 EOF
授予可执行权限:
1 chmod +x /opt/minio/scripts/run_minio.sh
创建 minIO 服务
在两台主机上创建 minIO 服务:
1 cat<<-EOF>/usr/lib/systemd/system/minio.service
2 [Unit]
3 Description=Minio service
4 Documentation=https://docs.minio.io/
5 [Service]
6 WorkingDirectory=/opt/minio/
7 ExecStart=/opt/minio/scripts/run_minio.sh
8 Restart=on-failure
9 RestartSec=5
10 [Install]
11 WantedBy=multi-user.target
12 EOF
启动 minIO
在两台主机上启动 minIO 服务:
1 systemctl daemon-reload && systemctl start minio
检查 minio 服务:
1 [root@minio01 ~]# systemctl status minio
2 ● minio.service - Minio service
3 Loaded: loaded (/usr/lib/systemd/system/minio.service; disabled; vendor preset: disabled)
4 Active: active (running) since Mon 2025-11-10 12:02:53 CST; 28min ago
5 Docs: https://docs.minio.io/
6 Main PID: 21210 (run_minio.sh)
7 Tasks: 35
8 CGroup: /system.slice/minio.service
9 ├─21210 /bin/bash /opt/minio/scripts/run_minio.sh
10 └─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...
11
12 Nov 10 12:02:57 minio01 run_minio.sh[21210]: MinIO Object Storage Server
13 Nov 10 12:02:57 minio01 run_minio.sh[21210]: Copyright: 2015-2025 MinIO, Inc.
14 Nov 10 12:02:57 minio01 run_minio.sh[21210]: License: GNU AGPLv3 - https://www.gnu.org/licenses/agpl-3.0.html
15 Nov 10 12:02:57 minio01 run_minio.sh[21210]: Version: RELEASE.2025-09-07T16-13-09Z (go1.24.6 linux/amd64)
16 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
17 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
18 Nov 10 12:02:57 minio01 run_minio.sh[21210]: Docs: https://docs.min.io
19 Nov 10 12:02:57 minio01 run_minio.sh[21210]: ---------------------------
20 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
21 Nov 10 12:02:57 minio01 run_minio.sh[21210]: INFO: IAM load(startup) finished. (duration: 1.20068ms)
22 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 ## myminio 是别名(随意取),账户密码对应上面定义的,也就是备份时需要的 AK,SK
2 [root@tidb ~]# mc alias set myminio http://192.168.6.120:9000 myminioid myminioPassWord
3 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 [root@tidb ~]# mc mb myminio/tidbbackup/backup-data/log-backup
2 Bucket created successfully `myminio/tidbbackup/backup-data/log-backup`.
当然也可以在网页端图形化创建,至此,minIO 存储配置完成,接下来就可以开始备份 TiDB 数据库了。
TiDB 备份部署
本文还是使用 BR 进行备份,minIO 使用 s3 协议,进行日志备份和快照备份。
日志备份
启动日志备份任务:
1 AccessKey="根据实际情况填写"
2 SecretKey="根据实际情况填写"
3 Bucket="tidbbackup"
4 Endpoint="192.168.6.120:9000"
5 PDIP="根据实际情况填写"
6 export AWS_ACCESS_KEY_ID=$AccessKey
7 export AWS_SECRET_ACCESS_KEY=$SecretKey
8 CURDATE=$(date +%Y%m%d%H%M%S)
9 br log start --task-name=pitr \
10 --pd "${PDIP}" \
11 --storage "s3://${Bucket}/backup-data/log-backup" \
12 --s3.endpoint="http://${Endpoint}" \
13 --log-file brbackuplog-$CURDATE.log
14
15 Detail BR log in brbackuplog-20251110114424.log
16 [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]
17 [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 [root@YCPTLMESTIDB01 ~]# br log status --pd="根据实际情况填写"
2 Detail BR log in /tmp/br.log.2025-11-10T12.47.31+0800
3 ● Total 1 Tasks.
4 > #1 <
5 name: pitr
6 status: ● NORMAL
7 start: 2025-11-10 12:05:48.091 +0800
8 end: 2090-11-18 22:07:45.624 +0800
9 storage: s3://tidbbackup/backup-data/log-backup
10 speed(est.): 553.02 ops/s
11 checkpoint[global]: 2025-11-10 12:46:56.191 +0800; gap=37s
日志备份任务创建完成。
快照备份
快照备份需要使用 linux crontab 计划任务部署:
1 ## 创建脚本文件
2 [root@tidb ~]# cat<<-EOF>/root/scripts/brbackupfull.sh
3 AccessKey="根据实际情况填写"
4 SecretKey="根据实际情况填写"
5 Bucket="tidbbackup"
6 Endpoint="192.168.6.120:9000"
7 PDIP="根据实际情况填写"
8 export AWS_ACCESS_KEY_ID=$AccessKey
9 export AWS_SECRET_ACCESS_KEY=$SecretKey
10 CURDATE=$(date +%Y%m%d%H%M%S)
11 br backup full --pd "${PDIP}" \
12 --storage "s3://${Bucket}/backup-data/snapshot-${CURDATE}" \
13 --s3.endpoint="http://${Endpoint}" \
14 --ratelimit 64 \
15 --log-file /root/scripts/brbackupfull-$CURDATE.log
16
17 echo s3://${Bucket}/backup-data/snapshot-${CURDATE}
18 EOF
授权:
1 [root@tidb ~]# chmod +x /root/scripts/brbackupfull.sh
部署计划任务:
1 ## 每 2 天执行一次快照备份
2 [root@tidb ~]# crontab -e
3 ## 写入以下任务
4 0 0 */2 * * /root/scripts/brbackupfull.sh
手动执行一次验证:
1 [root@tidb scripts]# sh brbackupfullminio.sh &
2 [1] 876
3 Detail BR log in brbackupfull-20251110120639.log
4 [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]
5 Full Backup <--------------------------------------------------------------------------/.......................................................................................................................> 2.16%
等待备份结束即可,备份的文件存放到 minIO 集群的 bucket 目录下:
查看磁盘空间:
1 [root@minio01 ~]# df -h
2 Filesystem Size Used Avail Use% Mounted on
3 devtmpfs 3.9G 0 3.9G 0% /dev
4 tmpfs 3.9G 0 3.9G 0% /dev/shm
5 tmpfs 3.9G 9.7M 3.9G 1% /run
6 tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
7 /dev/mapper/centos-root 44G 4.0G 41G 9% /
8 /dev/sda1 1014M 172M 843M 17% /boot
9 tmpfs 799M 48K 799M 1% /run/user/0
10 /dev/mapper/data-data_lv 5.0T 243G 4.5T 6% /data
11
12 ## 快照备份已经备份了 124G
13 [root@minio01 backup-data]# du -sh snapshot-20251110120639/
14 124G snapshot-20251110120639/
总体来看,本地备份还是快的太多了。
minIO mc 常用命令
下面总结了一些 minIO mc 的一些常用命令:
别名管理(Alias Management)
添加/设置别名
mc alias set <别名> <访问密钥> <密钥>
mc alias set myminio http://192.168.6.120:9000 myminioid myminioPassWord
列出所有别名
mc alias list
mc alias ls
删除别名
mc alias remove <别名>
mc alias rm <别名>
基本文件操作
列出存储桶/对象
mc ls <别名> # 列出所有bucket
mc ls <别名>/ # 列出bucket中的对象
mc ls --recursive <别名>/ # 递归列出所有对象
创建存储桶
mc mb <别名>/
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/
镜像同步(类似rsync)
mc mirror <源> <目标>
mc mirror /local/path minio01/bucket/
mc mirror --watch /local/path minio01/bucket/ # 持续监控同步
删除文件/对象
mc rm <别名>//
mc rm --recursive --force <别名>//path/
移动文件
mc mv <源> <目标>
查看和下载
查看文件内容
mc cat <别名>//
查看文件头部
mc head <别名>//
查看文件尾部
mc tail <别名>//
下载文件
mc cp <别名>// /local/path/
权限和策略管理
设置匿名访问策略
mc anonymous set <download|upload|public> <别名>/
mc anonymous set download minio01/mybucket
查看访问策略
mc anonymous get <别名>/
查看对象/bucket信息
mc stat <别名>//
版本控制和生命周期
启用版本控制
mc version enable <别名>/
查看版本控制状态
mc version info <别名>/
设置生命周期规则
mc ilm add --expiry-days 30 <别名>/
查看生命周期规则
mc ilm ls <别名>/
查找和差异对比
查找文件
mc find <别名>/ --name "*.txt"
比较差异
mc diff <源> <目标>
服务器管理
查看服务器信息
mc admin info <别名>
查看服务状态
mc admin service status <别名>
重启服务
mc admin service restart <别名>
常用选项参数
--recursive, -r # 递归操作
--force # 强制执行
--watch # 监控变化
--older-than # 只处理早于指定时间的文件
--newer-than # 只处理晚于指定时间的文件
--json # JSON格式输出
实用示例
备份本地目录到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 <别名>/
批量上传
mc cp --recursive /local/data/ minio01/mybucket/data/
获取帮助
mc --help # 查看所有命令
mc --help # 查看特定命令帮助
mc --version # 查看版本
这些是最常用的 MinIO Client 命令,基本覆盖日常运维操作需求。
写在最后
整体测试下来,MinIO 部署简单、界面友好、命令丰富,关键是内网备份速度还是挺香的!既省了云存储的银子,又摆脱了公网龟速的折磨,数据还在自己手里,安全感拉满。对于备份数据量大、追求高性能的场景,MinIO + BR 这套组合拳真的值得一试!!!