本文目录导读:

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