本文目录导读:

数据库备份脚本
MySQL备份示例
#!/bin/bash
# 数据库备份脚本
# 配置
DB_USER="root"
DB_PASS="password"
DB_NAME="mydb"
BACKUP_DIR="/backup/mysql"
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/${DB_NAME}_${DATE}.sql"
# 创建备份目录
mkdir -p $BACKUP_DIR
# 执行备份
mysqldump -u$DB_USER -p$DB_PASS $DB_NAME > $BACKUP_FILE
# 压缩备份
gzip $BACKUP_FILE
# 保留最近7天的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "备份完成: ${BACKUP_FILE}.gz"
PostgreSQL备份
#!/bin/bash
# PostgreSQL备份
PG_USER="postgres"
PG_DB="mydb"
BACKUP_DIR="/backup/postgres"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份
pg_dump -U $PG_USER $PG_DB > ${BACKUP_DIR}/${PG_DB}_${DATE}.sql
# 压缩
gzip ${BACKUP_DIR}/${PG_DB}_${DATE}.sql
文件和目录备份脚本
#!/bin/bash
# 文件系统备份
SOURCE_DIR="/var/www/html"
BACKUP_DIR="/backup/files"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建全量备份
tar -czf ${BACKUP_DIR}/full_backup_${DATE}.tar.gz $SOURCE_DIR
# 或创建增量备份(使用rsync)
rsync -av --delete $SOURCE_DIR ${BACKUP_DIR}/incremental_${DATE}/
应用配置备份
#!/usr/bin/env python3
# Python配置备份脚本
import json
import shutil
import os
from datetime import datetime
def backup_config(config_path, backup_dir):
"""备份配置文件"""
timestamp = datetime.now().strftime("%Y%m%d_%H%M%S")
config_name = os.path.basename(config_path)
backup_file = f"{backup_dir}/{config_name}.{timestamp}.bak"
# 复制文件
shutil.copy2(config_path, backup_file)
# 读取并保存JSON格式
with open(config_path, 'r') as f:
config_data = json.load(f)
with open(f"{backup_file}.json", 'w') as f:
json.dump(config_data, f, indent=2)
print(f"配置已备份: {backup_file}")
# 使用示例
backup_config("/etc/app/config.json", "/backup/configs")
版本控制式备份
#!/bin/bash
# Git式备份
BACKUP_DIR="/backup/git_style"
PROJECT_DIR="/var/www/project"
DATE=$(date +%Y%m%d)
# 创建快照
cp -r $PROJECT_DIR ${BACKUP_DIR}/snapshot_${DATE}
# 或使用硬链接(节省空间)
cp -rl $PROJECT_DIR ${BACKUP_DIR}/snapshot_${DATE}
自动化备份脚本(含日志)
#!/bin/bash
# 完整的自动化备份脚本
# 配置
BACKUP_ROOT="/backup"
LOG_FILE="/var/log/backup.log"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=30
# 日志函数
log() {
echo "[$(date '+%Y-%m-%d %H:%M:%S')] $1" | tee -a $LOG_FILE
}
# 备份函数
backup_database() {
log "开始备份数据库..."
if mysqldump -u root -p$DB_PASS --all-databases > ${BACKUP_ROOT}/db/all_${DATE}.sql; then
log "数据库备份成功"
else
log "数据库备份失败"
return 1
fi
}
backup_files() {
log "开始备份文件系统..."
if tar -czf ${BACKUP_ROOT}/files/files_${DATE}.tar.gz /etc /var/www; then
log "文件备份成功"
else
log "文件备份失败"
return 1
fi
}
cleanup_old_backups() {
log "清理过期备份..."
find $BACKUP_ROOT -name "*.sql" -mtime +$RETENTION_DAYS -delete
find $BACKUP_ROOT -name "*.tar.gz" -mtime +$RETENTION_DAYS -delete
}
# 主执行流程
main() {
log "开始备份任务"
# 创建备份目录
mkdir -p ${BACKUP_ROOT}/{db,files}
# 执行备份
backup_database
backup_files
# 清理旧备份
cleanup_old_backups
log "备份任务完成"
}
# 执行主函数
main
使用建议
备份策略最佳实践:
- 全量备份:每周一次完整备份
- 增量备份:每天备份变化数据
- 差异备份:定期备份与上次全量备份的差异
创建定时任务(crontab):
# 每天凌晨2点执行备份 0 2 * * * /path/to/backup_script.sh # 每周日凌晨3点执行全量备份 0 3 * * 0 /path/to/full_backup.sh
备份验证脚本:
#!/bin/bash
# 验证备份完整性
verify_backup() {
local backup_file=$1
if [[ $backup_file == *.sql ]]; then
# 验证SQL文件
head -n 5 $backup_file | grep -q "CREATE TABLE" && echo "SQL备份有效"
elif [[ $backup_file == *.tar.gz ]]; then
# 验证tar文件
tar -tzf $backup_file > /dev/null && echo "压缩包有效"
fi
}
选择哪种脚本取决于你的具体需求:
- 数据库场景:使用数据库原生工具
- 文件系统:使用tar/rsync
- 配置更新:使用版本控制或快照
记得定期测试备份恢复过程,确保备份可用!