数据库备份脚本怎写?

wen 实用脚本 74

本文目录导读:

数据库备份脚本怎写?

  1. MySQL 备份脚本
  2. PostgreSQL 备份脚本
  3. MongoDB 备份脚本
  4. 通用备份管理脚本
  5. 配置文件示例(/etc/db_backup.conf)
  6. 定时任务配置(Crontab)
  7. 使用建议

我来介绍几种常见数据库的备份脚本写法。

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

使用建议

  1. 安全考虑

    • 不要在脚本中硬编码密码,使用环境变量或配置文件
    • 配置文件设置600权限(chmod 600 /etc/db_backup.conf
    • 备份文件存储到安全位置
  2. 备份策略

    • 定期测试备份还原
    • 实施异地备份
    • 根据数据重要性设置保留策略
  3. 监控告警

    • 监控备份执行状态
    • 设置备份失败通知
    • 监控磁盘空间使用
  4. 优化建议

    • 大数据库考虑使用增量备份
    • 备份时考虑服务器负载
    • 使用压缩节省存储空间

这些脚本可以根据实际需求进行调整和扩展,记得根据你的具体数据库版本和配置修改相关参数。

抱歉,评论功能暂时关闭!