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

#!/bin/bash

# 数据库连接信息
MYSQL_HOST="172.25.25.14"
MYSQL_PORT="3306"
MYSQL_USERNAME="root"
MYSQL_PASSWORD="xuxiaowei.com.cn"

# 文件夹
backup_folder="/data/mysql-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

  # 文件名
  file_name="${database}_${file_suffix}.sql"

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

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

  # 执行备份
  # 如果当前机器上安装了 mysqldump,可直接使用当前机器的 mysqldump
  # 如果当前机器上没有安装 mysqldump,可以使用 registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mysql:8.3.0 Docker 镜像中的 mysqldump 执行备份
  docker run --rm -v $backup_dir:$backup_dir registry.cn-qingdao.aliyuncs.com/xuxiaoweicomcn/mysql:8.3.0 mysqldump -h $MYSQL_HOST -P $MYSQL_PORT -u $MYSQL_USERNAME -p$MYSQL_PASSWORD $database --master-data --single-transaction --set-gtid-purged=OFF >$backup_dir/$file_name

  # 检查备份是否成功
  if [ $? -ne 0 ]; then
    echo "$(date +'%Y-%m-%d %H:%M:%S') 备份数据库 $database 到 $backup_dir/$file_name 失败,耗时 $(date -u -d "@$(($(date +%s) - $start_time))" +"%H:%M:%S")"
  else
    echo "$(date +'%Y-%m-%d %H:%M:%S') 备份数据库 $database 到 $backup_dir/$file_name 成功,大小为 $(du -h $backup_dir/$file_name | awk '{print $1}'),耗时 $(date -u -d "@$(($(date +%s) - $start_time))" +"%H:%M:%S")"
  fi

  # 保留最近 keep_days 天的备份
  find $backup_dir -type f -name "*.sql" -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') 备份完成"