实现MinIO数据的每日备份
1.概述
MinIO是一个对象存储解决方案,常作为中间件用于后端系统保存和管理文件附件,附件和关系型数据库的库表数据一样是系统的核心用户数据,因此系统运行过程中,需要对附件数据进行每天备份。
在常年累月运行中,系统产生的附件量是巨大的,有时单独一个附件就很大,如果每天进行全量备份,那备份的文件就会像滚雪球一样越来越大,因此这里采用增量备份的形式,每天只备份当天的数据。
2.后端代码适配
首先,MinIO的文件层次就需要按天分开,在后端调用S3接口进行上传的代码进行控制
path = FileUtils.generatePath(content, name);int year = LocalDate.now().getYear();int month = LocalDate.now().getMonthValue();int day = LocalDate.now().getDayOfMonth();path = year+"/"+month+"/"+day+"/"+path;这样,在前端调用上传接口上传附件后,返回的附件路径应该是这样的
{ "code": 0, "data": "2025/10/20/62ca4c572522f9708199a4f96e0816f879669785347483232a8fcfd085267dc5.PNG", "msg": "", "total": null}文件在MinIO中会按照年月日分级存储

3.备份Shell脚本
编写以下Shell脚本,调用MinIO客户端命令mc拷贝文件,并定时调用脚本实现每天进行备份
#!/bin/bash# MinIO 备份脚本 YEAR=$(date +%Y)MONTH=$(date +%m)DAY=$(date +%d)# 配置变量MINIO_ALIAS="myminio"BUCKET_NAME="u******ia"BACKUP_BASE_DIR="/opt/backup"LOG_DIR="/var/log/minio_backup"DATE_SUFFIX=$(date +%Y-%m-%d)-backBACKUP_PATH="${BACKUP_BASE_DIR}/${DATE_SUFFIX}"# 创建必要的目录mkdir -p "${BACKUP_PATH}"mkdir -p "${LOG_DIR}"# 日志文件LOG_FILE="${LOG_DIR}/backup_$(date +%Y%m%d).log"# 函数:记录日志log_message() { echo "$(date '+%Y-%m-%d %H:%M:%S') - $1" | tee -a "$LOG_FILE"}# 函数:错误处理error_exit() { log_message "错误: $1" exit 1}# 开始备份log_message "=== 开始 MinIO 备份 ==="log_message "备份源: ${MINIO_ALIAS}/${BUCKET_NAME}"log_message "备份目标: ${BACKUP_PATH}"# 检查 mc 命令是否存在if ! command -v /opt/mc &> /dev/null; then error_exit "mc 命令未找到,请确保 MinIO Client 已安装"fi# 检查备份目录是否可写if [ ! -w "${BACKUP_BASE_DIR}" ]; then error_exit "备份目录 ${BACKUP_BASE_DIR} 不可写"fi# 执行备份log_message "开始复制数据..."/opt/mc cp "${MINIO_ALIAS}/${BUCKET_NAME}/${YEAR}/${MONTH}/${DAY}" "${BACKUP_PATH}/" --recursive 2>&1 | tee -a "$LOG_FILE"# 检查备份结果if [ ${PIPESTATUS[0]} -eq 0 ]; then log_message "备份成功完成" # 显示备份统计信息 BACKUP_SIZE=$(du -sh "${BACKUP_PATH}" | cut -f1) FILE_COUNT=$(find "${BACKUP_PATH}" -type f | wc -l) log_message "备份大小: ${BACKUP_SIZE}" log_message "文件数量: ${FILE_COUNT}" log_message "备份位置: ${BACKUP_PATH}"else error_exit "备份过程中出现错误"filog_message "=== 备份完成 ==="