如何用脚本自动恢复数据库备份?

wen 实用脚本 4

本文目录导读:

如何用脚本自动恢复数据库备份?

  1. MySQL 数据库恢复脚本
  2. PostgreSQL 数据库恢复脚本
  3. 综合恢复脚本(带验证和日志)
  4. 自动化恢复脚本(带时间点选择)
  5. 定时自动恢复脚本(Crontab)
  6. 安全注意事项
  7. 完整生产级示例
  8. 使用建议

我将为您介绍几种常用的数据库备份恢复脚本方法。

MySQL 数据库恢复脚本

基础恢复脚本

#!/bin/bash
# mysql_restore.sh
# 数据库配置
DB_USER="root"
DB_PASS="your_password"
DB_NAME="your_database"
BACKUP_DIR="/path/to/backup"
BACKUP_FILE="backup_20240101.sql"
# 恢复数据库
mysql -u$DB_USER -p$DB_PASS $DB_NAME < $BACKUP_DIR/$BACKUP_FILE
# 如果恢复成功
if [ $? -eq 0 ]; then
    echo "数据库恢复成功: $(date)"
else
    echo "数据库恢复失败: $(date)"
    exit 1
fi

带压缩的恢复脚本

#!/bin/bash
# mysql_restore_compressed.sh
DB_USER="root"
DB_PASS="your_password"
BACKUP_FILE="/path/to/backup/backup_20240101.sql.gz"
# 解压并恢复
gunzip < $BACKUP_FILE | mysql -u$DB_USER -p$DB_PASS
# 或者使用zcat
zcat $BACKUP_FILE | mysql -u$DB_USER -p$DB_PASS

PostgreSQL 数据库恢复脚本

#!/bin/bash
# pg_restore.sh
# 数据库配置
DB_USER="postgres"
DB_NAME="your_database"
BACKUP_FILE="/path/to/backup/backup_20240101.dump"
# 恢复数据库
pg_restore -U $DB_USER -d $DB_NAME -v $BACKUP_FILE
# 或者使用psql恢复SQL备份
psql -U $DB_USER -d $DB_NAME -f $BACKUP_FILE

综合恢复脚本(带验证和日志)

