本文目录导读:

我来介绍几种常见数据库的备份脚本写法。
MySQL 备份脚本
基础备份脚本
#!/bin/bash
# MySQL备份脚本
# 配置参数
DB_USER="root"
DB_PASSWORD="your_password"
DB_NAME="your_database"
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_PASSWORD $DB_NAME > $BACKUP_FILE
# 压缩备份文件
gzip $BACKUP_FILE
# 删除7天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +7 -delete
echo "备份完成: ${BACKUP_FILE}.gz"
进阶备份脚本(支持多数据库和远程)
#!/bin/bash
# MySQL高级备份脚本
# 设置环境变量
MYSQL_HOST="localhost"
MYSQL_PORT="3306"
MYSQL_USER="root"
MYSQL_PASSWORD="your_password"
BACKUP_DIR="/backup/mysql"
RETENTION_DAYS=30
# 颜色输出
RED='\033[0;31m'
GREEN='\033[0;32m'
NC='\033[0m'
log() {
echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
error() {
echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')]${NC} $1"
}
# 创建备份目录
mkdir -p $BACKUP_DIR/{daily,weekly,monthly}
# 获取所有数据库
DATABASES=$(mysql -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD -e "SHOW DATABASES;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
for DB in $DATABASES; do
DATE=$(date +%Y%m%d_%H%M%S)
BACKUP_FILE="${BACKUP_DIR}/daily/${DB}_${DATE}.sql"
log "开始备份数据库: $DB"
# 执行备份并压缩
mysqldump -h$MYSQL_HOST -P$MYSQL_PORT -u$MYSQL_USER -p$MYSQL_PASSWORD \
--single-transaction --routines --triggers --events \
$DB | gzip > "${BACKUP_FILE}.gz"
if [ $? -eq 0 ]; then
log "数据库 $DB 备份成功"
else
error "数据库 $DB 备份失败"
fi
done
# 每周日保存到weekly目录
if [ $(date +%u) -eq 7 ]; then
cp $BACKUP_DIR/daily/*.gz $BACKUP_DIR/weekly/
fi
# 每月1号保存到monthly目录
if [ $(date +%d) -eq 1 ]; then
cp $BACKUP_DIR/daily/*.gz $BACKUP_DIR/monthly/
fi
# 清理过期备份
find $BACKUP_DIR/daily -name "*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR/weekly -name "*.sql.gz" -mtime +90 -delete # 保留3个月
find $BACKUP_DIR/monthly -name "*.sql.gz" -mtime +365 -delete # 保留1年
log "所有备份完成"
PostgreSQL 备份脚本
#!/bin/bash
# PostgreSQL备份脚本
PG_HOST="localhost"
PG_PORT="5432"
PG_USER="postgres"
PG_PASSWORD="your_password"
BACKUP_DIR="/backup/postgresql"
DATE=$(date +%Y%m%d_%H%M%S)
# 设置密码
export PGPASSWORD=$PG_PASSWORD
# 创建备份目录
mkdir -p $BACKUP_DIR
# 获取所有数据库(排除系统数据库)
DATABASES=$(psql -h $PG_HOST -p $PG_PORT -U $PG_USER -t -c "SELECT datname FROM pg_database WHERE datistemplate = false;")
for DB in $DATABASES; do
BACKUP_FILE="${BACKUP_DIR}/${DB}_${DATE}.sql"
echo "备份数据库: $DB"
# 使用pg_dump备份
pg_dump -h $PG_HOST -p $PG_PORT -U $PG_USER $DB > $BACKUP_FILE
# 压缩
gzip $BACKUP_FILE
echo "数据库 $DB 备份完成"
done
# 清除密码变量
unset PGPASSWORD
# 删除30天前的备份
find $BACKUP_DIR -name "*.sql.gz" -mtime +30 -delete
echo "所有PostgreSQL备份完成"
MongoDB 备份脚本
#!/bin/bash
# MongoDB备份脚本
MONGO_HOST="localhost"
MONGO_PORT="27017"
MONGO_USER="admin"
MONGO_PASSWORD="your_password"
BACKUP_DIR="/backup/mongodb"
DATE=$(date +%Y%m%d_%H%M%S)
# 创建备份目录
mkdir -p $BACKUP_DIR
# 使用mongodump备份
mongodump \
--host $MONGO_HOST \
--port $MONGO_PORT \
--username $MONGO_USER \
--password $MONGO_PASSWORD \
--authenticationDatabase admin \
--out "${BACKUP_DIR}/mongodb_${DATE}"
# 压缩备份目录
tar -czf "${BACKUP_DIR}/mongodb_${DATE}.tar.gz" -C $BACKUP_DIR "mongodb_${DATE}"
# 删除原始目录
rm -rf "${BACKUP_DIR}/mongodb_${DATE}"
# 删除7天前的备份
find $BACKUP_DIR -name "*.tar.gz" -mtime +7 -delete
echo "MongoDB备份完成"
通用备份管理脚本
#!/bin/bash
# 数据库备份管理器
# 支持 MySQL, PostgreSQL, MongoDB
# 配置文件
CONFIG_FILE="/etc/db_backup.conf"
# 加载配置
if [ -f "$CONFIG_FILE" ]; then
source $CONFIG_FILE
else
echo "配置文件不存在: $CONFIG_FILE"
exit 1
fi
# 发送通知
send_notification() {
local status=$1
local message=$2
# 可以集成邮件、Slack、钉钉等通知
echo "[$(date)] $status: $message" >> /var/log/db_backup.log
# 发送邮件(示例)
# echo "$message" | mail -s "数据库备份 $status" admin@example.com
}
# 备份函数
backup_database() {
local db_type=$1
case $db_type in
mysql)
# 执行MySQL备份
./mysql_backup.sh
;;
postgresql)
# 执行PostgreSQL备份
./postgresql_backup.sh
;;
mongodb)
# 执行MongoDB备份
./mongodb_backup.sh
;;
*)
echo "不支持的数据库类型: $db_type"
return 1
;;
esac
if [ $? -eq 0 ]; then
send_notification "SUCCESS" "$db_type 备份完成"
else
send_notification "FAILED" "$db_type 备份失败"
fi
}
# 主程序
echo "开始数据库备份..."
echo "备份数据库类型: $DATABASE_TYPES"
for db_type in $DATABASE_TYPES; do
backup_database $db_type
done
echo "所有备份任务完成"
配置文件示例(/etc/db_backup.conf)
# 数据库备份配置文件 # MySQL配置 MYSQL_HOST="localhost" MYSQL_PORT="3306" MYSQL_USER="backup_user" MYSQL_PASSWORD="backup_password" # PostgreSQL配置 PG_HOST="localhost" PG_PORT="5432" PG_USER="backup_user" PG_PASSWORD="backup_password" # MongoDB配置 MONGO_HOST="localhost" MONGO_PORT="27017" MONGO_USER="backup_user" MONGO_PASSWORD="backup_password" # 通用配置 BACKUP_DIR="/backup" RETENTION_DAYS=30 LOG_FILE="/var/log/db_backup.log" # 需要备份的数据库类型(空格分隔) DATABASE_TYPES="mysql postgresql mongodb" # 通知配置(可选) NOTIFY_EMAIL="admin@example.com" NOTIFY_SLACK_WEBHOOK="https://hooks.slack.com/services/xxx"
定时任务配置(Crontab)
# 编辑crontab crontab -e # 每天凌晨2点执行备份 0 2 * * * /path/to/backup_script.sh # 每天凌晨3点执行MySQL备份 0 3 * * * /path/to/mysql_backup.sh # 每周日凌晨4点执行完全备份 0 4 * * 0 /path/to/full_backup.sh # 每月1号凌晨5点执行月度备份 0 5 1 * * /path/to/monthly_backup.sh
使用建议
-
安全考虑:
- 不要在脚本中硬编码密码,使用环境变量或配置文件
- 配置文件设置600权限(
chmod 600 /etc/db_backup.conf) - 备份文件存储到安全位置
-
备份策略:
- 定期测试备份还原
- 实施异地备份
- 根据数据重要性设置保留策略
-
监控告警:
- 监控备份执行状态
- 设置备份失败通知
- 监控磁盘空间使用
-
优化建议:
- 大数据库考虑使用增量备份
- 备份时考虑服务器负载
- 使用压缩节省存储空间
这些脚本可以根据实际需求进行调整和扩展,记得根据你的具体数据库版本和配置修改相关参数。