本文目录导读:

我将为您介绍几种常用的数据库备份恢复脚本方法。
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 "$@"
使用建议
- 测试恢复流程:定期在测试环境验证备份
- 监控恢复过程:添加日志和告警机制
- 版本控制:保存脚本到版本控制系统
- 权限管理:限制脚本的访问权限
- 文档化:记录恢复流程和注意事项
这些脚本可以根据您的具体需求进行调整和扩展,建议先在测试环境中验证后再用于生产环境。