Press "Enter" to skip to content

MySQL数据库备份脚本

需要本地安装MySQL客户端,有mysqldump命令,支持配置目标数据库的地址,账号密码,支持多个数据库。

使用crontab来启动脚本,实现自定义的备份策略。

#!/usr/bin/env bash

set -euo pipefail

############################
# MySQL backup config
############################
MYSQL_HOST="127.0.0.1"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"

# 支持多个数据库,空格分隔
DATABASES=(
  "db1"
  "db2"
)

# 本地备份目录
BACKUP_BASE_DIR="/data/database_auto_backup/backups"

# 保留天数(超过该天数自动删除)
RETENTION_DAYS=7

############################
# Runtime
############################
TIMESTAMP="$(date +%Y%m%d_%H%M%S)"
mkdir -p "${BACKUP_BASE_DIR}"

# 避免密码出现在进程列表(通过环境变量传递)
export MYSQL_PWD="${MYSQL_PASSWORD}"

for DB in "${DATABASES[@]}"; do
  RUN_DIR="${BACKUP_BASE_DIR}/mysql_backup_${DB}_${TIMESTAMP}"
  SQL_FILE="${RUN_DIR}/${DB}.sql"
  ARCHIVE_NAME="mysql_backup_${DB}_${TIMESTAMP}.tar.gz"
  ARCHIVE_PATH="${BACKUP_BASE_DIR}/${ARCHIVE_NAME}"

  mkdir -p "${RUN_DIR}"

  echo "[$(date '+%F %T')] Backing up database: ${DB}"
  mysqldump \
    --host="${MYSQL_HOST}" \
    --port="${MYSQL_PORT}" \
    --user="${MYSQL_USER}" \
    --single-transaction \
    --quick \
    --routines \
    --events \
    --triggers \
    --databases "${DB}" \
    > "${SQL_FILE}"

  # 每个数据库独立打包压缩为 tar.gz
  echo "[$(date '+%F %T')] Compressing ${DB} backup to: ${ARCHIVE_PATH}"
  tar -czf "${ARCHIVE_PATH}" -C "${BACKUP_BASE_DIR}" "$(basename "${RUN_DIR}")"

  # 清理当前数据库的临时 SQL 目录
  rm -rf "${RUN_DIR}"

  echo "[$(date '+%F %T')] Backup completed for ${DB}: ${ARCHIVE_PATH}"
done

# 清理过期备份包
echo "[$(date '+%F %T')] Cleaning backup files older than ${RETENTION_DAYS} days"
find "${BACKUP_BASE_DIR}" -maxdepth 1 -type f -name "mysql_backup_*.tar.gz" -mtime "+${RETENTION_DAYS}" -print -delete

# 清理环境变量
unset MYSQL_PWD

echo "[$(date '+%F %T')] All database backups completed."
发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注