本篇操作说明用来记录如何通过mc工具将minio桶文件备份到本地或NAS等其他设备
< 同时介绍如何配置使用https访问方式的minio的备份方式>
注:本面介绍适用于Linux环境下安装的minio,Win系统下的请另行查询。虽然按照下述操作没有问题,but还是一定要先在测试环境试一下再到生产环境进行配置,数据无价~
一、备份方式选型
使用 mc mirror 做跨服务器或异地备份/迁移:适合把数据从源 MinIO 持续镜像到目标 MinIO(或兼容 S3 的存储),支持全量与持续增量,命令简洁、可脚本化。
直接拷贝对象存储到本地归档:用 mc cp -r 将指定 bucket 或整站数据拉到本地磁盘,便于落地归档、压缩和长期保留。
生产建议:关键数据采用"远端镜像(mc mirror)+ 本地归档(mc cp)"的双轨策略,兼顾快速回滚与离线留存。
二、准备与环境
- 安装并配置 MinIO Client(简称mc):下载符合自己服务器架构的 mc
- (以 linux-amd64为例)
bash
wget https://dl.min.io/client/mc/release/linux-amd64/mc
- 放入 /usr/local/bin 并赋权:
bash
chmod +x mc && mv mc /usr/local/bin/

- 配置别名(alias):
- 若不使用多地址备份,则只需要配置一条即可
例如A机器上安装着minio,想在B机器上执行备份命令,那么只在B机器上配置别名即可
- 示例中的minio_qd、minio_jn可以换成任何方便记忆的名字
bash
mc alias set minio_qd http://源地址:9000 ACCESS_KEY SECRET_KEY
mc alias set minio_jn http://目标地址:9000 ACCESS_KEY SECRET_KEY
- 查询历史配置过的<别名>
bash
mc alias list
<'配置别名'可能出现的错误说明>
(1)连接类型错误提示
mc: Unable to initialize new alias from the provided
credentials. Client sent an HTTP request to an HTTPS server.
解决方案:出现该报错是因为minio配置过HTTPS,那么配置别名的时候就不要使用http了,改为https即可
(2)认证报错
mc: Unable to initialize new alias from the provided
credentials. Get "https://IP:端口号": tls: failed to verify certificate:
x509: cannot validate certificate for IP because it doesn't
contain any IP SANs.
解决方案:在使用HTTPS的情况下可能依旧会报如上的错误,有两种解决办法,①在执行命令时在命令结尾添加 --insecure 参数;②将证书加入系统的信任链。这里介绍①的方式:
mc alias set minio_sour https://IP或域名:端口号 ACCESS_KEY SECRET_KEY --insecure

- 校验连通与权限(若未配置多个别名,该步骤可忽略):
bash
mc ls minio_qd
mc mb minio_jn/test # 如做全量镜像可省略,mirror 会自动创建 bucket
三、常用备份方法说明
方法一 跨服务器镜像备份/迁移(优先考虑)
若没有其他安装过minio的服务器,则建议采用方法二;
注:若是https方式记得命令最后添加 --insecure 参数
全量镜像整站(minio_qd -> 源地址 minio_jn -> 目标地址)
bash
mc mirror minio_qd minio_jn
持续镜像(守护式,新增/变更自动同步)
bash
mc mirror --watch minio_qd minio_jn
覆盖式同步(重名文件强制覆盖)
bash
mc mirror --overwrite minio_qd minio_jn
指定单个桶
bash
mc mirror minio_qd/桶名 minio_jn/桶名
方法二 本地归档备份(持久化到磁盘,便于压缩与长期留存)
下面命令中的backup文件夹请更换为自己服务器存放备份文件的路径
- 整站归档:
bash
mc cp -r minio_qd /backup/minio_$(date +%F)
- 指定桶归档:
bash
mc cp -r minio_qd/桶名 /backup/桶名_$(date +%F)
注:若是https方式记得命令中添加 --insecure 参数

- 归档后压缩清理(示例保留 7 天):
bash
tar czf /backup/minio_$(date +%F).tar.gz -C /backup/minio_$(date +%F) .
find /backup -name "minio_*.tar.gz" -mtime +7 -delete
四、自动化与保留策略
- 定时任务(crontab)示例:
- 每天 02:00 全量镜像整站:
0 2 * * *
/usr/local/bin/mc mirror --overwrite minio_qd minio_jn >>
/var/log/minio_backup.log 2>&1
- 每 6 小时增量镜像:
0 */6 * * *
/usr/local/bin/mc mirror minio_qd minio_jn >>
/var/log/minio_backup.log 2>&1
- 每天 01:00 做本地归档并保留 7 天:
0 1 * * *
bash
/usr/local/bin/mc cp -r minio_qd /backup/minio_$(date +%F) &&
tar czf /backup/minio_$(date +%F).tar.gz /backup/minio_$(date +%F) &&
find /backup -name "minio_*.tar.gz" -mtime +7 -delete
之前有小伙伴问为什么这里不采用 -exec rm -rf {} +(或 ;),也不是不行,只是不安全,建议采用更高效且安全的-delete,下面放一个对比表供参考
- 保留最新的3份文件(补充参考,更推荐)
- 详细解释见《linux中保留最新3份文件的shell脚本》
bash
#!/bin/bash
set -euo pipefail # 开启严格模式,增强脚本健壮性
ReservedNum=3
FileDir=/home/testFile
date=$(date "+%Y%m%d-%H%M%S")
if [ ! -d "$FileDir" ]; then
echo "$date 错误:目录 $FileDir 不存在"
exit 1
fi
FileNum=$(find "$FileDir" -maxdepth 1 -type f | wc -l)
while (( FileNum > ReservedNum ));
do
OldFile=$(find "$FileDir" -maxdepth 1 -type f -printf "%T@ %p\n" | sort -n | head -n 1 | cut -d' ' -f2-)
if [ -z "$OldFile" ];
then
echo "$date 警告:未找到可删除的文件"
break
fi
echo "$date 删除文件: $OldFile"
rm -f "$OldFile"
FileNum=$((FileNum - 1))
done
- 保留与校验
(1)每日定时归档,定期清理历史文件;
(2)建议不定期做一次恢复测试或随机文件检查。
五、数据恢复与验证
从远端镜像恢复整站:
bash
mc mirror minio_jn minio_qd(或加 --overwrite 强制覆盖)。
从本地归档恢复到 MinIO:
目录归档:
bash
mc cp -r /backup/minio_2025-03-18/ minio_qd
压缩包:
先解压再恢复:
bash
tar xzf /backup/minio_2025-03-18.tar.gz -C /restore && mc cp -r /restore minio_qd
单桶恢复:
bash
mc cp -r /backup/桶名_2025-03-18/ minio_qd/桶名
一致性快速校验:对比源/目标的 bucket 列表 与关键对象数量/大小;必要时抽样计算哈希校验。
本篇说明参考了很多博主写的文章,因为是陆续摘抄在本地,未及时记录博主的名字,在此感谢技术大佬们!同时本篇说明加入了实践过程中遇到的问题以及注意点,若发现问题希望小伙伴们批评指正,若有疑惑欢迎多多交流~