#!/bin/bash
# auto_restore.sh
# 配置参数
DB_TYPE="mysql"  # mysql 或 postgresql
DB_USER="backup_user"
DB_PASS="backup_pass"
DB_HOST="localhost"
DB_NAME="production_db"
BACKUP_DIR="/data/backups"
LOG_FILE="/var/log/restore.log"
# 日志函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# 查找最新的备份文件
LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.sql 2>/dev/null | head -1)
if [ -z "$LATEST_BACKUP" ]; then
    LATEST_BACKUP=$(ls -t $BACKUP_DIR/*.dump 2>/dev/null | head -1)
fi
if [ -z "$LATEST_BACKUP" ]; then
    log "错误: 未找到备份文件"
    exit 1
fi
log "开始恢复数据库 - 使用备份文件: $LATEST_BACKUP"
# 检查文件大小
FILE_SIZE=$(stat -c%s "$LATEST_BACKUP" 2>/dev/null || stat -f%z "$LATEST_BACKUP")
if [ "$FILE_SIZE" -eq 0 ]; then
    log "错误: 备份文件为空"
    exit 1
fi
# 执行恢复
case $DB_TYPE in
    "mysql")
        mysql -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME < $LATEST_BACKUP
        ;;
    "postgresql")
        pg_restore -U $DB_USER -h $DB_HOST -d $DB_NAME -v $LATEST_BACKUP
        ;;
    *)
        log "错误: 不支持的数据库类型"
        exit 1
        ;;
esac
# 检查恢复结果
if [ $? -eq 0 ]; then
    log "数据库恢复成功完成"
    # 验证恢复
    log "开始验证数据库..."
    case $DB_TYPE in
        "mysql")
            mysql -u$DB_USER -p$DB_PASS -h$DB_HOST $DB_NAME -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='$DB_NAME';"
            ;;
        "postgresql")
            psql -U $DB_USER -h $DB_HOST -d $DB_NAME -c "\dt"
            ;;
    esac
else
    log "数据库恢复失败"
    exit 1
fi

自动化恢复脚本(带时间点选择)

#!/bin/bash
# automated_restore.sh
# 配置
BACKUP_DIR="/data/backups"
RETENTION_DAYS=7
# 恢复指定日期的备份
restore_specific_date() {
    local date=$1
    local backup_file="${BACKUP_DIR}/backup_${date}.sql"
    if [ -f "$backup_file" ]; then
        echo "正在恢复 $date 的备份..."
        mysql -u root -p'password' database_name < $backup_file
    else
        echo "未找到 $date 的备份文件"
        exit 1
    fi
}
# 恢复最新的备份
restore_latest() {
    local latest=$(ls -t $BACKUP_DIR/*.sql | head -1)
    if [ -n "$latest" ]; then
        echo "正在恢复最新的备份: $latest"
        mysql -u root -p'password' database_name < $latest
    fi
}
# 交互式菜单
echo "选择恢复方式:"
echo "1. 恢复最新备份"
echo "2. 恢复指定日期备份"
echo "3. 列出所有可用备份"
read -p "请选择 (1-3): " choice
case $choice in
    1) restore_latest ;;
    2) 
        read -p "输入日期 (YYYYMMDD): " date
        restore_specific_date $date
        ;;
    3) ls -lh $BACKUP_DIR/*.sql ;;
    *) echo "无效选择" ;;
esac

定时自动恢复脚本(Crontab)

# 创建恢复脚本
cat > /usr/local/bin/auto_restore.sh << 'EOF'
#!/bin/bash
# 配置
BACKUP_DIR="/data/backups"
DB_USER="root"
DB_PASS="password"
DB_NAME="database"
# 获取当天备份
BACKUP_FILE="$BACKUP_DIR/daily_backup_$(date +%Y%m%d).sql"
if [ -f "$BACKUP_FILE" ]; then
    mysql -u$DB_USER -p$DB_PASS $DB_NAME < $BACKUP_FILE
    echo "自动恢复完成: $(date)" >> /var/log/auto_restore.log
fi
EOF
# 设置定时任务
# 每天凌晨3点执行恢复
# crontab -e
# 0 3 * * * /usr/local/bin/auto_restore.sh

安全注意事项

密码安全处理

#!/bin/bash
# 使用配置文件
# 创建配置文件 /etc/mysql_backup.conf
# [client]
# user=root
# password=your_password
# host=localhost
# 恢复脚本
mysql --defaults-file=/etc/mysql_backup.conf database_name < backup.sql
# 或者使用环境变量
export MYSQL_PWD="your_password"
mysql -u root database_name < backup.sql

恢复前备份

#!/bin/bash
# 恢复前先备份当前数据库
pre_restore_backup() {
    echo "正在备份当前数据库..."
    mysqldump -u root -p'password' database_name > /tmp/pre_restore_backup_$(date +%Y%m%d_%H%M%S).sql
}

完整生产级示例

#!/bin/bash
# production_restore.sh
# 配置
DB_HOST="production-db.example.com"
DB_PORT=3306
DB_USER="admin"
DB_PASS="$(cat /etc/db_pass.txt)"  # 从文件读取密码
DB_NAME="production_db"
BACKUP_SOURCE="/backup/production"
LOG_FILE="/var/log/db_restore.log"
# 错误处理
set -e
trap 'log "脚本执行失败,行号: $LINENO"' ERR
# 函数
log() {
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] $*" | tee -a "$LOG_FILE"
}
# 主程序
main() {
    log "开始恢复流程"
    # 验证环境
    which mysql || { log "MySQL客户端未安装"; exit 1; }
    # 验证备份文件
    local backup_file="$BACKUP_SOURCE/$(date +%Y%m%d)_full_backup.sql"
    if [ ! -f "$backup_file" ]; then
        log "备份文件不存在: $backup_file"
        exit 1
    fi
    # 验证文件完整性
    local checksum=$(md5sum "$backup_file" | cut -d' ' -f1)
    local expected=$(cat "${backup_file}.md5" | cut -d' ' -f1)
    if [ "$checksum" != "$expected" ]; then
        log "校验和验证失败"
        exit 1
    fi
    # 进行恢复
    log "恢复数据库 $DB_NAME..."
    mysql -h$DB_HOST -P$DB_PORT -u$DB_USER -p$DB_PASS $DB_NAME < $backup_file
    if [ $? -eq 0 ]; then
        log "数据库恢复成功"
        # 发送通知
        curl -X POST -H "Content-Type: application/json" \
            -d '{"text":"数据库恢复成功: '$DB_NAME'"}' \
            https://hooks.slack.com/services/YOUR/WEBHOOK/URL
    else
        log "数据库恢复失败"
        exit 1
    fi
}
main "$@"

使用建议

  1. 测试恢复流程:定期在测试环境验证备份
  2. 监控恢复过程:添加日志和告警机制
  3. 版本控制:保存脚本到版本控制系统
  4. 权限管理:限制脚本的访问权限
  5. 文档化:记录恢复流程和注意事项

这些脚本可以根据您的具体需求进行调整和扩展,建议先在测试环境中验证后再用于生产环境。

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