数据库自动备份方案-更新版
一、整体架构
系统由两部分组成:
1. 生产服务器
负责:
- 定时执行数据库备份;
- 根据数据库列表自动生成备份任务;
- 保存数据库备份文件;
- 记录备份执行日志。
目录结构:
/backup/app
├── mysqldata # 数据库备份文件
└── logs # 备份日志2. 备份服务器
负责:
- 定时从生产服务器获取备份文件;
- 保存历史备份数据;
- 记录同步过程日志。
目录结构:
/backup/app
├── data # 同步后的备份文件
└── logs # 同步日志二、生产服务器数据库备份
备份脚本功能
备份脚本主要实现:
- 自动获取数据库列表;
- 排除系统数据库;
- 每个业务数据库单独备份;
- 使用 gzip 压缩;
- 记录成功、失败状态;
- 自动清理过期备份。
备份文件示例:
数据库名称_日期时间.sql.gz例如:
business_2026-08-11_01-00.sql.gz备份脚本示例
#!/bin/bash
DATE=$(date +%F_%H-%M)
BACKUP_DIR="/backup/app/mysqldata"
LOG_DIR="/backup/app/logs"
LOG_FILE="$LOG_DIR/mysql_backup.log"
DB_USER="数据库账号"
DB_PASS="数据库密码"
mkdir -p "$BACKUP_DIR"
mkdir -p "$LOG_DIR"
echo "==============================" >> "$LOG_FILE"
echo "$(date '+%F %T') Backup Start" >> "$LOG_FILE"
DATABASES=$(mysql \
-u"$DB_USER" \
-p"$DB_PASS" \
-N \
-e "SHOW DATABASES;" \
| grep -Ev "information_schema|performance_schema|mysql|sys")
for DB in $DATABASES
do
FILE="${BACKUP_DIR}/${DB}_${DATE}.sql.gz"
echo "$(date '+%F %T') Start $DB" >> "$LOG_FILE"
mysqldump \
-u"$DB_USER" \
-p"$DB_PASS" \
--single-transaction \
--routines \
--triggers \
--events \
"$DB" \
| gzip > "$FILE"
if [ $? -eq 0 ]
then
SIZE=$(du -h "$FILE" | awk '{print $1}')
echo "$(date '+%F %T') $DB Success Size=$SIZE" >> "$LOG_FILE"
else
echo "$(date '+%F %T') $DB Failed" >> "$LOG_FILE"
rm -f "$FILE"
fi
done
find "$BACKUP_DIR" \
-type f \
-name "*.sql.gz" \
-mtime +7 \
-delete
echo "$(date '+%F %T') Backup Finish" >> "$LOG_FILE"三、备份服务器同步
同步方式
采用 rsync 增量同步:
生产服务器
|
|
↓
rsync同步
|
↓
备份服务器优势:
- 只传输变化文件;
- 节省网络资源;
- 支持断点续传;
- 保留文件属性。
同步脚本示例
#!/bin/bash
SOURCE="远程服务器:/backup/app/mysqldata/"
TARGET="/backup/app/data"
LOG="/backup/app/logs/rsync.log"
echo "==============================" >> $LOG
echo "$(date '+%F %T') Sync Start" >> $LOG
rsync \
-avz \
--delete \
$SOURCE \
$TARGET \
>> $LOG 2>&1
if [ $? -eq 0 ]
then
echo "$(date '+%F %T') Sync Success" >> $LOG
else
echo "$(date '+%F %T') Sync Failed" >> $LOG
fi四、定时任务
生产服务器
每天凌晨执行数据库备份:
0 1 * * * /usr/local/bin/mysql_backup.sh意思:每天凌晨1点备份
备份服务器
每天凌晨执行同步:
30 1 * * * /usr/local/bin/backup_sync.sh每天凌晨1点半同步
五、日志管理
日志统一保存:
/backup/app/logs包含:
数据库备份日志
mysql_backup.log记录:
- 开始时间;
- 数据库名称;
- 成功状态;
- 备份大小;
- 异常信息。
同步日志
rsync.log记录:
- 同步时间;
- 文件变化;
- 同步结果。
六、安全建议
- 使用 SSH 密钥认证进行服务器同步;
- 避免脚本中明文保存数据库密码;
- 限制备份账号权限;
- 定期检查备份文件完整性;
- 定期进行恢复测试,确保备份可用。