如何备份docker部署的mysql数据库?

本文共有1782个字,关键词:

问题:mysql使用docker部署,如果定时备份mysql里的数据库?

解决:使用脚本+crontab定时运行

方法:
vim mysql_backup.sh

#!/bin/bash

ENV_FILE="/opt/www/myproject/.env"

# 2. 加载 .env 文件中的变量
# 使用 set -a 导出所有变量,然后 source .env,最后 set +a 取消自动导出
set -a
source "$ENV_FILE"
set +a

# --- 配置部分 ---
# MySQL 容器的名称
CONTAINER_NAME="airborne-wifi-delivery-${APP_VERSION//./}-mysql-1"
# 宿主机上的备份文件存储目录
BACKUP_DIR="/opt/www/mysql_backups"
# 要备份的数据库名,使用 --all-databases 可备份所有库
DB_NAME="$DB_NAME"
# 备份文件前缀
BACKUP_FILE_PREFIX="backup"
# 保留最近 N 天的备份
RETENTION_DAYS=7

# --- 备份逻辑 ---
# 1. 创建备份目录(如果不存在)
mkdir -p "$BACKUP_DIR"

# 2. 生成带时间戳的备份文件名
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="$BACKUP_DIR/${BACKUP_FILE_PREFIX}_${DB_NAME}_${DATE}.sql.gz"

# 3. 执行备份
# 使用 export MYSQL_PWD 传递密码,避免命令行明文暴露(虽然仍有风险,但比直接 -p 好)
# --single-transaction 适用于 InnoDB 引擎,可在不锁表的情况下进行一致性备份
# --quick 用于减少内存占用
# - 注意:docker exec 中不要加 -it,否则 cron 执行会报错 "the input device is not a TTY"
echo "开始备份 $DB_NAME..."

export MYSQL_PWD="$DB_PASSWORD"

docker exec -e MYSQL_PWD="$MYSQL_PWD" "$CONTAINER_NAME" mysqldump \
  -u "$DB_USER" \
  --databases "$DB_NAME" \
  --single-transaction \
  --quick \
  | gzip > "$BACKUP_FILE"

# 清除环境变量中的密码
unset MYSQL_PWD

# 4. 检查备份是否成功
if [ $? -eq 0 ]; then
  echo "[$(date)] 备份成功: $BACKUP_FILE"
  # 5. 清理旧备份文件
  find "$BACKUP_DIR" -name "${BACKUP_FILE_PREFIX}_*.sql.gz" -mtime +$RETENTION_DAYS -delete
  echo "[$(date)] 已删除 $RETENTION_DAYS 天前的旧备份"
else
  echo "[$(date)] 备份失败!"
  exit 1
fi
版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。
添加新评论
暂无评论