数据库定期备份是在维护当中必不可少的,安全的备份数据库也非常重要,我们在日常维护中写自动脚本每天晚上让系统自动备份数据库,然后通过我们的中心服务器去拉取备份的数据文件,具体做法如下
写一个数据库备份脚本,同时支持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加密
# 要备份的数据库列表,空格分隔(留空表示备份所有数据库)
DATAba
# 函数区 ==============================================
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_databa
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 "$DATAba
# 备份所有数据库
DATAba
fi
for db in $DATAba
backup_databa
done
clean_old_backups
log "====== MySQL备份任务完成 ======\n"
解密
openssl enc -d -aes-256-cbc -in db22_txborui20250817.sql.aes -out databa
注意openssl加解密的时候注意版本问题