linux服务器上定期自动备份mysql数据库

天远科技  发表于:2025-08-17  分类:PHP相关  阅读(119)  赞同8


数据库定期备份是在维护当中必不可少的,安全的备份数据库也非常重要,我们在日常维护中写自动脚本每天晚上让系统自动备份数据库,然后通过我们的中心服务器去拉取备份的数据文件,具体做法如下

写一个数据库备份脚本,同时支持SSL加密和压缩

vi /root/backup.sh

#!/bin/bash
# MySQL 自动备份脚本
# 功能:全量备份MySQL数据库,保留最近7天备份,自动压缩并记录日志
# 配置区 ==============================================
DB_USER="username"       # MySQL用户名
DB_PASS="123456"       # MySQL密码
DB_HOST="localhost"           # MySQL主机
BACKUP_DIR="/backup"  # 备份存储目录
DAYS_TO_KEEP=7                # 备份保留天数
DATE=$(date +%Y%m%d_%H%M)   # 备份时间格式
LOG_FILE="/var/log/mysqlbackup.log"  # 日志文件
ENCRYPT_PASSWORD="这里填写你的加密码" #SSL加密
# 要备份的数据库列表,空格分隔(留空表示备份所有数据库)
DATAbaseS="这里是你的数据库名,多个用空格分隔"
# 函数区 ==============================================

log() {
    echo "[$(date +'%Y-%m-%d %H:%M:%S')] $1" >> $LOG_FILE
}
check_dir() {
    if [ ! -d "$BACKUP_DIR" ]; then
        mkdir -p "$BACKUP_DIR"
        log "创建备份目录: $BACKUP_DIR"
    fi
}
# 加密压缩函数
encrypt_with_openssl() {
    local input_file=$1
    local output_file="${input_file}.gz"
    local compressed_file="${input_file}.gz"
    local encrypted_file="${compressed_file}.aes"
    gzip -6 "$input_file" && \
    openssl enc -aes-256-cbc -salt -in "$compressed_file" \
        -out "$encrypted_file" \
        -pass pass:"$ENCRYPT_PASSWORD" 2>/dev/null
    if [ $? -eq 0 ]; then
        rm -f "$compressed_file"
        echo "$encrypted_file"
    else
        log "OpenSSL加密失败: $compressed_file"
        exit 1
    fi
}

# 修改备份函数
backup_database() {
    local db_name=$1
    local backup_file="$BACKUP_DIR/${db_name}${DATE}.sql"
    local encrypted_file
    mysqldump -h$DB_HOST -u$DB_USER -p$DB_PASS \
              --single-transaction --routines --triggers $db_name > $backup_file
    if [ $? -eq 0 ]; then
        encrypted_file=$(encrypt_with_openssl "$backup_file")
        log "备份加密成功: $encrypted_file ($(du -h $encrypted_file | awk '{print $1}'))"
    else
        log "备份失败: $db_name"
        rm -f $backup_file
    fi
}
clean_old_backups() {
    log "清理超过${DAYS_TO_KEEP}天的旧备份"
    find $BACKUP_DIR -name "*.sql.gz" -type f -mtime +$DAYS_TO_KEEP -exec rm -f {} \;
}
# 执行区 ==============================================
log "====== MySQL备份任务开始 ======"
check_dir
if [ -z "$DATAbaseS" ]; then
    # 备份所有数据库
    DATAbaseS=$(mysql -h$DB_HOST -u$DB_USER -p$DB_PASS -e "SHOW DATAbaseS;" | grep -Ev "(Database|information_schema|performance_schema|mysql|sys)")
fi
for db in $DATAbaseS; do
    backup_database $db
done
clean_old_backups
log "====== MySQL备份任务完成 ======\n"

解密

openssl enc -d -aes-256-cbc -in db22_txborui20250817.sql.aes -out database1.sql -pass pass:"你上面填写的加密密码"


注意openssl加解密的时候注意版本问题



线

在线联系
点击这里给我发消息
点击这里给我发消息
关注我们