本文目录导读:

我来给你写一个完整的数据库自动备份脚本,包含多种常见数据库的支持:
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
}
使用说明
- 修改配置:替换脚本中的数据库连接信息
- 添加执行权限:
chmod +x backup_script.sh - 测试运行:手动执行脚本确认无误
- 添加定时任务:使用crontab设置定时执行
- 设置日志轮转:配置logrotate避免日志文件过大
注意事项
- 定期测试备份文件的完整性
- 异地备份建议使用rsync或云存储同步
- 敏感信息建议使用环境变量或加密文件存储
- 备份文件建议定期上传到对象存储(如AWS S3、阿里云OSS)
如果你需要特定数据库的详细备份方案或特殊场景的备份策略,请告诉我具体需求!