需要本地安装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."