关于minio桶文件备份到本地或NAS等其他设备的操作说明(http+https)

本篇操作说明用来记录如何通过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

全部安装包网站:https://dl.min.io/client/mc/release/

  • (以 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

四、自动化与保留策略

  1. 定时任务(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,下面放一个对比表供参考

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 列表 与关键对象数量/大小;必要时抽样计算哈希校验。

本篇说明参考了很多博主写的文章,因为是陆续摘抄在本地,未及时记录博主的名字,在此感谢技术大佬们!同时本篇说明加入了实践过程中遇到的问题以及注意点,若发现问题希望小伙伴们批评指正,若有疑惑欢迎多多交流~

相关推荐
醇氧10 小时前
【学习】IP地址:数字世界的“门牌号”怎么读?
网络协议·学习·tcp/ip
Hello_Embed11 小时前
嵌入式上位机开发入门(三):TCP 编程 —— Server 端实现
笔记·单片机·网络协议·tcp/ip·嵌入式
zt1985q13 小时前
本地部署开源元搜索引擎 SearXNG 并实现外部访问
服务器·网络协议·开源
摇滚侠13 小时前
系统工作台待办实时提醒,取代五分钟刷新一次,判断有没有新的待办,利用 WebSocket 实现
网络·websocket·网络协议
半壶清水14 小时前
[软考网规考点笔记]-局域网之以太网标准
网络·笔记·网络协议·考试
初九之潜龙勿用16 小时前
C# 解决“因为算法不同,客户端和服务器无法通信”的问题
服务器·开发语言·网络协议·网络安全·c#
zt1985q19 小时前
本地部署 Home Assistant 高级自动化 AppDaemon 并实现外部访问
运维·服务器·网络·网络协议·自动化
野犬寒鸦21 小时前
计网复习Day01
服务器·后端·网络协议·面试
浅念-21 小时前
Linux 进程与操作系统
linux·运维·服务器·网络·数据结构·笔记·网络协议