MinIO的 mc 命令使用记录

需求

MinIO里面的文件是其它服务通过接口上传的,现在想通过命令的方式,把文件上传到其它服务器上

前置操作

# 下载 mc(Linux 示例)
wget https://dl.min.io/client/mc/release/linux-amd64/mc
chmod +x mc
sudo mv mc /usr/local/bin/

# 配置 MinIO 服务别名
mc alias set myminio http://minio.example.com:9000 ACCESS_KEY SECRET_KEY

方案

方法一

使用 mc cat + ssh 直接传输(适用于小文件)

# 从 MinIO 下载文件并通过 SSH 上传到目标服务器
mc cat myminio/mybucket/path/to/file.txt | ssh user@remote-server "cat > /remote/path/file.txt"

此方法是通过管道的方式,直接上传,不需要本地存储文件,但也可能因管道问题,导致失败

方法二

先下载到本地,再用SCP上传

# 1. 从 MinIO 下载文件到本地
mc cp myminio/mybucket/path/to/file.txt ./local_file.txt

# 2. 使用 scp 上传到远程服务器
scp ./local_file.txt user@remote-server:/remote/path/

此方法分成两步,任意一步失败,都可重新执行

扩展知识

mc alias set <NAME> <URL> <ACCESS_KEY> <SECRET_KEY>  # 添加/更新别名
mc alias remove <NAME> 或 mc alias rm <NAME>         # 删除别名
mc alias list    # 列出所有别名

最牛逼方案

直接访问物理文件,前提:

MinIO 的磁盘格式是内部结构(尤其在纠删码模式下),不能直接按文件名找!
仅适用于 FS(单机文件系统)后端。如果你用的是分布式 MinIO(4+ 节点)或纠删码(Erasure Coding),文件被分片存储,无法直接拼出原始文件!
可通过 minio 的启动进程查看是否为 FS 模式

如果启动 MinIO 时命令是 minio server /data(单路径),则是 FS 模式,可直接读。
如果是 minio server /disk1 /disk2 ...(多路径)或集群,则不能直接读磁盘!
也可以能完命令: ps aux | grep minio 查看启动命令

查看集群信息-需要有权限

mc admin info myminio

集群信息分析

[root@ydiuap-dev-mid01 ~]# mc admin info myminio
●  10.0.0.3:34991
   Uptime: 1 year
   Version: 2024-06-29T01:20:47Z
   Network: 1/1 OK
   Drives: 1/1 OK
   Pool: 1

Pools:
   1st, Erasure sets: 1, Drives per erasure set: 1

159 GiB Used, 11 Buckets, 70,533 Objects
1 drive online, 0 drives offline

结论:这是一个 单节点、单磁盘的 MinIO 实例,不是分布式集群。
虽然它显示 Erasure(纠删码)后端,但由于 只有 1 个磁盘,MinIO 自动降级为 类似单机文件系统(FS)的行为,但底层仍使用 Erasure 编码逻辑(只是 N=1, K=1)。

10.0.0.3:34991 当前唯一的 MinIO 节点
Drives: 1/1 OK 只挂载了 1 块磁盘,且状态正常
Erasure sets: 1, Drives per erasure set: 1 纠删码组只有 1 组,每组 1 块盘 → 等效于单机模式
1 drive online 没有冗余,任何磁盘故障 = 数据全丢
159 GiB Used 已用存储空间

知识点

MinIO 的 单磁盘 Erasure 模式(1 drive) 下,对象(Object)在磁盘上确实是以目录形式存储的,而不是直接一个文件。

这是 MinIO 从 v2020+ 开始采用的新存储格式(称为 "xl.meta + part.1" 结构),即使只有一个磁盘,也会使用类似分布式系统的内部格式来保证元数据一致性。

<bucket>/<object-key>/
├── xl.meta          # 元数据(包含版本、大小、校验和、分片信息等)
└── part.1           # 实际数据内容(二进制文件)
<bucket>/<object-key>/
├── xl.meta                              ← 对象元数据(包含所有版本信息)
└── <version-uuid>/                      ← 每个版本一个子目录
    └── part.1                           ← 该版本的实际数据文件

*导出所有 part.1* 文件

#!/bin/bash
find /data/def-bucket/.../20251206-1 -name "part.1" | while read f; do
  # 获取 object key(从 bucket 后的路径)
  rel_path="${f#/data/yms-def-bucket/}"
  dest="/backup/${rel_path%/part.1}"  # 去掉 part.1,保留原 key 作为文件名
  mkdir -p "$(dirname "$dest")"
  cp "$f" "$dest"
  echo "Exported: $dest"
done

查 bucket 的后端类型,不需要权限

mc stat myminio/mybucket

通过HTTP的方式下载,也可以做并发或分块

# 并发下载(默认 mc 已优化,但可显式控制)
mc cp --parallel=8 myminio/mybucket/largefile ./largefile

# rclone(支持分块并发)
rclone copy minio:mybucket/path ./local --transfers=16