MongoDB 备份、保留最近几天的备份

#!/bin/bash

# 数据库连接信息
MONGO_HOST="172.25.25.14"
MONGO_PORT="27017"
MONGO_USERNAME="root"
MONGO_PASSWORD="xuxiaowei.com.cn"
MONGO_AUTH_DB="admin"

# 备份文件夹
backup_folder="/data/mongo-backups"

# 保留天数
keep_days=7

# 数据库列表
database_list=(
  "test"
  "passport"
  "xuxiaowei"
  "xuxiaowei-cloud"
)

# 文件名后缀
file_suffix=$(date +%Y%m%d_%H%M%S)

for database in "${database_list[@]}"; do
  # 数据库备份文件夹
  backup_dir="${backup_folder}/${database}"

  # 创建数据库备份文件夹
  mkdir -p $backup_dir

  # 备份文件名(使用tar.gz格式)
  backup_file="${database}_${file_suffix}.tar.gz"

  # 创建临时文件夹
  temp_backup_dir="${backup_dir}/temp_${file_suffix}"
  mkdir -p $temp_backup_dir
  chmod 777 $temp_backup_dir

  echo "$(date +'%Y-%m-%d %H:%M:%S') 备份数据库 $database 到 $backup_dir/$backup_file 开始"

  # 开始计算耗时
  start_time=$(date +%s)

  # 执行备份
  # 如果当前机器上安装了 mongodump,可直接使用当前机器的 mongodump
  # 如果当前机器上没有安装 mongodump,可以使用 registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mongo:8.0.5 Docker 镜像中的 mongodump 执行备份
  docker run --rm -v $backup_dir:$backup_dir registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mongo:8.0.5 mongodump --host $MONGO_HOST --port $MONGO_PORT --username $MONGO_USERNAME --password $MONGO_PASSWORD --authenticationDatabase $MONGO_AUTH_DB --db $database --out $temp_backup_dir

  # 检查备份是否成功
  if [ $? -ne 0 ]; then
    echo "$(date +'%Y-%m-%d %H:%M:%S') 备份数据库 $database 失败,耗时 $(date -u -d "@$(($(date +%s) - $start_time))" +"%H:%M:%S")"
    # 清理临时目录
    rm -rf $temp_backup_dir
  else
    # 压缩备份文件
    cd $temp_backup_dir
    tar -zcvf $backup_dir/$backup_file .
    cd -

    # 清理临时目录
    rm -rf $temp_backup_dir

    echo "$(date +'%Y-%m-%d %H:%M:%S') 备份数据库 $database 到 $backup_dir/$backup_file 成功,大小为 $(du -h $backup_dir/$backup_file | awk '{print $1}'),耗时 $(date -u -d "@$(($(date +%s) - $start_time))" +"%H:%M:%S")"
  fi

  # 保留最近 keep_days 天的备份
  find $backup_dir -type f -name "*.tar.gz" -mtime +$keep_days -exec rm {} \;

  # 检查是否删除成功
  if [ $? -ne 0 ]; then
    echo "$(date +'%Y-%m-%d %H:%M:%S') 删除 $backup_dir 中超过 $keep_days 天的备份失败"
  else
    echo "$(date +'%Y-%m-%d %H:%M:%S') 删除 $backup_dir 中超过 $keep_days 天的备份成功"
  fi

done

echo "$(date +'%Y-%m-%d %H:%M:%S') 备份完成"