问题: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