自动备份数据库的脚本怎么写

wen 实用脚本 2

本文目录导读:

自动备份数据库的脚本怎么写

  1. MySQL/MariaDB 备份脚本
  2. PostgreSQL 备份脚本
  3. SQL Server 备份脚本
  4. 定时备份配置(crontab)
  5. 高级功能增强版
  6. 使用说明
  7. 注意事项

我来给你写一个完整的数据库自动备份脚本,包含多种常见数据库的支持:

MySQL/MariaDB 备份脚本

#!/bin/bash
# MySQL数据库自动备份脚本
# 配置参数
DB_HOST="localhost"
DB_USER="root"
DB_PASSWORD="your_password"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=7
LOG_FILE="/var/log/mysql_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 获取所有数据库列表
databases=$(mysql -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 备份函数
backup_database() {
    local db_name=$1
    local backup_file="$BACKUP_DIR/${db_name}_${DATE}.sql.gz"
    log "开始备份数据库: $db_name"
    # 使用mysqldump备份并压缩
    mysqldump -h"$DB_HOST" -u"$DB_USER" -p"$DB_PASSWORD" \
        --single-transaction --routines --triggers \
        --databases "$db_name" | gzip > "$backup_file"
    if [ $? -eq 0 ]; then
        log "数据库 $db_name 备份成功: $backup_file"
    else
        log "数据库 $db_name 备份失败"
    fi
}
# 开始备份
log "开始数据库备份任务"
# 备份所有数据库
for db in $databases; do
    backup_database $db
done
# 删除过期备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
log "已删除 ${RETENTION_DAYS} 天前的备份文件"
log "备份任务完成"

PostgreSQL 备份脚本

#!/bin/bash
# PostgreSQL数据库自动备份脚本
# 配置参数
PG_HOST="localhost"
PG_PORT="5432"
PG_USER="postgres"
PG_PASSWORD="your_password"
BACKUP_DIR="/backup/postgresql"
RETENTION_DAYS=7
LOG_FILE="/var/log/pg_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 设置环境变量
export PGPASSWORD=$PG_PASSWORD
mkdir -p $BACKUP_DIR
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 获取所有数据库列表
databases=$(psql -h $PG_HOST -U $PG_USER -t -c "SELECT datname FROM pg_database WHERE datistemplate = false AND datname != 'postgres';")
# 备份单个数据库函数
backup_database() {
    local db_name=$1
    local backup_file="$BACKUP_DIR/${db_name}_${DATE}.dump"
    log "开始备份数据库: $db_name"
    # 使用pg_dump备份
    pg_dump -h $PG_HOST -p $PG_PORT -U $PG_USER \
        -F custom -f "$backup_file" "$db_name"
    if [ $? -eq 0 ]; then
        # 压缩备份文件
        gzip "$backup_file"
        log "数据库 $db_name 备份成功: $backup_file.gz"
    else
        log "数据库 $db_name 备份失败"
    fi
}
# 开始备份
log "开始PostgreSQL数据库备份任务"
for db in $databases; do
    backup_database "$db"
done
# 清理过期备份
find $BACKUP_DIR -name "*.dump.gz" -mtime +$RETENTION_DAYS -delete
log "已清理超过 ${RETENTION_DAYS} 天的备份"
log "备份任务完成"

SQL Server 备份脚本

#!/bin/bash
# SQL Server数据库自动备份脚本
# 配置参数
SQL_HOST="localhost"
SQL_USER="sa"
SQL_PASSWORD="your_password"
BACKUP_DIR="/backup/mssql"
RETENTION_DAYS=7
LOG_FILE="/var/log/mssql_backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
# 检查备份目录
mkdir -p $BACKUP_DIR
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
# 获取数据库列表(排除系统数据库)
databases=$(sqlcmd -S $SQL_HOST -U $SQL_USER -P $SQL_PASSWORD \
    -Q "SELECT name FROM sys.databases WHERE database_id > 4;" -h -1)
# 备份函数
backup_database() {
    local db_name=$1
    local backup_file="$BACKUP_DIR/${db_name}_${DATE}.bak"
    log "开始备份数据库: $db_name"
    # 执行备份
    sqlcmd -S $SQL_HOST -U $SQL_USER -P $SQL_PASSWORD \
        -Q "BACKUP DATABASE [$db_name] TO DISK = N'$backup_file' WITH COMPRESSION;"
    if [ $? -eq 0 ]; then
        # 压缩备份
        gzip "$backup_file"
        log "数据库 $db_name 备份成功: $backup_file.gz"
    else
        log "数据库 $db_name 备份失败"
    fi
}
# 开始备份
log "开始SQL Server备份任务"
for db in $databases; do
    if [ -n "$db" ]; then
        backup_database "$db"
    fi
done
# 清理过期备份
find $BACKUP_DIR -name "*.bak.gz" -mtime +$RETENTION_DAYS -delete
log "备份任务完成"

定时备份配置(crontab)

# 每天凌晨2点执行MySQL备份
0 2 * * * /path/to/mysql_backup.sh
# 每天凌晨3点执行PostgreSQL备份  
0 3 * * * /path/to/pg_backup.sh
# 每周日凌晨1点执行SQL Server备份
0 1 * * 0 /path/to/mssql_backup.sh

高级功能增强版

#!/bin/bash
# 增强版备份脚本,支持多数据库和自定义配置
# 配置文件方式
CONFIG_FILE="/etc/backup_config"
source $CONFIG_FILE 2>/dev/null || {
    echo "配置文件不存在,使用默认配置"
    DB_TYPE=${DB_TYPE:-mysql}
    DB_HOST=${DB_HOST:-localhost}
    DB_PORT=${DB_PORT:-3306}
    DB_USER=${DB_USER:-root}
    DB_PASSWORD=${DB_PASSWORD:-}
    BACKUP_DIR=${BACKUP_DIR:-/backup/database}
    RETENTION_DAYS=${RETENTION_DAYS:-7}
    BACKUP_TIME=${BACKUP_TIME:-"02:00"}
}
# 发送通知函数(支持邮件/微信/钉钉)
send_notification() {
    local subject=$1
    local message=$2
    # 邮件通知
    if [ -n "$MAIL_TO" ]; then
        echo "$message" | mail -s "$subject" "$MAIL_TO"
    fi
    # 钉钉机器人
    if [ -n "$DINGDING_WEBHOOK" ]; then
        curl -s -X POST -H "Content-Type: application/json" \
            -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$subject\n$message\"}}" \
            "$DINGDING_WEBHOOK"
    fi
    # 企业微信
    if [ -n "$WECHAT_WEBHOOK" ]; then
        curl -s -X POST -H "Content-Type: application/json" \
            -d "{\"msgtype\":\"text\",\"text\":{\"content\":\"$subject\n$message\"}}" \
            "$WECHAT_WEBHOOK"
    fi
}
# 备份前检查磁盘空间
check_disk_space() {
    local required_space=$((5 * 1024))  # 需要5GB空间
    local available_space=$(df -P "$BACKUP_DIR" | awk 'NR==2 {print $4}')
    if [ $available_space -lt $required_space ]; then
        send_notification "磁盘空间不足" "需要 ${required_space}MB,可用 ${available_space}MB"
        exit 1
    fi
}

使用说明

  1. 修改配置:替换脚本中的数据库连接信息
  2. 添加执行权限chmod +x backup_script.sh
  3. 测试运行:手动执行脚本确认无误
  4. 添加定时任务:使用crontab设置定时执行
  5. 设置日志轮转:配置logrotate避免日志文件过大

注意事项

  • 定期测试备份文件的完整性
  • 异地备份建议使用rsync或云存储同步
  • 敏感信息建议使用环境变量或加密文件存储
  • 备份文件建议定期上传到对象存储(如AWS S3、阿里云OSS)

如果你需要特定数据库的详细备份方案或特殊场景的备份策略,请告诉我具体需求!

抱歉,评论功能暂时关闭!