MinIO 每周自动备份到本地目录:用 mc mirror 就够了

如果你的需求是“每周自动把 MinIO bucket 备份到本地目录”,推荐直接使用这个组合:

MinIO 官方 mc mirror + 系统定时任务

mc mirror 是 MinIO 官方客户端 mc 提供的同步命令,适合在 MinIO、S3 兼容对象存储和本地文件系统之间做镜像同步。它的使用方式接近 rsync,命令简单,维护成本低。

不过要注意一点:mc mirror 默认主要备份当前对象,不等于完整保留对象版本历史。如果你的 MinIO bucket 开启了 versioning,并且希望完整保留历史版本,应该进一步考虑 MinIO replication,而不是只依赖 mc mirror

工具推荐排序

场景 推荐工具 说明
简单每周备份到本地 mc mirror 最推荐,官方工具,命令简单
需要备份到百度网盘、阿里云盘、Google Drive 等 rclone 支持很多云存储,也支持 S3/MinIO
想做加密、去重、历史快照 mc mirror + Kopia/restic 先把 MinIO 拉到本地目录,再用 Kopia/restic 做版本快照

如果只是把 MinIO 数据每周落一份到本地磁盘,mc mirror 就够用了。

方案一:Linux、NAS 或云服务器挂本地盘备份

假设 MinIO 地址是:

http://你的服务器IP:9000

先配置 MinIO 连接:

mc alias set myminio http://你的服务器IP:9000 你的ACCESS_KEY 你的SECRET_KEY

mc alias set 的格式是:

mc alias set ALIAS URL ACCESSKEY SECRETKEY

测试是否能正常连接:

mc ls myminio

创建备份脚本:

mkdir -p /opt/scripts
nano /opt/scripts/minio-weekly-backup.sh

写入下面内容:

#!/bin/bash
set -e

BACKUP_ROOT="/data/minio-backup"
TODAY=$(date +%F)
LOG_DIR="/var/log/minio-backup"
LOG_FILE="$LOG_DIR/backup-$TODAY.log"

mkdir -p "$BACKUP_ROOT/$TODAY"
mkdir -p "$LOG_DIR"

echo "===== MinIO backup start: $(date) =====" >> "$LOG_FILE"

# 备份所有 bucket
mc ls myminio | awk '{print $NF}' | sed 's#/$##' | while read bucket
do
    echo "Backing up bucket: $bucket" >> "$LOG_FILE"
    mc mirror --overwrite "myminio/$bucket" "$BACKUP_ROOT/$TODAY/$bucket" >> "$LOG_FILE" 2>&1
done

# 只保留最近 8 周备份
find "$BACKUP_ROOT" -mindepth 1 -maxdepth 1 -type d -mtime +56 -exec rm -rf {} \;

echo "===== MinIO backup end: $(date) =====" >> "$LOG_FILE"

授权脚本可执行:

chmod +x /opt/scripts/minio-weekly-backup.sh

设置每周日凌晨 3 点自动执行:

crontab -e

加入:

0 3 * * 0 /opt/scripts/minio-weekly-backup.sh

这样就会生成类似下面的目录结构:

/data/minio-backup/
  2026-06-30/
    bucket1/
    bucket2/
  2026-07-07/
    bucket1/
    bucket2/

每周一个日期目录的好处是,即使 MinIO 里误删了文件,也能从之前日期的备份目录里找回。

方案二:Windows 本地电脑每周自动备份

如果你想把 MinIO 备份到 Windows 的 D:\minio-backup,可以使用 Windows 任务计划程序。

先下载 mc.exe,放到:

C:\tools\mc.exe

配置连接:

C:\tools\mc.exe alias set myminio http://你的服务器IP:9000 你的ACCESS_KEY 你的SECRET_KEY

测试连接:

C:\tools\mc.exe ls myminio

创建脚本:

C:\scripts\minio-weekly-backup.bat

内容如下:

@echo off
set MC=C:\tools\mc.exe
set BACKUP_ROOT=D:\minio-backup
set LOG=%BACKUP_ROOT%\backup.log

for /f "tokens=2 delims==" %%i in ('wmic os get LocalDateTime /value ^| find "="') do set dt=%%i
set TODAY=%dt:~0,4%-%dt:~4,2%-%dt:~6,2%

if not exist "%BACKUP_ROOT%\%TODAY%" mkdir "%BACKUP_ROOT%\%TODAY%"

echo ===== MinIO backup start: %date% %time% ===== >> "%LOG%"

REM 示例:备份 bucket1,改成你的 bucket 名
%MC% mirror --overwrite myminio/bucket1 "%BACKUP_ROOT%\%TODAY%\bucket1" >> "%LOG%" 2>&1

echo ===== MinIO backup end: %date% %time% ===== >> "%LOG%"

设置每周日凌晨 3 点自动执行:

schtasks /Create /TN "MinIO Weekly Backup" /TR "C:\scripts\minio-weekly-backup.bat" /SC WEEKLY /D SUN /ST 03:00

Windows 下也建议使用日期目录:

D:\minio-backup\
  2026-06-30\
    bucket1\
    bucket2\
  2026-07-07\
    bucket1\
    bucket2\

重要提醒:不要乱用 --remove

mc mirror --remove 会删除目标目录里“源 MinIO 没有的文件”,也就是让本地目录和 MinIO 完全一致。

所以:

mc mirror --overwrite myminio/bucket /backup/bucket

更适合做备份。

而这个命令:

mc mirror --overwrite --remove myminio/bucket /backup/bucket

更像同步镜像。如果 MinIO 里误删了文件,本地目标目录也可能跟着删。除非你明确需要“目标和源完全一致”,否则不建议把 --remove 用在唯一备份任务里。

--overwrite 的作用是覆盖目标已有对象,适合同步更新过的对象。

除了 bucket 文件,还应该备份什么

只备份对象文件还不够。实际恢复时,通常还需要这些信息:

docker-compose.yml
.env
MinIO 账号密码
bucket 名称
bucket policy
应用程序里用到的 access key

如果是正式系统,还可以使用:

mc admin cluster bucket export

这个命令可以导出指定 bucket 或全部 bucket 的元数据,输出为 cluster-metadata.zip。这类元数据在迁移或恢复环境时很有用。

总结

普通 MinIO 本地备份,建议直接用:

mc mirror + cron / schtasks

推荐目录结构是“每周一个日期目录”,例如:

/data/minio-backup/2026-06-30/
/data/minio-backup/2026-07-07/

这样比单纯覆盖同一个目录更安全。误删文件、误覆盖对象时,至少还能回到之前某一周的备份里找数据。

参考: