在开始技术实施前,必须明确备份策略。档案管理系统通常包含结构化数据(数据库)和非结构化数据(文件存储),两者需要不同的备份方法。
完整备份+增量备份组合是最佳实践。每周日执行完整备份,工作日执行增量备份,既保证恢复速度又节省存储空间。
备份保留策略:完整备份保留4周,增量备份保留7天。重要节点(如月末、季度末)备份永久归档到独立存储。
采用3-2-1原则:至少3份副本,2种不同介质,1份异地存储。具体配置:
以MySQL数据库为例,PostgreSQL等其他数据库原理相同。
使用Percona XtraBackup实现热备份,不影响业务运行:
Ubuntu/Debian系统
wget https://repo.percona.com/apt/percona-release_latest.$(lsb_release -sc)_all.deb
sudo dpkg -i percona-release_latest.$(lsb_release -sc)_all.deb
sudo apt-get update
sudo apt-get install percona-xtrabackup-80
CentOS/RHEL系统
sudo yum install https://repo.percona.com/yum/percona-release-latest.noarch.rpm
sudo yum install percona-xtrabackup-80
创建备份目录并设置权限:
sudo mkdir -p /backup/mysql/{full,incr}
sudo chown -R mysql:mysql /backup/mysql
创建完整备份脚本/usr/local/bin/mysql_full_backup.sh:
!/bin/bash
BACKUP_DIR="/backup/mysql/full"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"
echo "[$(date)] 开始完整备份" >> $LOG_FILE
执行完整备份
xtrabackup --backup \
--target-dir=$BACKUP_DIR/$DATE \
--user=backupuser \
--password='YourStrongPassword123!' \
--compress \
--compress-threads=4
if [ $? -eq 0 ]; then
echo "[$(date)] 完整备份完成: $BACKUP_DIR/$DATE" >> $LOG_FILE
清理30天前的备份
find $BACKUP_DIR -type d -mtime +30 -exec rm -rf {} \;
else
echo "[$(date)] 备份失败" >> $LOG_FILE
exit 1
fi
创建增量备份脚本/usr/local/bin/mysql_incr_backup.sh:
!/bin/bash
FULL_BACKUP_DIR="/backup/mysql/full"
INCR_BACKUP_DIR="/backup/mysql/incr"
DATE=$(date +%Y%m%d_%H%M%S)
LOG_FILE="/var/log/mysql_backup.log"
查找最新的完整备份
LATEST_FULL=$(ls -td $FULL_BACKUP_DIR// | head -1)
if [ -z "$LATEST_FULL" ]; then
echo "[$(date)] 未找到完整备份,请先执行完整备份" >> $LOG_FILE
exit 1
fi
查找最新的增量备份
LATEST_INCR=$(ls -td $INCR_BACKUP_DIR// 2>/dev/null | head -1)
echo "[$(date)] 开始增量备份" >> $LOG_FILE
if [ -z "$LATEST_INCR" ]; then
基于完整备份的第一次增量
xtrabackup --backup \
--target-dir=$INCR_BACKUP_DIR/$DATE \
--incremental-basedir=$LATEST_FULL \
--user=backupuser \
--password='YourStrongPassword123!' \
--compress \
--compress-threads=2
else
基于上次增量备份
xtrabackup --backup \
--target-dir=$INCR_BACKUP_DIR/$DATE \
--incremental-basedir=$LATEST_INCR \
--user=backupuser \
--password='YourStrongPassword123!' \
--compress \
--compress-threads=2
fi
if [ $? -eq 0 ]; then
echo "[$(date)] 增量备份完成: $INCR_BACKUP_DIR/$DATE" >> $LOG_FILE
清理7天前的增量备份
find $INCR_BACKUP_DIR -type d -mtime +7 -exec rm -rf {} \;
else
echo "[$(date)] 增量备份失败" >> $LOG_FILE
exit 1
fi
设置脚本权限:
sudo chmod +x /usr/local/bin/mysql_.sh
sudo chown root:root /usr/local/bin/mysql_.sh
在MySQL中创建专用备份账户:
mysql> CREATE USER 'backupuser'@'localhost' IDENTIFIED BY 'YourStrongPassword123!';
mysql> GRANT RELOAD, LOCK TABLES, PROCESS, REPLICATION CLIENT ON . TO 'backupuser'@'localhost';
mysql> GRANT SELECT ON performance_schema. TO 'backupuser'@'localhost';
mysql> FLUSH PRIVILEGES;
档案系统的文件通常存储在/var/archive或类似目录。
创建文件备份脚本/usr/local/bin/file_backup.sh:
!/bin/bash
SOURCE_DIR="/var/archive"
BACKUP_DIR="/backup/files"
DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/file_backup.log"
echo "[$(date)] 开始文件备份" >> $LOG_FILE
创建当日备份目录
mkdir -p $BACKUP_DIR/$DATE
使用rsync进行增量备份
rsync -av --delete \
--link-dest=$BACKUP_DIR/$(ls -td $BACKUP_DIR// 2>/dev/null | head -1 | xargs basename 2>/dev/null) \
$SOURCE_DIR/ $BACKUP_DIR/$DATE/ \
--exclude=".tmp" \
--exclude="cache/" \
--exclude="temp/"
if [ $? -eq 0 ]; then
echo "[$(date)] 文件备份完成: $BACKUP_DIR/$DATE" >> $LOG_FILE
保留最近30天备份
find $BACKUP_DIR -maxdepth 1 -type d -mtime +30 -exec rm -rf {} \;
else
echo "[$(date)] 文件备份失败" >> $LOG_FILE
exit 1
fi
sudo chmod +x /usr/local/bin/file_backup.sh
sudo chown root:root /usr/local/bin/file_backup.sh
编辑crontab:

sudo crontab -e
添加以下内容:
每周日凌晨2点执行完整备份
0 2 0 /usr/local/bin/mysql_full_backup.sh
工作日凌晨1点执行增量备份
0 1 1-6 /usr/local/bin/mysql_incr_backup.sh
每日凌晨3点执行文件备份
0 3 /usr/local/bin/file_backup.sh
每周六凌晨4点执行备份验证
0 4 6 /usr/local/bin/verify_backup.sh
创建/usr/local/bin/verify_backup.sh:
!/bin/bash
LOG_FILE="/var/log/backup_verify.log"
BACKUP_DIR="/backup"
echo "[$(date)] 开始备份验证" >> $LOG_FILE
检查备份目录是否存在
if [ ! -d "$BACKUP_DIR" ]; then
echo "[$(date)] 错误: 备份目录不存在" >> $LOG_FILE
exit 1
fi
检查最近24小时内的备份
RECENT_BACKUPS=$(find $BACKUP_DIR -type f -name ".qp" -mtime -1 | wc -l)
if [ $RECENT_BACKUPS -eq 0 ]; then
echo "[$(date)] 警告: 最近24小时无备份文件" >> $LOG_FILE
发送邮件通知(需要配置mailx)
echo "备份系统告警: 最近24小时未检测到备份文件" | mail -s "备份异常告警" admin@yourcompany.com
fi
检查磁盘空间
DISK_USAGE=$(df -h $BACKUP_DIR | awk 'NR==2 {print $5}' | sed 's/%//')
if [ $DISK_USAGE -gt 90 ]; then
echo "[$(date)] 警告: 备份磁盘使用率超过90%" >> $LOG_FILE
echo "备份磁盘空间不足: 使用率${DISK_USAGE}%" | mail -s "磁盘空间告警" admin@yourcompany.com
fi
echo "[$(date)] 备份验证完成" >> $LOG_FILE
安装OSS工具:
wget http://gosspublic.alicdn.com/ossutil/1.7.14/ossutil64
sudo mv ossutil64 /usr/local/bin/ossutil
sudo chmod +x /usr/local/bin/ossutil
配置访问凭证:
ossutil config -e oss-cn-hangzhou.aliyuncs.com -i YOUR_ACCESS_KEY_ID -k YOUR_ACCESS_KEY_SECRET
创建云端同步脚本/usr/local/bin/upload_to_oss.sh:
!/bin/bash
BACKUP_DIR="/backup"
OSS_BUCKET="oss://your-bucket-name/archive-backup/"
DATE=$(date +%Y%m%d)
LOG_FILE="/var/log/oss_upload.log"
echo "[$(date)] 开始上传到OSS" >> $LOG_FILE
上传最近一天的备份
find $BACKUP_DIR -type f -mtime -1 -name ".qp" | while read file; do
ossutil cp "$file" "$OSS_BUCKET$DATE/" --checkpoint-dir=/tmp/oss_checkpoint
done
上传文件备份
if [ -d "/backup/files/$DATE" ]; then
ossutil cp -r "/backup/files/$DATE" "$OSS_BUCKETfiles/$DATE/" --checkpoint-dir=/tmp/oss_checkpoint
fi
echo "[$(date)] OSS上传完成" >> $LOG_FILE
在crontab中添加:
每日凌晨5点上传到云端
0 5 /usr/local/bin/upload_to_oss.sh
停止MySQL服务:
sudo systemctl stop mysql
准备完整备份:
解压备份文件
xtrabackup --decompress --target-dir=/backup/mysql/full/20240101_020000
应用日志
xtrabackup --prepare --target-dir=/backup/mysql/full/20240101_020000
应用增量备份(如有):
应用第一个增量备份
xtrabackup --prepare --target-dir=/backup/mysql/full/20240101_020000 \
--incremental-dir=/backup/mysql/incr/20240102_010000
应用后续增量备份
xtrabackup --prepare --target-dir=/backup/mysql/full/20240101_020000 \
--incremental-dir=/backup/mysql/incr/20240103_010000
恢复数据文件:
清空数据目录
sudo rm -rf /var/lib/mysql/
恢复备份
xtrabackup --copy-back --target-dir=/backup/mysql/full/20240101_020000
设置权限
sudo chown -R mysql:mysql /var/lib/mysql
启动MySQL
sudo systemctl start mysql
从本地备份恢复:
恢复特定日期的文件
rsync -av /backup/files/20240101/ /var/archive/
从云端恢复
ossutil cp -r oss://your-bucket-name/archive-backup/files/20240101/ /backup/restore/
rsync -av /backup/restore/ /var/archive/
创建/usr/local/bin/backup_monitor.sh:
!/bin/bash
检查备份日志最后更新时间
LAST_BACKUP=$(grep "备份完成" /var/log/mysql_backup.log | tail -1 | cut -d' ' -f1,2)
if [ -z "$LAST_BACKUP" ]; then
echo "ERROR: 未找到备份记录"
exit 1
fi
转换为时间戳
LAST_TS=$(date -d "$LAST_BACKUP" +%s)
NOW_TS=$(date +%s)
DIFF_HOURS=$(( (NOW_TS - LAST_TS) / 3600 ))
if [ $DIFF_HOURS -gt 48 ]; then
echo "CRITICAL: 备份已超过48小时未执行"
exit 2
elif [ $DIFF_HOURS -gt 24 ]; then
echo "WARNING: 备份已超过24小时未执行"
exit 1
else
echo "OK: 备份正常运行"
exit 0
fi
对于Zabbix监控,创建监控项:
UserParameter=backup.status[],/usr/local/bin/backup_monitor.sh $1
对于Prometheus,创建exporter:
!/usr/bin/env python3
from prometheus_client import start_http_server, Gauge
import subprocess
import time
backup_status = Gauge('backup_last_success_hours', 'Hours since last successful backup')
def check_backup():
result = subprocess.run(['/usr/local/bin/backup_monitor.sh'],
capture_output=True, text=True)
解析输出并设置指标值
... 具体解析逻辑
if __name__ == '__main__':
start_http_server(8000)
while True:
check_backup()
time.sleep(300)
按照以上步骤配置完成后,档案管理系统的备份将完全自动化运行。每月进行一次恢复演练,验证备份有效性,确保在真正需要时能够快速恢复业务数据。